你的程序主要有兩處錯誤:
1.DS18B20讀取時序錯誤,Delay_us(480);uchar最大只能255,其它小延時也做了調整。
2.需要顯示的數據分解方法錯誤,temp是uchar型數據,怎么能str3[temp%1000/100])、str3[temp%100/10]);
修改后的程序如下:
無標題.jpg (57.82 KB, 下載次數: 33)
下載附件
2019-4-29 09:10 上傳
- #include<reg51.h>
- #include<intrins.h>
- #include <absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define BUSY 0x80
- void Delay(uint);
- void init_LCD();
- void LCD_Com(uchar,uchar);
- void LCD_Data(uchar);
- void ReadyLCD();
- void Display_char(uchar X,uchar Y,uchar Data);
- void Display_str(uchar,uchar,uchar code *Data);
- void LCDDisplay();
- void init_18B20();
- uchar Read_18B20();
- void Write_18B20(uchar dat);
- void Read_temp1();
- void Delay_us(uchar i);
- void Key_scan( );
- void Key_set( );
- void Key_inc( );
- void Key_dec( );
- void Alarm( );
- sbit relay=P3^3;
- sbit triac1=P3^0;
- sbit triac2=P3^1;
- sbit triac3=P3^2;
- sbit LCD_RS=P2^0;
- sbit LCD_RW=P2^1;
- sbit LCD_EN=P2^2;
- sbit DQ=P1^7;
- sbit Normal=P2^4;
- sbit Alarm_B=P2^5;
- sbit Alarm_R=P2^6;
- sbit Alarm_BEEP=P2^7;
- uchar Set_flag=0;
- uchar Temp_set1,Temp_set2; //用于存放讀到的值
- uchar temp,temp1,temp2;
- extern uchar code str0[]={"C : D : "}; //顯示設置1
- extern uchar code str1[]={"Mode: DC: "}; //顯示設置2
- extern uchar code str2[]={" Hellow!! "};
- extern uchar code str3[]={"0123456789"};
- extern uchar code mode[]={"NCD"};
- bit ON_OFF=0;
- bit outflag;
- bit write=0;
- void main() //主程序
- {
- P1=0xff;
- P2|=0x70;
- P2&=0x7f;
- Temp_set1=40; //設置溫度40
- Temp_set2=1; //設置檔位1
- Delay(500); //延時500ms
- init_LCD(); //LCD初始化
- init_18B20(); //DS18B20初始化
- Display_str(0,0,str2); //開機界面
- Display_str(0,1,str2); //開機界面
- Delay(2000); //延遲
- Display_str(0,0,str0); //顯示設置str0
- Display_str(0,1,str1); //顯示設置str1
- while(1)
- {
- Key_scan(); //掃描鍵盤
- Read_temp1(); //讀取溫度
- LCDDisplay(); //顯示
- Alarm(); //指示燈與報警程序
- Delay(1000); //延遲
- }
- }
- /********延時kms********/
- void Delay(uint k)
- {
- uint i,j;
- for(i=0;i<k;i++)
- for(j=0;j<60;j++);
- }
- /********精確延時********/
- void Delay_us(uchar i)
- {
- while(--i);
- }
- /********顯示模塊********/
- /********LCD初始化********/
- void init_LCD()
- {
- P0=0;
- Delay(15);
- LCD_Com(0x38,0);
- Delay(5);
- LCD_Com(0x38,0);
- Delay(5);
- LCD_Com(0x38,0);
- Delay(5);
- LCD_Com(0x38,1); //8位數據傳送,2行顯示,5*7字形
- LCD_Com(0x08,1); //關閉顯示
- LCD_Com(0x01,1); //清屏
- LCD_Com(0x06,1); //顯示光標右移設置
- LCD_Com(0x0c,1); //顯示屏打開,光標不顯示不閃爍
- }
- /********寫指令數據到LCD********/
- void LCD_Com(uchar LC,uchar BC)
- {
- if(BC) ReadyLCD();
- P0=LC;
- LCD_RS=0; //選中指令寄存器
- LCD_RW=0; //寫模式
- LCD_EN=1;
- _nop_();
- _nop_();
- _nop_();
- LCD_EN=0;
- }
- /********寫顯示數據到LCD********/
- void LCD_Data(uchar LD)
- {
- ReadyLCD();
- P0=LD;
- LCD_RS=1; //選中數據寄存器
- LCD_RW=0; //寫模式
- LCD_EN=1;
- _nop_();
- _nop_();
- _nop_();
- LCD_EN=0;
- }
- /********檢測LCD忙狀態********/
- void ReadyLCD()
- {
- P0=0xff;
- LCD_RS=0;
- LCD_RW=1;
- LCD_EN=1;
- _nop_();
- while(P0&BUSY)
- {
- LCD_EN=0;
- _nop_();
- _nop_();
- LCD_EN=1;
- _nop_();
- _nop_();
- }
- LCD_EN=0;
- }
- /********顯示一個字符********/
- void Display_char(uchar X,uchar Y,uchar Data)
- {
- Y&=1;
- X&=15;
- if(Y) X|=0x40;
- X|=0x80;
- LCD_Com(X,0);
- LCD_Data(Data);
- }
- /********顯示一串字符********/
- void Display_str(uchar X,uchar Y,uchar code *Data)
- {
- uchar List=0;
- Y&=0x01;
- X&=0x0f;
- while(X<16)
- {
- Display_char(X,Y,Data[List]);
- List++;
- X++;
- }
- }
- /********溫度測量模塊********/
- /********DS18B20初始化********/
- void init_18B20()
- {
- uchar x=0;
- DQ=1; //DQ復位
- Delay_us(5); //延時
- DQ=0; //將DQ拉低
- Delay_us(200); //精確延時大于480us
- Delay_us(200);
- DQ=1; //拉高總線
- Delay_us(50);
- x=DQ;
- Delay_us(25);
- }
- /********從DS18B20讀取一個字節數據********/
- uchar Read_18B20()
- {
- uchar i=0;
- uchar dat=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- dat>>=1;
- DQ=1;
- // Delay_us(1);
- if(DQ)
- dat|=0x80;
- Delay_us(25);
- }
- return(dat);
- }
- /********向DS18B20寫入一個字節數據********/
- void Write_18B20(uchar dat)
- {
- uchar i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- _nop_();
- DQ=dat&0x01;
- Delay_us(25);
- DQ=1;
- dat>>=1;
- Delay_us(25);
- }
- }
- /********從DS18B20讀取溫度********/
- void Read_temp1()
- {
- uchar a=0;
- uint b=0;
- uint t=0;
- // float tt;
- init_18B20();
- Write_18B20(0xcc); //寫跳過讀ROM指令
- Write_18B20(0x44); //寫跳過讀ROM指令
- Delay(20);
- init_18B20();
- Write_18B20(0xcc);
- Write_18B20(0xbe);
- a=Read_18B20();
- b=Read_18B20();
- b<<=8;
- t=a+b;
- temp=t>>4;
- }
- /********顯示子程序********/
- void LCDDisplay()
- {
- LCD_Com(0x0c,1);
- Display_str(0,0,str0);
- Display_str(0,1,str1);
- Display_char(5,0,str3[Temp_set1/10]);
- Display_char(6,0,str3[Temp_set1%10]);
- Display_char(13,0,str3[Temp_set2/10]);
- Display_char(14,0,str3[Temp_set2%10]);
- Display_char(5,1,mode[Set_flag]);
- Display_char(13,1,str3[temp/10%10]);
- Display_char(14,1,str3[temp%10]);
- }
- /********鍵盤掃描程序********/
- void Key_scan( )
- {
- P1=0xff;
- if(P1!=0xff)
- {
- Delay(20); //延時消抖
- if(P1!=0xff)
- {
-
- switch(P1)
- {
- case 0xfe:Key_set();break; //P1.0按下,功能選擇
- case 0xfd:Key_inc();break; //P1.1按下,數字加一
- case 0xfb:Key_dec();break; //P1.2按下,數字減一
- default:break;
- }
- }
- }
- }
- /********工作模式子程序********/
- void Key_set( )
- {
- Set_flag++;
- if(Set_flag>=3) //設定溫度值
- Set_flag=0; //設定檔位值
- }
- /********按鍵加一子程序********/
- void Key_inc( )
- {
- switch(Set_flag)
- {
- case 1:Temp_set1++;
- if(Temp_set1>=99) Temp_set1=99;break;
- case 2:Temp_set2++;
- if(Temp_set2>=Temp_set1) Temp_set2=Temp_set1;break;
- default:break;
- }
- }
- /********按鍵減一子程序********/
- void Key_dec( )
- {
-
- switch(Set_flag)
- {
- case 1:Temp_set1--;
- if(Temp_set1<=Temp_set2) Temp_set1=Temp_set2;break;
- case 2:Temp_set2--;
- if(Temp_set2<=1) Temp_set2=1;break;
- default:break;
- }
- }
- /********報警和指示程序********/
- void Alarm( )
- {
- uchar C;
- C=Temp_set1+5;
-
- if(temp>C)
- {
- Normal=1;
- Alarm_B=0;
- Alarm_R=1;
- Alarm_BEEP=1;
- }
- else
- {
- Normal=1;
- Alarm_B=1;
- Alarm_R=0;
- Alarm_BEEP=0;
- }
- }
復制代碼
|