完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 weizhi689 于 2012-11-8 21:42 编辑
火灾自动报警器 烟雾传感器MQ-2 温度传感器DS18B20 ADC0832 LED显示 硬件已经接好了 主要问题是浓度不显示 温度显示 一接上蜂鸣器就响 程序请大家帮忙看看 STC89C52单片机 11.0592HZ #include #include #define uchar unsigned char #define uint unsigned int ***it DQ=P1^7; // DS18b20 引脚 ***it Do=P1^5; //ADC0832管脚定义 ***it Di=P1^5; ***it clk=P1^4; ***it cs=P2^0; ***it led=P1^0; //报警灯 ***it buzzer=P1^1;// 蜂鸣器 uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; uchar value_DS,value_AD; void delay(uchar x) //延时函数 {while(x--); } //初始化函数 DS18B20 Init_DS18B20() { uchar x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(20); } //读一个字节 uchar ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--){ DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(4); } return(dat); } //写一个字节 void WriteOneChar(uchar dat) { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } } ReadTemperature() { uchar a=0; uchar b=0; uint t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a; tt=t*0.0625; //将温度的高位与低位合并 t= tt*10+0.5; //对结果进行4舍5入 return(t); } //ADC0832 子程序 Init_ADC0832 () //初始化 { clk=0; cs=1; Di=1; } uchar read_ADC0832(uchar SGL,uchar ODD) { uchar i,data1=0,data2=0; Di=1;_nop_();_nop_(); //起始信号 clk=0;_nop_();_nop_(); cs=0;_nop_();_nop_(); clk=1;_nop_();_nop_(); clk=0;_nop_();_nop_(); //第1个下升沿 Do=SGL;_nop_();_nop_(); //通道选择1 clk=1;_nop_();_nop_(); clk=0;_nop_();_nop_(); //第2个下升沿 Do=ODD;_nop_();_nop_(); //通道选择2 clk=1;_nop_();_nop_(); clk=0;_nop_();_nop_(); //第3个下升沿 for(i=0;i<8;i++) //从高到低取数据 { clk=1;_nop_();_nop_(); clk=0;_nop_();_nop_(); //第4个下升沿 data1=data1>>1; if(Do)data1=data1|0x80; } for(i=0;i<8;i++) // 从低到高取数据 { clk=1;_nop_();_nop_(); clk=0;_nop_();_nop_(); data2=data2<<1; if(Do)data2=data2|0x01; } clk=0;cs=1;Di=1; //初始状态 if(data1=data2)return data1; //校验数据 } void desplay() { uchar i,value_AD,temp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar value_DS,dis[]={0,0,0,0,0,0,0,0}; while(1) { value_DS=ReadTemperature(); //温度 dis[5]=table[value_DS/100]; dis[6]=table[value_DS%100/10]; dis[7]=table[value_DS%10]; value_AD=read_ADC0832(1,0); // ADC0832烟雾浓度数据 dis[0]=table[value_AD/100]; dis[1]=table[value_AD%100/10]; dis[2]=table[value_AD%10]; for(i=5;i<8;i++) //温度显示 { P2=temp; // 位选 P0=dis ; // 段选 if(i==6)P0=P0&0x7f; //显示小数点 delay(100); } for(i=0;i<3;i++) //浓度显示 { P2=temp; // 位选 P0=dis ; // 段选 delay(100); } } } void baojing() { if(value_DS>=50||value_AD>=25) //温度大于50 浓度大于25 报警 { led=0; delay(200); led=1; delay(200); buzzer=0; delay(200); buzzer=1; delay(200); } } void main() { Init_ADC0832(); Init_DS18B20(); desplay();// 显示 baojing(); //报警 } |
|
相关推荐
20个回答
|
|
哈哈 早就解决了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
409 浏览 0 评论
【xG24 Matter开发套件试用体验】10-Bluetooth示例1
469 浏览 0 评论
697 浏览 0 评论
【xG24 Matter开发套件试用体验】power specification电源规格参数配置
512 浏览 0 评论
475 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10818 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-22 22:18 , Processed in 0.365804 second(s), Total 37, Slave 31 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号