完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我想在P2.3口写发光二极管高温时报警程序。在P2.4口写发光二极管低温时报警程序,在P3.7口写扬声器温度报警程序,下面的程序没有这些功能,也就是图片上的程序,要把这些功能加进去要怎么写这些程序,拜托大神了 #include #include #define uint unsigned int #define uchar unsigned char #define delay4us() {_nop_();_nop_();_nop_();_nop_();} //12MHZ系统频率下,延时4us ***it DQ = P3^3; ***it DQ = P3^3; ***it LCD_RW = P2^1; ***it LCD_EN = P2^2; uchar code Temp_Disp_title[]={"Current Temp : "}; //1602液晶第一行显示内容 uchar Current_Temp_Display_Buffer[]={" TEMP: "}; //1602液晶第二行显示内容 uchar code df_Table[]={ 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 }; //温度小数位对照表 uchar CurrentT = 0; //当前读取的温度整数部分 uchar Temp_Value[]={0x00,0x00}; //从DS18B20读取的温度值 uchar Display_Digit[]={0,0,0,0}; //待显示的各温度数位 bit DS18B20_IS_OK = 1; //DS18B20正常标志 void DelayXus(uint x) //延时1 { uchar i; while(x--) { for(i=0;i<200;i++); } } bit LCD_Busy_Check() //LCD忙标志,返回值为1602LCD的忙标志位,为1表示忙 { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delay4us(); result = (bit)(P0&0x80); LCD_EN=0; return result; } void Write_LCD_Command(uchar cmd) //1602LCD写指令函数 { while(LCD_Busy_Check()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delay4us(); LCD_EN = 1; delay4us(); LCD_EN = 0; } void Write_LCD_Data(uchar dat) //1602LCD写数据函数 { while(LCD_Busy_Check()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delay4us(); LCD_EN = 1; delay4us(); LCD_EN = 0; } void LCD_Initialise() //1602LCD初始化 { Write_LCD_Command(0x01); DelayXus(5); Write_LCD_Command(0x38); DelayXus(5); Write_LCD_Command(0x0c); DelayXus(5); Write_LCD_Command(0x06); DelayXus(5); } void Set_LCD_POS(uchar pos) //1602LCD设置显示位置 { Write_LCD_Command(pos|0x80); } void Delay(uint x) //延时2 { while(x--); } uchar Init_DS18B20() //初始化(或者说复位)DS18B20 { uchar status; DQ = 1; Delay(8); DQ = 0; Delay(90); DQ = 1; Delay(8); status=DQ;Delay(100); DQ = 1; return status; } uchar ReadOneByte() //从DS18B20读一字节数据 { uchar i,dat=0; DQ = 1; _nop_(); for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; _nop_(); _nop_(); if(DQ) dat |= 0X80; Delay(30); DQ = 1; } return dat; } void WriteOneByte(uchar dat) //从DS18B20写一字节数据 { uchar i; for(i=0;i<8;i++) { DQ = 0; DQ = dat& 0x01; Delay(5); DQ = 1; dat >>= 1; } } void Read_Temperature() //从DS18B20读取温度值 { if(Init_DS18B20()==1) //DS18B20故障 DS18B20_IS_OK=0; else { WriteOneByte(0xcc); //跳过序列号命令 WriteOneByte(0x44); //启动温度转换命令 Init_DS18B20(); //复位DS18B20(每一次读写之前都要对DS18B20进行复位操作) WriteOneByte(0xcc); //跳过序列号命令 WriteOneByte(0xbe); //读取温度寄存器 Temp_Value[0] = ReadOneByte(); //读取温度低8位(先读低字节,再读高字节,) Temp_Value[1] = ReadOneByte();//读取温度高8位 (每次只能读一个字节) DS18B20_IS_OK=1; //DS18B20正常 } } void Display_Temperature() //在1602LCD上显示当前温度 { uchar i; uchar t = 150, ng = 0; //延时值与负数标志 if((Temp_Value[1]&0xf8)==0xf8) //高字节高5位如果全为1,则为负数,为负数时取反 { //加1,并设置负数标志为1 Temp_Value[1] = ~Temp_Value[1]; Temp_Value[0] = ~Temp_Value[0]+1; if(Temp_Value[0]==0x00) //若低字节进位,则高字节加1 Temp_Value[1]++; ng = 1; //设置负数标志为1 } Display_Digit[0] = df_Table[Temp_Value[0]&0x0f]; //查表得到温度小数部分 //获取温度整数部分(低字节低4位清零,高4位右移4位)+(高字节高5位清零, //低三位左移4位) CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4); / //将温度整数部分分解为3位待显示数字 Display_Digit[3] = CurrentT/100; Display_Digit[2] = CurrentT%100/10; Display_Digit[1] = CurrentT%10; //刷新LCD缓冲 //加字符0是为了将待数字转化为字符显示 Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0'; Current_Temp_Display_Buffer[10] = '.'; Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0'; Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0'; Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0'; if(Display_Digit[3] == 0) //高位为0时不显示 Current_Temp_Display_Buffer[7] = ' '; if(Display_Digit[2] == 0&&Display_Digit[3]==0) //高位为0,且次高位为0,则次高位不显示 Current_Temp_Display_Buffer[8] = ' '; //负号显示在恰当位置 if(ng) { if(Current_Temp_Display_Buffer[8] == ' ') Current_Temp_Display_Buffer[8] = '-'; else if(Current_Temp_Display_Buffer[7] == ' ') Current_Temp_Display_Buffer[7] = '-'; else Current_Temp_Display_Buffer[6] = '-'; } Set_LCD_POS(0x00); //第一行显示标题 for(i=0;i<16;i++) { Write_LCD_Data(Temp_Disp_Title); } Set_LCD_POS(0x40); //第二行显示当前温度 for(i=0;i<16;i++) { Write_LCD_Data(Current_Temp_Display_Buffer); } //显示温度符号 Set_LCD_POS(0x4d); Write_LCD_Data(0x00); Set_LCD_POS(0x4e); Write_LCD_Data('C'); } void main() //主函数 { LCD_Initialise(); Read_Temperature(); Delay(50000); Delay(50000); while(1) { Read_Temperature(); if(DS18B20_IS_OK) Display_Temperature(); DelayXus(100); } }
|
|
相关推荐
5个回答
|
|
|
也就是在这个程序基础上在加一点温度报警程序,假设当温度超过40℃时,高温的发光二极管(LED)亮,同时扬声器发出报警声音。当温度低于-6℃时,低温的发光二极管亮,同时扬声器发出报警声音,怎样在上面的程序加一点啊
|
|
|
|
|
|
代做 1002925094
|
|
|
|
|
|
|
|
|
|
|
|
完美的解决方案!
|
|
|
|
|
|
楼主 会了吗?
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2609 浏览 0 评论
5303 浏览 0 评论
PROTUES仿真no model specified for adc0809,谁有ADC0809的model?
17604 浏览 1 评论
单片机应用技术的ISIS professional电路设置仿真老是报错怎么办
17902 浏览 0 评论
21173 浏览 3 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 17:46 , Processed in 0.783858 second(s), Total 82, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3789