完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
LED正确仿真流程是:
1.开机运行,led显示“- - - - ”。 2.而后程序初始化后通过调节DS18B20温度传感器的数值,数码管会显示相应的数值。在设置系统报警温度上下限时,按下按键S1,数码管会显示“H38C”(系统程序默认上限为38℃),此时进入温度上限设置模式,可通过调节S2和S3分别增加和减小数码管上显示的数字。 3.接着再次按下键S1,数码管会显示“L05C”(系统默认下限为5℃),此时进入温度下限设置模式,可通过调节S2和S3分别增加和减小数码管上显示的数字。 4.当温度超过设置的上下限时,系统会进行声光报警,蜂鸣器会发出“滴……滴……滴”蜂鸣声,同时LED灯会闪烁。 5.当系统未检测的到DS18B20温度传感器或运行错误时,数码管会显示错误的数字“8.8.8.8” 现在问题就是仿真结果是:刚开机,led显示“- - - - ”,经过1s左右即显示“8.8.8.8“,之后的仿真就没办法实现了。 经过测试,可以排除硬件问题。 但是在c程序里看了好久找不到哪里有问题昂,还请大神帮帮忙,哪里有问题。万分感谢~~~ 仿真图: C语言程序: /****************************************************************** 程序名称:DS18B20温度测量、报警系统 简要说明:DS18B20温度计,温度测量范围0~99.9摄氏度 可设置上限报警温度、下限报警温度 即高于上限值或者低于下限值时蜂鸣器报警 默认上限报警温度为38℃、默认下限报警温度为5℃ 报警值可设置范围:最低上限报警值等于当前下限报警值 最高下限报警值等于当前上限报警值 将下限报警值调为0时为关闭下限报警功能 ******************************************************************/ #include #include "DS18B20.h" #define uint unsigned int #define uchar unsigned char //宏定义 #define SET P3_1 //定义调整键 #define DEC P3_2 //定义减少键 #define ADD P3_3 //定义增加键 #define BEEP P3_7 //定义蜂鸣器 bit shanshuo_st; //闪烁间隔标志 bit beep_st; //蜂鸣器间隔标志 ***it DIAN = P2^7; //小数点 uchar x=0; //计数器 signed char m; //温度值全局变量 uchar n; //温度值全局变量 uchar set_st=0; //状态标志 signed char shangxian=38; //上限报警温度,默认值为38 signed char xiaxian=5; //下限报警温度,默认值为5 uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; /*****延时子程序*****/ void Delay(uint num) { while( --num ); } /*****初始化定时器0*****/ void Inittimer(void) { TMOD=0x1; TH0=0x3c; TL0=0xb0; //50ms(晶振12M) } /*****定时器0中断服务程序*****/ void timer0(void) interrupt 1 { TH0=0x3c; TL0=0xb0; x++; } /*****外部中断0服务程序*****/ void int0(void) interrupt 0 { EX0=0; //关外部中断0 if(DEC==0&&set_st==1) { shangxian--; if(shangxian else if(DEC==0&&set_st==2) { xiaxian--; if(xiaxian<0)xiaxian=0; } } /*****外部中断1服务程序*****/ void int1(void) interrupt 2 { EX1=0; //关外部中断1 if(ADD==0&&set_st==1) { shangxian++; if(shangxian>99)shangxian=99; } else if(ADD==0&&set_st==2) { xiaxian++; if(xiaxian>shangxian)xiaxian=shangxian; } } /*****读取温度*****/ void check_wendu(void) { uint a,b,c; c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差 a=c/100; //计算得到十位数字 b=c/10-a*10; //计算得到个位数字 m=c/10; //计算得到整数位 n=c-a*100-b*10; //计算得到小数位 if(m<0){m=0;n=0;} //设置温度显示上限 if(m>99){m=99;n=9;} //设置温度显示上限 } /*****显示开机初始化等待画面*****/ Disp_init() { P2 = 0xbf; //显示- P1 = 0xf7; Delay(200); P1 = 0xfb; Delay(200); P1 = 0xfd; Delay(200); P1 = 0xfe; Delay(200); P1 = 0xff; //关闭显示 } /*****显示温度子程序*****/ Disp_Temperature() //显示温度 { P2 =0xc6; //显示C P1 = 0xf7; Delay(300); P2 =LEDData[m]; //显示个位 P1 = 0xfb; Delay(300); P2 =LEDData[m%10]; //显示十位 DIAN = 0; //显示小数点 P1 = 0xfd; Delay(300); P2 =LEDData[m/10]; //显示百位 P1 = 0xfe; Delay(300); P1 = 0xff; //关闭显示 } /*****显示报警温度子程序*****/ Disp_alarm(uchar baojing) { P2 =0xc6; //显示C P1 = 0xf7; Delay(200); P2 =LEDData[baojing%10]; //显示十位 P1 = 0xfb; Delay(200); P2 =LEDData[baojing/10]; //显示百位 P1 = 0xfd; Delay(200); if(set_st==1)P2 =0x89; else if(set_st==2)P2 =0xc7; //上限H、下限L标示 P1 = 0xfe; Delay(200); P1 = 0xff; //关闭显示 } /*****报警子程序*****/ void Alarm() { if(x>=10){beep_st=~beep_st;x=0;} if((m>=shangxian&&beep_st==1)||(m } /*****主函数*****/ void main(void) { uint z; InitTimer(); //初始化定时器 EA=1; //全局中断开关 TR0=1; ET0=1; //开启定时器0 IT0=1; IT1=1; check_wendu(); check_wendu(); for(z=0;z<300;z++) { Disp_init(); } while(1) { if(SET==0) { Delay(2000); do{}while(SET==0); set_st++;x=0;shanshuo_st=1; if(set_st>2)set_st=0; } if(set_st==0) { EX0=0; //关闭外部中断0 EX1=0; //关闭外部中断1 check_wendu(); Disp_Temperature(); Alarm(); //报警检测 } else if(set_st==1) { BEEP=1; //关闭蜂鸣器 EX0=1; //开启外部中断0 EX1=1; //开启外部中断1 if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(shangxian);} } else if(set_st==2) { BEEP=1; //关闭蜂鸣器 EX0=1; //开启外部中断0 EX1=1; //开启外部中断1 if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(xiaxian);} } } } /*****END*****/ DS18B20.h: #include #define DQ P3_6 //定义DS18B20总线I/O /*****延时子程序*****/ void Delay_DS18B20(int num) { while(num--) ; } /*****初始化DS18B20*****/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay_DS18B20(80); //精确延时,大于480us DQ = 1; //拉高总线 Delay_DS18B20(14); x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20); } /*****读一个字节*****/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delay_DS18B20(4); } return(dat); } /*****写一个字节*****/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; } } /*****读取温度*****/ unsigned int ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; //放大10倍输出并四舍五入 return(t); } /*****END*****/ |
|
相关推荐
15个回答
|
|
哈哈哈哈哈哈呵呵
|
|
|
|
你单步调试下,如果可以的话,硬件就是正常的,你再把开机延时时间加个10s,就是这以后才检测温度看看
|
|
|
|
昂,谢谢~成功了,问题又出现了,调节DS1B20,led不会显示是怎么回事昂 |
|
|
|
再具体描述下,问题太笼统了
|
|
|
|
就是调节DS18B20,led显示屏不会显示温度,没有动静,当按下S1按键,又出现8.8.8.8,再按S2或S3按键就没法调温了,一直显示4个8。不知道程序哪里出了问题 |
|
|
|
|
|
|
|
温度显示子程序中的个位 m改为n
|
|
|
|
|
|
|
|
函数没有返回值,可在函数前加void 或加return语句
|
|
|
|
谢谢,但是开始仿真的时候,led显示—.—.—.—,当按S1按键的时候,led在8.8.8.8和H.H.H.H之间来回闪,再按一次S1,led就在8.8.8.8和L.L.L.L之间来回闪了,再按一次S1,led就在8.8.8.8不动了,当调节DS18B20的时候,led不会即时显示温度,没有动静,始终显示8.8.8.8.这个怎么回事昂? |
|
|
|
Disp_alarm函数定义的参数是unsigned char,但是调用时的参数shangxian和xiaxian是signed char.
|
|
|
|
按键用的中断或查询怎么调用的
|
|
|
|
显示错了自己检查
|
|
|
|
明白我意思吗,不要把整个程序拷贝上来,太多不愿看,看程序的逻辑
|
|
|
|
楼主问题解决了吗,求程序学习下
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
195 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
172 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
453 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
697 浏览 2 评论
602 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11983 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 01:59 , Processed in 0.978004 second(s), Total 102, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号