51单片机过零检测检测微量糖水有那些方法?

0-500毫升的蔗糖水,水位变化用51单片机怎么检测?_百度知道
0-500毫升的蔗糖水,水位变化用51单片机怎么检测?
用一个液位传感器,接口接在51单片机上读取出来即可。如有帮助请采纳,或点击右上角的满意,谢谢!!
便宜的传感器精确度如何
精度不是太高,1米的液位传感器精度可达1cm吧!
来自团队:
其他类似问题
为您推荐:
51单片机的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁21ic官方微信
后使用快捷导航没有帐号?
查看: 6767|回复: 61
51单片机4X4矩阵键盘检测。。。为啥不行啊。。求大神
&&已结帖(10)
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
本帖最后由 hunxiyi 于
12:13 编辑
4X4矩阵键盘,四行依次与P3口的0、1、2、3口相连。。
四列依次与4、5、6、7口相连
编写下列程序。。。感觉没有什么问题。。但是烧进板子里,只有0、4、8、c可以显示,其它12个键都没效果、、
想了N天都没办法。。。请大神出马、、、
#include&reg52.h&
#define uchar unsigned char
#define uint unsigned int
sbit weix =&&P2^7;
sbit duanx = P2^6;
uchar code table[] = {0x3f,0x06,0x5b,0x4f,
& && && && && && && && && && && && && & 0x66,0x6d,0x7d,0x07,
& && && && && && && && && && && && && & 0x7f,0x6f,0x77,0x7c,
& && && && && && && && && && && && && & 0x39,0x5e,0x79,0x71
& && && && && && && && && && && && && & };
void init();
void keyscan();
void display();
void delay(uint x);
uchar i,key,k = 88;
void main()
& && &&&init();& && && && && && && && &//初始化
& && &&&while(1)& && && && && &
& && && && && & keyscan();& && && && && && && && &//矩阵键盘扫描
& && && && && & display();& && && && && && && && &//显示
void init()& && && && && && && && && &//初始化
& && &&&weix = 1;
& && &&&P0=0
& && &&&weix = 0;
& && &&&P0 = 0x00;
& && &&&duanx = 1;
& && &&&P0 = 0x00;
& && &&&duanx = 0;
void keyscan()& && && && && && && && & //矩阵键盘扫描
& && &&&uchar i,
& && &&&P3 = 0x0f;
& && &&&if(P3 != 0x0f)& && && && && &&&
& && && && && & delay(10);& && && && && && && && && && &&&//按键是否按下检测延时
& && && && && & if(P3 != 0x0f)& && && && && && &
& && && && && & {
& && && && && && && && &P3 = 0& && && && && && && && &
& && && && && && && && &for(i = 0;i & 4;i++)
& && && && && && && && &{
& && && && && && && && && && &&&key = P3&&& 0x0f;& && && &//屏蔽高四位,只对比检测到的第四位
& && && && && && && && && && &&&switch(key)
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & case 0x0e:k = i + 0;& && && && && && && && && && && && &
& && && && && && && && && && && && && & case 0x0d:k = i + 4;
& && && && && && && && && && && && && & case 0x0b:k = i + 8;
& && && && && && && && && && && && && & case 0x07:k = i + 12;break& && && && && && && && & & && && && && && &
default:k = 88;& &
//经15楼朋友提示,加上这句话,程序就没问题了& && && && && && && && && && &&&}
& && && && && && && && && && &&&P3&&= (P3 &&1) + 1;& && && && && &&&//P3口数据左移一位 再加1
& && && && && && && && && && &&&if(k != 88)& && && && && &&&//在此次for循环中 switch中如果匹配到
& && && && && && && && && && && && && && && && && && &&&//k被重新赋值,则退出for循环
& && && && && && && && &}
& && && && && && && && &P3&&= 0x0f;& && && && && && && && &&&//松手检测
& && && && && && && && &while(P3 != 0x0f)& && && & //未松手则一直在此等待
& && && && && && && && && && &&&;& && && && && && && && && && && & //松手则退出
& && && && && & }
void display()& && && && && && && && && && && &&&//显示
& && &&&duanx = 1;
& && &&&P0 = table[k];
& && &&&duanx = 0;
void delay(uint x)
& && &&&while(x--)
& && && && && & for(j=110;j&0;j--);
满意回复+4
if(k != 88)
//在此次for循环中 switch中如果匹配到
//k被重新赋值,则退出f ...
void scan_key(void)
P3 = 0x0f;
P3 = 0xf0;
if(k == 0xff){
key_delay = 0 ...
问题似乎不在于只能检测到那四个键吧?
本帖子中包含更多资源
才可以下载或查看,没有帐号?
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
期盼大神。。。我实在是无能为力了。。感觉思路很清晰啊
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
我用这个键盘扫描程序替换就可以。。。这是为什么啊。。。这两个道理是一模一样的啊
void matrix_keyscan()
& & & & P3 = 0x0f;
& & & & if(P3 != 0x0f)
& & & & & & & & delay(10);& & & & & & & & & & & & & & & & //键盘是否按下 检测延时
& & & & & & & & if(P3 != 0x0f)
& & & & & & & & {& & & & & & & & & & & &
& & & & & & & & & & & & P3=0xf0;& & & & & & & & //检测高4位,因低4位被拉低
& & & & & & & & & & & &&&switch(P3)& & & & //此时按键被按下,高位必有1位也被拉低
& & & & & & & & & & & &&&{
& & & & & & & & & & & & & & & &&&case 0xe0: key1=0;
& & & & & & & & & & & & & & & &&&case 0xd0: key1=1;
& & & & & & & & & & & & & & & &&&case 0xb0: key1=2;
& & & & & & & & & & & & & & & &&&case 0x70: key1=3;
& & & & & & & & & & & &&&}
& & & & & & & & & & & &&&P3=0x0f;& & & & & & & & //再检测低4位
& & & & & & & & & & & &&&switch(P3)& & & & //为何加0—12可画图理解
& & & & & & & & & & & &&&{
& & & & & & & & & & & & & & & &&&case 0x0E: key=key1+0;
& & & & & & & & & & & & & & & &&&case 0x0D: key=key1+4;
& & & & & & & & & & & & & & & &&&case 0x0B: key=key1+8;
& & & & & & & & & & & & & & & &&&case 0x07: key=key1+12;
& & & & & & & & & & & &&&}
& & & & & & & & & & & & P3 = 0x0f;
& & & & & & & & & & & & while(P3 != 0x0f)& & & & // 松手检测
& & & & & & & & & & & & & & & & ;
& & & & & & & & }
主题帖子积分
技术总监, 积分 38515, 距离下一级还需 11485 积分
技术总监, 积分 38515, 距离下一级还需 11485 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 38515, 距离下一级还需 11485 积分
技术总监, 积分 38515, 距离下一级还需 11485 积分
void scan_key(void)
& & & & U8 x,k;
& & & & P3 = 0x0f;
& & & & x = P3;
& & & & P3 = 0xf0;
& & & & k = P3;
& & & & k = x +
& & & & if(k == 0xff){
& & & & & & & & key_delay = 0;
& & & & & & & &
& & & & if((key_delay & 100) && (++key_delay == 3)){
& & & & & & & & key_number =& & & & & & & & // 此处设置断点,用于记录按键号
间隔5~100MS调用即可,在 “key_number =”处设置断点,按下按键记录按键号,按键号等于k值。
主题帖子积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
主题帖子积分
专家等级:结帖率:89%打赏:0.00受赏:32.00
主题帖子积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
& && && && && && && && && && && && && && && && && && &&&//k被重新赋值,则退出for循环
& && && && && && && && &}
& && && && && && && && &temp = 0x0f;& && && && && && && && &&&//松手检测
//这里的temp被赋值,下面的while表达式括号内的条件就一直为False,temp不会自动同步P3的
& && && && && && && && &while(temp != 0x0f)& && && & //未松手则一直在此等待
& && && && && && && && && && &&&;& && && && && && && && && && && & //松手则退出复制代码
问题似乎不在于只能检测到那四个键吧?
生活将我们磨圆,是为了让我们滚得更远。。。
我来到这个世上就没打算活着回去!
主题帖子积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
主题帖子积分
专家等级:结帖率:89%打赏:0.00受赏:32.00
主题帖子积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
两种代码的差异就在于你在前一种代码中设置了一个变量temp,您好好分析一下你的代码流程
生活将我们磨圆,是为了让我们滚得更远。。。
我来到这个世上就没打算活着回去!
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
yirongfu 发表于
两种代码的差异就在于你在前一种代码中设置了一个变量temp,您好好分析一下你的代码流程 ...
早上问老师,他接到个电话有事,急急忙忙的就看了一下说把P3用个变量代替试试。。。所以我才加了temp
之前是没有temp直接用变量p3的。。。仍然是不能正常工作,只能检测到0、4、8、12。。。
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
ayb_ice 发表于
这程序也太简洁了吧。。。。。。好高级。。。可惜没看懂。。。。
主题帖子积分
中级工程师, 积分 3737, 距离下一级还需 1263 积分
中级工程师, 积分 3737, 距离下一级还需 1263 积分
主题帖子积分
专家等级:结帖率:88%
主题帖子积分
中级工程师, 积分 3737, 距离下一级还需 1263 积分
中级工程师, 积分 3737, 距离下一级还需 1263 积分
键扫描要求变输出脚电平读输入脚电平再来判断,可是你在变temp这时输出脚电平会变吗?
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
xuyaqi 发表于
键扫描要求变输出脚电平读输入脚电平再来判断,可是你在变temp这时输出脚电平会变吗? ...
我错了。。这个temp是后来加的。。。之前是直接用P3的。。。仍然是只能检测4个键。。
上面的代码我已经改过来了。。。麻烦你再劳神下
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
把P3改成按位操作可能才行
主题帖子积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
主题帖子积分
专家等级:结帖率:89%打赏:0.00受赏:32.00
主题帖子积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
初级工程师, 积分 2556, 距离下一级还需 444 积分
可能你的思路真的是清晰的,可是你对51单片机的操作看来还比较混沌
1. 像 P3&&= (P3 &&1) + 1; 这样的操作是在直接操作IO口的输入输出寄存器,而你的P3口一半是输入一半是输出,假设某个输入口被外部按键动作拉到地,你又同时给该口输出高电平,这个电气上比较危险。所以,建议输入口就是输入,输出口就是输出,不要变来变去,51跟其他单片机不一样,你往Port写数据,就直接变成输出并反映到引脚电平,不需要另外设置为输入或输出方向。回头来说,你这句的本意是前面赋的扫描初值的移位,但运行到这一步,左移符号前的P3实际是去读取口的当前状态,而不是原来的那个定值了(P3 = 0xef以及你所设想的移位后的值)。你的老师让你加个中间变量,估计他也是初步发现了这里的问题,所以,建议你在这里再自己细细分析一下,用单步调试跟踪一下应该能很快找到问题,也能让你更好地掌握。
2. 1楼和3楼的代码要实现的按键布局我理解是不一样的,好像硬件原理也不尽相同。楼主你要实现的是矩阵扫描16键,3楼是简单按键扫描,或者说是IO口扫描,仅8键。所以,不要被3楼的代码所牵引。如果实在没理解透按键扫描的原理,建议你就直接找些4×4的C代码贴过来改造一下,网上很多的。
3. 提问应该描述尽量详细些,比如哪几个口作为输入哪几个口作为输出(行和列都可以作为输入或输出),你的设计思路,同时最好把接口的电路贴上来,详细的描述可以节省大家的时间,也能尽快帮你找到问题。
以上意见仅供参考,希望对你有用。
很耐心的讲解 赞一个
生活将我们磨圆,是为了让我们滚得更远。。。
我来到这个世上就没打算活着回去!
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
pc1969 发表于
把P3改成按位操作可能才行
麻烦讲清楚点啊。。。。。我是菜鸟。。。。
主题帖子积分
技术总监, 积分 38515, 距离下一级还需 11485 积分
技术总监, 积分 38515, 距离下一级还需 11485 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 38515, 距离下一级还需 11485 积分
技术总监, 积分 38515, 距离下一级还需 11485 积分
hunxiyi 发表于
这程序也太简洁了吧。。。。。。好高级。。。可惜没看懂。。。。
typedef unsigned char U8;
主题帖子积分
资深工程师, 积分 10159, 距离下一级还需 9841 积分
资深工程师, 积分 10159, 距离下一级还需 9841 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
资深工程师, 积分 10159, 距离下一级还需 9841 积分
资深工程师, 积分 10159, 距离下一级还需 9841 积分
if(k != 88)& && && && && &&&//在此次for循环中 switch中如果匹配到
& && && && && && && && && && && && && && && && && && &&&//k被重新赋值,则退出for循环
问题在这儿,至于为什么,其实你用笔在纸上按程序执行顺序,写下各个变量的值,就清楚了,不知道是没掌握这个方法还是懒,如果养成用纸笔模拟程序运行的习惯,很多问题都会发现,不需要仿真器,也不需要问别人,熟练了速度还不慢
深说一点,你的按键扫描程序中的循环每次只执行了一次就结束了,至于为什么,还是自己发现吧
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
扫描键盘时,分别置位P3.0,P3.!,P3.2,P3.3,然后再检测P3.4,P3.5,P3.6,P3.7
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
本帖最后由 hunxiyi 于
10:49 编辑
yirongfu 发表于
可能你的思路真的是清晰的,可是你对51单片机的操作看来还比较混沌
1. 像 P3&&= (P3&&...
非常感谢你花这么多时间来为我解答,真的很感谢。。。
我确实是刚刚开始学。。感觉这个程序思路是很清晰的,但对于操作是一点头绪都没有
你说的单步调试跟踪,我还不会,现在去百度上学学。。。去
这个程序是我在网上找到的。。。最容易理解的矩阵键盘程序是书上写的,但太长了。。于是上网搜搜简单的。。。&&发现了这个文件里最后一个程序感觉不错。。。于是按照我的这个线路加以改动
3楼那个也是我在网上看见的,稍微改一下确实可以运行。。。0——15都可以正常检测,你说的仅8键不太懂什么意思。。。
最后,这个帖子是第一次在这论坛发帖。。。不足之处你已指出,已经做出了一些修改。。以后绝对不会再犯!谢谢。。
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
pc1969 发表于
扫描键盘时,分别置位P3.0,P3.!,P3.2,P3.3,然后再检测P3.4,P3.5,P3.6,P3.7
那你的意思就是3楼那代码。。。对吧?
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
hunxiyi 发表于
那你的意思就是3楼那代码。。。对吧?
直接用汇编写,直观又容易理解
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
pc1969 发表于
直接用汇编写,直观又容易理解
汇编不会;。。。。。比C难多了、、
技术新星奖章
人才类勋章
时间类勋章
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
欢快之小溪
发帖类勋章
技术导师奖章
人才类勋章
精华达人奖章
等级类勋章
时间类勋章
湍急之河流
发帖类勋章
突出贡献奖章
等级类勋章
热门推荐 /151单片机 先后顺序判断 程序编写问题_百度知道
51单片机 先后顺序判断 程序编写问题
比如三个水位电极,接到三个单片机1O口,有水单片机口为0,没有水为1.现在必须是低水位,低水位然后中水位,低水位然后中水位再然后高水位,这三种才是正确的。如果先是中再是低,蜂鸣器报警。如果先是低再是高,蜂鸣器报警。反正水位必须按照顺序低中高这样才正确。请问这样的编程思路该如何实现呢?求大神讲解!
提问者采纳
两个状态寄存器,一个保存上一状态StatusLast,一个记录当前状态StatusCif((StatusLast==Middle&&StatusCurrent==Low)||(StatusLast==Low&&StatusCurrent==High)){报警}
提问者评价
其他类似问题
为您推荐:
其他1条回答
先画出程序流程图,再编程序。三个检测端,把它们的状态组合起来,建立一个表格,分别对应不同的系统状态,然后判断这个状态,再处理报警或不报警。
51单片机的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁AT89S51单片机C语言程序范例_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
AT89S51单片机C语言程序范例
A​T9​S1​单​片​机​C​语​言​程​序​范​例​,​找​了​这​么​久​,​感​觉​就​这​份​最​好​!
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢给出以AT89C51单片机为核心器件的水塔水位检测控制系统仿真设计,实现水位的检测控制、处理和报警等功能1、设计一自动水位控制器,使其具有均匀水流流出。当水位降到一定程度时开始注水;2、当水位升到一定水位时,停止注水,开始放水,要求给出信号。
给出以AT89C51单片机为核心器件的水塔水位检测控制系统仿真设计,实现水位的检测控制、处理和报警等功能1、设计一自动水位控制器,使其具有均匀水流流出。当水位降到一定程度时开始注水;2、当水位升到一定水位时,停止注水,开始放水,要求给出信号。
不区分大小写匿名
水塔水位检测控制系统:我这可以做的。需要液位传感器和电龙阀门。
AT89C51单片机为核心器件的水塔水位检测控制系统仿真设计&我们有完整的
免杀还是乌龙寺论坛做得好智障大师1433?vc2008 snzzkz net 穿盾 复活 杀不死
问下你内存是多大的,
如果内存小,玩游戏占满,游戏还是会卡,
显卡500左右的就可以满足,
详细解答,加群吧
【请及时采纳我私密你】
相关知识等待您来回答
编程领域专家
& &SOGOU - 京ICP证050897号}

我要回帖

更多关于 单片机电流检测电路 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信