這么修改顯示+40℃呢,不要小數后面的。
我把uchar cdis2[ ] = "+00.00";
修改成uchar cdis2[ ] = "+00.";顯示還是不變
- #include < reg51.h >
- #include < intrins.h >
- #define uchar unsigned char
- #define uint unsigned int
- //#define lcddata P0
- #define lcddata P2
- sbit LCDRS=P1^7; //液晶數據選擇命令端
- sbit LCDRW=P1^6; //液晶讀寫命令端
- sbit LCDEN=P1^5; //液晶使能端
- //sbit LCDRS = P2^6 ; // 命令/數據選擇端 0為寫命令 1為寫數據
- //sbit LCDRW = P2^5 ; // lcd讀寫端
- //sbit LCDEN = P2^7 ; //lcd使能端
- void write_com(uchar com);
- void zdyzfxs();
- unsigned char code mytab[8] = {0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定義 ℃字符
- //sbit DQ = P3^7 ; //定義DS18B20端口DQ
- sbit DQ = P1^0; //定義DS18B20端口DQ
- bit presence; //ds18b20 DQ被拉低 信號0允許,1禁止
- uint cc,cc2; //變量cc中保存讀出的溫度值
- float cc1;
- uchar flag; //flag為溫度值正負標志位,“1”表示溫度為復制,“0”表示為正值//flag為溫度值正負標志位,“1”表示溫度為復制,“0”表示為正值
- void write_com(uchar com);
- uchar code cdis0[ ] = "CHECKING..."; //無字符類型0~255,定位在code區,因為定義的數據是常量,所以放在ROM(程序存儲區)里面,寫入后就不能再更改。放在RAM區也需要在ROM里占用同樣的大小
- uchar code cdis1[ ] = " DS18B20 OK " ;
- //uchar code cdis5[ ] = "Temp: ";
- uchar cdis2[ ] = "+00.00";
- uchar code cdis3[ ] = " DS18B20 ERR0R " ;
- uchar code cdis4[ ] = " PLEASE CHECK " ;
- unsigned char data temp_data[2] = {0x00,0x00} ; //存儲16位溫度 有字符類型-128~127 data;內部數據存儲區 xdata;外部數據存儲區 code;程序存儲區
- /**********************************lcd1602********************************************/
- //--------------------------------- 延時程序
- void delaylcd(uint z)
- {uchar x,y;
- for(x=z;x>0;x--)
- {for(y=110;y>0;y--);
- }
- }
- /*lcd1602初始化 */
- /**********************************/
- void lcd_init(void)
- {
- LCDRW=0; //低電平為寫
- LCDEN=0;
- write_com(0x38); //使用8位數據開關,顯示兩行,使用5*7字形
- write_com(0x0c); //顯示器開,光標關,字符不閃爍 0x0e 光標開
- write_com(0x06); //字符不動,光標自動右移動一位
- write_com(0x01); //清屏
- }
- /*寫命令to lcd */
- /**********************************/
- void write_com(uchar com)//寫命令
- {
- LCDRW=0; //低電平為寫
- LCDRS=0; //低電平為命令選擇
- //LCDEN=1;
- lcddata=com;
- delaylcd(5);
- LCDEN=1;
- delaylcd(5);
- LCDEN=0;
- }
- /*寫數據to lcd */
- /**********************************/
- void write_data(uchar date)
- {
- LCDRW=0; //低電平為寫
- LCDRS=1; //高電平為數據選擇
- //LCDEN=1;
- lcddata=date;
- delaylcd(5);
- LCDEN=1;
- delaylcd(5);
- LCDEN=0;
- }
- /*設定顯示位置 */
- /********************************/
- void lcd_pos(uchar pos)
- { //第一行第幾列直接寫pos為幾,第二行pos從0x40開始
- write_com(pos | 0x80) ; //數據指針=80+地址變量
- }
- /*自定義字符寫入CGRAM */
- /*********************************/
- void mywritetab()
- {
- unsigned char i ;
- write_com(0x40) ; //寫CGRAM
- for(i=0;i<8;i++)
- {write_data(mytab[i]);}
- }
- /*******************************ds18b20*******************************************/
- /*ms級別 延時程序 */
- void ddelay(uint ms)
- {
- uint i;
- uchar j;
- for(i=0;i<ms;i++)
- for(j=0;j<250;j++)
- {
- _nop_(); //一個機器周期,1us
- _nop_(); //適用于精度高的
- _nop_();
- _nop_();
- }
- }
- /*us級延時,延時時間約4+2*i*/
- void Delayus(uchar i)
- {
- while(--i);
- }
- /*復位,每次讀寫之前都要進行復位*/
- /**********************************/
- bit ow_reset(void)
- {
- DQ = 1 ; //DQ復位
- Delayus(8) ; //稍做延時
- DQ = 0; //拉低約600us
- Delayus(150);
- Delayus(150);
- DQ = 1;//產生上升沿,延時約15~60us
- Delayus(30);
- if(DQ==0) {presence=0;}
- else presence=1;
- return(presence); //等待應答信號 0允許,1禁止
- }
- /*讀取數據一位 */
- //---------------------------------
- bit Read_bit()
- {
- uint i = 0;
- bit b = 0;
- DQ = 0; //產生讀時隙
- i++; //維持低電平至少1us
- DQ = 1; //1us以上后拉高
- Delayus(2); //延時8us,DO下降沿15內ds18b20輸出的數據才有效
- b = DQ; //讀取數據
- Delayus(40); //每個讀時隙至少持續60us
- return(b);
- }
- /*讀取一個字節 */
- //------------------------------------
- uchar Read_byte()
- {
- uchar byte_read = 0;
- uchar i, j;
- for(i=0; i<8; i++)
- {
- j = Read_bit();
- byte_read = (j<<i) | byte_read; //低位讀起
- }
- return(byte_read);
- }
- //-----------------------------------------
- /*寫一個字節 */
- void Write_byte(uchar byte_to_write)
- {
- uchar i = 0;
- uchar j = 0;
- bit write_bit = 0;
- for(j=0; j<8; j++)
- {
- write_bit = (byte_to_write & 0x01);
- if(write_bit == 1) //寫1
- {
- DQ = 0; //產生寫時隙
- Delayus(3); //延時15us
-
- DQ = 1; //寫1
- Delayus(40); //延時,寫時隙不得低于60us
- }
- else
- {
- DQ = 0; //產生寫時隙
- Delayus(50); //延時,保持低約60us~120us
- DQ = 1;
- i++;
- }
- byte_to_write = byte_to_write >> 1;
- }
- }
- //-----------------------------------
- /*讀取溫度,啟動溫度轉換*/
- /*啟動溫度轉換*/
- void start_convert()
- {
- ow_reset(); // 發出復位脈沖,每次操作都從復位開始
- ddelay(1);
- Write_byte(0xcc); //skip room命令,跳過序列號命令字
- Write_byte(0x44); //啟動溫度轉換命令
- }
- /*讀取溫度值*/
- void read_tempreture()
- {
- ow_reset(); // 發出復位脈沖,每次操作都從復位開始
- ddelay(1);
- Write_byte(0xcc); //skip room命令
- Write_byte(0xbe); //讀取暫存器命令
- temp_data[0] = Read_byte(); //存儲溫度低字節值 (整數部分低四位和小數部分) 先從低字節讀取
- temp_data[1] = Read_byte(); //存儲溫度高字節值 (其中高五位為符號位)
- }
- //--------------------------------------
- /* CHECKING...顯示 */
- void lcd_display()
- {
- uchar m ;
- lcd_init() ; //初始化LCD
- lcd_pos(0) ; //設置顯示位置為第一行的第1個字符
- m = 0 ;
- while(cdis0[m] != '\0')
- { //顯示字符
- write_data(cdis0[m]) ;
- m++ ;
- }
- }
- //--------------------------------------
- /* DS18B20 OK 顯示菜單 */
- void Ok_Menu ()
- {
- uchar m ;
- lcd_init() ; //初始化LCD
- lcd_pos(0) ; //設置顯示位置為第一行的第1個字符
- m = 0 ;
- while(cdis1[m] != '\0')
- { //顯示字符
- write_data(cdis1[m]) ;
- m++ ;
- }
- }
- //-----------------------------------
- /*DS18B20 ERR0R */
- /*PLEASE CHECK 顯示 */
- void Error_Menu ()
- {
- uchar m ;
- lcd_init() ; //初始化LCD
- lcd_pos(0) ; //設置顯示位置為第一行的第1個字符
- m = 0 ;
- while(cdis3[m] != '\0')
- {
- write_data(cdis3[m]) ; //顯示字符
- m++ ;
- }
- lcd_pos(0x40) ; //設置顯示位置為第二行第1個字符
- m = 0 ;
- while(cdis4[m] != '\0')
- {
- write_data(cdis4[m]) ; //顯示字符
- m++ ;
- }
- }
- //-----------------------------------
- /*自定義字符顯示 */
- void zdyzfxs()
- {
- mywritetab();
- lcd_pos(12);
- write_data(0x00);
- }
- //------------------------------------
- /*溫度顯示 */
- void temperature_display()
- {
- uchar m;
- flag=0;
- while(1)
- {
- ddelay(2);
- EA=0; //DS18B20讀寫數據按照嚴格的時序,最好不要被打斷,故把所有中斷關閉
- start_convert(); //啟動溫度轉換
- ddelay(250);
- read_tempreture(); //讀取溫度
- EA=1;
- cc=temp_data[1]*256.0+temp_data[0];
- if(temp_data[1]>0xF8) {flag=1;cc=~cc+1;} else flag=0;
- cc1=cc*0.0625;
- cc2=cc1*100;
- cdis2[1]=cc2/1000+0x30;
- if(cdis2[1]==0x30)
- {cdis2[1]=0x20;}
- cdis2[2]=cc2/100%10+0x30;//LCD顯示溫度個位
- //cdis2[4]=cc2%100/10+0x30;
- //cdis2[5]=cc2%10+0x30;
- if(flag==1)
- cdis2[0]='-';//LCD溫度顯示 -
- else
- cdis2[0]='+';//LCD溫度顯示 +
-
- lcd_pos(6) ; //設置顯示位置為第一行的第6個字符
- m=0;
- while(cdis2[m]!='\0')
- { //顯示字符
- write_data(cdis2[m]) ;
- m++;
- }
- }
- }
- //---------------------------------
- /*主函數 */
- void main()
- {
- lcd_display();
- ddelay(1000);
- ow_reset();
- if(presence==0)
- {
- Ok_Menu ();
- ddelay(1000);
- zdyzfxs();//顯示自定義字符 ℃
- temperature_display();
- }
- else
- {
- Error_Menu ();
- while(1)
- {
- ow_reset();
- if(presence==0)
- {
- Ok_Menu ();
- ddelay(1000);
- temperature_display();
- }
- }
- }
- }
復制代碼
|