- #include <reg51.h>
- #include <intrins.h> //包含_nop_()空函數的頭文件
- #define uchar unsigned char
- #define uint unsigned int
- #define out P0
- sbit RS=P1^0; //位變量
- sbit RW=P1^1; //位變量
- sbit E=P1^2; //位變量
- sbit DQ=P1^5; //位變量
- sbit I2C_SCL=P1^6; //位變量
- sbit I2C_SDA=P1^7; //I2C通信的兩個引腳
- sbit S3=P3^5; //加//按鍵
- sbit S2=P3^6; //減
- sbit S1=P3^7; //保存
- void delay(uint); //延時函數(1ms)
- void delay5(uchar); //延時函數(5us)
- void lcd_initial(void); //LCD初始化函數
- void init_ds18b20(void); //DS18B20初始化函數
- void check_busy(void); //檢查忙標志位函數
- void write_command(uchar com); //寫命令函數
- void write_data(uchar dat); //寫顯示數據函數
- uchar readbyte(void); //讀取1B數據
- void writebyte(uchar); //寫入1B函數
- uchar retemp(void); //讀溫度函數
- void string(uchar ad,uchar *s); //逐個輸出顯示字符串函數
- void stringAll(uchar ad,uchar *s);//整屏輸出顯示字符串函數
- void getHtemp(uchar str[]); //獲得最高溫度的字符串形式
- void getLtemp(uchar str[]); //獲得最低溫度的字符串形式
- void getTtemp(uchar str[]); //獲得當前溫度的字符串形式
- void delayms(uint t); //延時函數
- void keyscan(); //按鍵掃描函數
- void save_data(); //保存數據的函數
- void load_data(); //讀取數據的函數
- uchar code seg[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xdf,0x43,0x20,0x2d}; //(0-9,'°','C',' '(空格),'-')ASCII碼值
- uint flag=0;
- uchar maxtemp=40; //初始化最高溫度
- uchar mintemp=30; //初始化最低溫度
-
- //主函數
- void main()
- {
- uchar Htempstr[4];
- uchar Ltempstr[4];
- uchar Ttempstr[4];
- uchar i=16;
- uchar *gear="0";
- uchar tempsign[2];
- tempsign[0]=seg[10];
- tempsign[1]=seg[11];
- lcd_initial();
- load_data(); //讀取保存在EEPROM中的數據
- string(0x80,"welcome to AAUCS");
- string(0xc5,"NO.35");
- delay(500);
- while(i){
- write_command(0x1c); //實際電路板上需設置為0x18
- i--;
- delay(200);
- }
- lcd_initial();
- while(1){
- keyscan();
- getHtemp(Htempstr);
- getLtemp(Ltempstr);
- getTtemp(Ttempstr);
- //stringAll(0x80,"H:");
- stringAll(0x82,Htempstr);
- //stringAll(0x86,tempsign);
- //stringAll(0x88,"L:");
- //stringAll(0x8a,Ltempstr);
- //stringAll(0x8e,tempsign);
- //stringAll(0xc0,"T:");
- //stringAll(0xc2,Ttempstr);
- //stringAll(0xc6,tempsign);
- //stringAll(0xca,"FAN:");
- //stringAll(0xce,gear);
- delay(100);
- }
- }
- //獲得最高溫度的字符串形式
- void getHtemp(uchar htempstr[4]){
- uchar a,b,c;
- if(maxtemp>=0)
- {
- a=seg[maxtemp/100];
- b=seg[(maxtemp/10)%10];
- c=seg[maxtemp%10];
- htempstr[0]=seg[12];
- }
- else
- {
- maxtemp=~maxtemp+1;
- a=seg[maxtemp/100];
- b=seg[(maxtemp/10)%10];
- c=seg[maxtemp%10];
- htempstr[0]=seg[13];
- }
- htempstr[1]=a;
- htempstr[2]=b;
- htempstr[3]=c;
- }
- //獲得最低溫度的字符串形式
- void getLtemp(uchar ltempstr[4]){
- uchar a,b,c;
- if(mintemp>=0)
- {
- a=seg[mintemp/100];
- b=seg[(mintemp/10)%10];
- c=seg[mintemp%10];
- ltempstr[0]=seg[12];
- }
- else
- {
- mintemp=~mintemp+1;
- a=seg[mintemp/100];
- b=seg[(mintemp/10)%10];
- c=seg[mintemp%10];
- ltempstr[0]=seg[13];
- }
- ltempstr[1]=a;
- ltempstr[2]=b;
- ltempstr[3]=c;
- }
- //獲得當前溫度的字符串形式
- void getTtemp(uchar str[4]){
- uchar temp,a,b,c;
- temp=retemp();
- a=seg[temp/100];
- b=seg[(temp/10)%10];
- c=seg[temp%10];
- if(flag==0)
- {
- str[0]=seg[12];
- }
- else
- {
- str[0]=seg[13];
- }
- str[1]=a;
- str[2]=b;
- str[3]=c;
- }
- //整屏輸出顯示字符串函數
- void stringAll(uchar ad,uchar *s)
- {
- write_command(ad);
- while(*s>0)
- {
- write_data(*s++);
- }
- }
復制代碼 |