完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
想写一个基于51单片机的DS18B20的测温报警系统,但是蜂鸣器一直不响#include
#include #include #include #define uchar unsigned char #define uint unsigned int sbit dula = P2^6; sbit wela = P2^7; sbit RS = P3^5; sbit LCDEN = P3^4; sbit beep=P2^3; uint tmp; uint warn_l1=270; uint warn_h1=300; void delayUs() { _nop_(); } void delayMs(uint a) { uint i, j; for(i = a; i > 0; i--) for(j = 100; j > 0; j--); } void writeComm(uchar comm) { RS = 0; P0 = comm; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); } //写数据:RS=1, RW=0; void writeData(uchar dat) { RS = 1; P0 = dat; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); } void init() { dula = wela = 0; writeComm(0x38); writeComm(0x0c); writeComm(0x06); writeComm(0x01); } void writeString(uchar * str, uchar length) { uchar i; for(i = 0; i < length; i++) { writeData(str); } } /**//*****************************DS18B20*******************************/ sbit ds = P2^2; void dsInit() { unsigned int i; ds = 0; i = 100; while(i>0) i--; ds = 1; i = 4; while(i>0) i--; } void dsWait() { unsigned int i; while(ds); while(~ds); i = 4; while(i > 0) i--; } bit readBit() { unsigned int i; bit b; ds = 0; i++; ds = 1; i++; i++; b = ds; i = 8; while(i>0) i--; return b; } unsigned char readByte() { unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i<8; i++) { j = readBit(); dat = (j << 7) | (dat >> 1); } return dat; } void writeByte(unsigned char dat) { unsigned int i; unsigned char j; bit b; for(j = 0; j < 8; j++) { b = dat & 0x01; dat >>= 1; if(b) { ds = 0; i++; i++; ds = 1; i = 8; while(i>0) i--; } else { ds = 0; i = 8; while(i>0) i--; ds = 1; i++; i++; } } } void sendChangeCmd() { dsInit(); dsWait(); delayMs(1); writeByte(0xcc); writeByte(0x44); } void sendReadCmd() { dsInit(); dsWait(); delayMs(1); writeByte(0xcc); writeByte(0xbe); } int getTmpValue() { unsigned int tmpvalue; int value; float t; unsigned char low, high; sendReadCmd(); low = readByte(); high = readByte(); tmpvalue = high; tmpvalue <<= 8; tmpvalue |= low; value = tmpvalue; t = value * 0.0625; value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5 return value; } void display(int v) { unsigned char count; unsigned char datas[] = {0, 0, 0, 0, 0}; unsigned int tmp = abs(v); datas[0] = tmp / 10000; datas[1] = tmp % 10000 / 1000; datas[2] = tmp % 1000 / 100; datas[3] = tmp % 100 / 10; datas[4] = tmp % 10; writeComm(0xc0+3); if(v < 0) { writeString("- ", 2); } else { writeString("+ ", 2); } if(datas[0] != 0) { writeData('0'+datas[0]); } for(count = 1; count != 5; count++) { writeData('0'+datas[count]); if(count == 2) { writeData('.'); } } } //蜂鸣器报警 void warn(uint s) { uchar i;i=s; dula=0;wela=0; beep=0; while(i--) { display(getTmpValue()); } beep=1; P1=0XFF; i=s; while(i--) { display(getTmpValue()); } } //温度处理函数 void deal(uint value) { uchar i; if(value<=warn_l1) { beep=0; } else if(value>=warn_h1) { beep=0; } else { i=40; while(i--) { display(getTmpValue()); } } } /**//*****************************DS18B20*******************************/ void main() { uchar table[] = " xianzaiwendu:"; sendChangeCmd(); init(); writeComm(0x80); writeString(table, 16); while(1) { delayMs(1000); //温度转换时间需要750ms以上 writeComm(0xc0); display(getTmpValue()); sendChangeCmd(); } } |
|
相关推荐
2个回答
|
|
蜂鸣器在电路上用什么驱动的,是不是一个IO口,用示波器测一下IO口的状态,看有没有变化 ,或是时间太快了,还没有响就把IO状态改变了
|
|
|
|
本帖最后由 华仔stm32 于 2022-6-8 15:47 编辑
//蜂鸣器报警 void warn(uint s) { uchar i;i=s; dula=0;wela=0; beep=0; while(i--) { display(getTmpValue()); } beep=1; P1=0XFF; i=s; while(i--) { display(getTmpValue()); } } 我看了一下你的这个函数,是亲自写的还是借鉴网上面的。这种有多个任务的,建议你呀,先去看一下“状态机”,你这一个while()阻塞式的等待,运用到实际工程中是很不科学的。 建议你这么做: sta_temp (定义三个状态,0,低温,1、正常,2、高温) sta_beep (0、关闭,1,开启) 然后: H_temp =20度 L_temp = 10度 int temp; get_temp() { temp = getTmpValue() if(temp>H_temp) sta_temp = 2; esle if (temp else sta_temp = 1; } main() { //获取温度 get_temp(); //更新蜂鸣器状态 switch (sta_temp) case 低温: sta_beep = 1 case 正常: sta_beep = 0 case 高温: sta_beep = 1 //显示温度 display(temp) } 要按状态机的思路都写,少用while()去阻塞式的写程序。最好学习一下定义时,达到一定时间,去获取温度,其余时间用来判温度的状态,根据状态来更新蜂鸣器的状态。希望对你有帮助。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12023 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 01:32 , Processed in 0.690142 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号