完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
ds18b20温度显示程序,4位共阳数码管显示。我想加一个温度高于设定值蜂鸣器响,低于则关闭。但是弄了好久都没成功,求大神看看。
#include #define ui unsigned int #define uc unsigned char //宏定义 ***it DQ =P3^7; //定义DS18B20总线I/O bit bdata fuhao; uc qian,bai,shi,ge; uc code led[] = {0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7}; uc code led_dian[] = {0x7f,0x64,0xbd,0xf5,0xe6,0xf3,0xfb,0x67,0xff,0xf7}; //============================================================================================ //====================================DS18B20================================================= //============================================================================================ /*****延时子程序*****/ void Delay(int num) { while(num--) ; } /*****初始化DS18B20*****/ void Init_DS18B20() { DQ = 1; //DQ复位 Delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay(80); //精确延时,大于480us DQ = 1; //拉高总线 Delay(40); } /*****读一个字节*****/ uc ReadOneChar() { uc i=0; uc dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delay(4); } return(dat); } /*****写一个字节*****/ void WriteOneChar(uc dat) { uc i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay(5); DQ = 1; dat>>=1; } } /*****读取温度*****/ ui ReadTemperature() { ui a=0,b=0,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; if(t&0xf800) { t=~t+1; fuhao=1; } else fuhao=0; tt=t*0.0625; t=tt*10+0.5; //放大10倍输出并四舍五入 return(t); } /*****读取温度*****/ void check_wendu() { ui f; f=ReadTemperature(); //获取温度值并减去DS18B20的温漂误差 qian=f/1000; bai=(f%1000)/100; //计算得到十位数字 shi=((f%1000)%100)/10; //计算得到个位数字 ge=((f%1000)%100)%10; //计算得到小数位 } /*****显示开机初始化等待画面*****/ void Disp_init() { P0 = 0x7f; //显示---- P2 = 0x7f; Delay(100); P2 = 0xdf; Delay(100); P2 = 0xf7; Delay(100); P2 = 0xfd; Delay(100); P2 = 0xff; //关闭显示 } /*****显示温度子程序*****/ void Disp_Temperature() //显示温度 { if(qian==0) { if(fuhao==1) P0=0x7f; //1011 1111 else P0=0xff; P2=0xfd; Delay(10); P2 = 0xff; } else if(qian!=0) { P0 =~led[qian]; P2 = 0xfd; Delay(10); P2 = 0xff; } if((bai==0)&&(qian==0)) { P0=0xff; // P2=0xf7; Delay(10); P2=0xff; } else if((bai==0)&&(qian!=0)) { P0=~led[bai]; P2=0xf7; Delay(10); P2=0xff; } else if(bai!=0) { P0=~led[bai]; // P2=0xf7; Delay(10); P2=0xff; } P0=~led_dian[shi]; // P2=0xdf; Delay(10); P2=0xff; P0=~led[ge]; //显示符号 P2=0x7f; Delay(10); P2=0xff; //关闭显示 } /*****主函数*****/ void main() { uc z; for(z=0;z<100;z++) { Disp_init(); check_wendu(); } while(1) { check_wendu(); for(z=0;z<10;z++) Disp_Temperature(); } } 这是加的蜂鸣器代码,蜂鸣器io口随便定义一个到时。 if(temp>=310) //当温度超过31度(仅作试验用,实际可设为其他更高的值),蜂鸣器便会报警。 { beep=0; } else { beep=1; 怎么加,貌似还要定义,困扰好久,新人初学不久,泪谢了! |
|
相关推荐
6个回答
|
|
早闻此论坛神人多!!!
|
|
|
|
难道都没起床么!
|
|
|
|
多去看一下别人写好的程序慢慢读一下应该就可以解决,建议仿真一下,proteus
|
|
|
|
|
|
|
|
直接把读出的温度和上限温度比较就好了
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
506 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
445 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-网络编程示例之开发板测试
394 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-网络编程示例之网络socket程序编程
883 浏览 0 评论
飞凌嵌入式-ELFBOARD-RGB LCD屏接口的PCB设计要点
889 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11726 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-16 19:16 , Processed in 1.097092 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号