我想在P2.3口写发光二极管高温时报警程序。在P2.4口写发光二极管低温时报警程序,在P3.7口写扬声器温度报警程序,下面的程序没有这些功能,也就是图片上的程序,要把这些功能加进去要怎么写这些程序,拜托大神了
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned char#define delay4us() {_nop_();_nop_();_nop_();_nop_();} //12MHZ
系统频率下,延时4us sbit DQ = P3^3;sbit DQ = P3^3;sbit LCD_RW = P2^1;sbit 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) //
若低字节进位,则高字节加1Temp_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] = '-'; elseCurrent_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); }}
-
报警要用定时器,这样不影响系统运行。一旦检测温度不合格,就触发定时器并开启二极管,否则就关闭定时器和二极管。
一周热门 更多>