拜托大神帮忙在下面怎样写发光二极管和扬声器报警程序

2019-07-18 09:50发布

我想在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); }}
QQ截图20160415111228.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
武力戡乱
2019-07-18 20:26
二极管和报警做到一起。
报警要用定时器,这样不影响系统运行。一旦检测温度不合格,就触发定时器并开启二极管,否则就关闭定时器和二极管。

一周热门 更多>