基于51單片機的1602液晶顯示溫度和時間的C程序_第1頁
基于51單片機的1602液晶顯示溫度和時間的C程序_第2頁
基于51單片機的1602液晶顯示溫度和時間的C程序_第3頁
基于51單片機的1602液晶顯示溫度和時間的C程序_第4頁
基于51單片機的1602液晶顯示溫度和時間的C程序_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、/ 液晶顯示溫度#include "AT89X52.H"#define Ddata P0sbit RS=P2”/ 命令數據控制端sbit RW=P2A6;/ 讀寫選擇端sbit LCDE=P2A5;/ 液晶使能端sbit DQ=P2A0;/ds18b20與單片機連接口4 頁#define uchar unsigned char #define uint unsigned int/ 定義初值unsigned char hour=0,min=0,sec=0;unsigned int count=0;unsigned char line116=" temp:"

2、/16 個字符unsigned char line216=" time:00:00:00"/16 個字符unsigned char tab='0','1','2','3','4','5','6','7','8','9'/ 數組uchar data disdata5;uint tvalue;/ 溫度值uchar tflag;/ 溫度正負標志void time();/*lcd1602 程序 */延時 1 毫秒(不夠精確的

3、)void delay1ms(unsigned int ms)/unsigned int i,j;for(i=0;i<ms;i+)for(j=0;j<110;j+);void delay5ms()/ 延時 5 毫秒(不夠精確的) unsigned int i;for (i=0;i<1000;i+);void delay50us()register int i;for (i=0;i<20;i+);void delay()unsigned char m,n;for(m=255;m>0;m-) for(n=255;n>0;n-);void wr_com(unsig

4、ned char comm)/* 寫控制字符程序E=1 RS=0RW=0*/LCDE=0;/ 使能端RS=0;/*rs寄存器選擇輸入端,當 RS=0;當進行寫模塊操作,指向指令寄存器。RW=0;/* 當 RS=1 ,無論是讀操作還是寫操作,都是指向數據寄存器。LCDE=1;Ddata=comm;RS=0;RW=0;LCDE=0;void wr_data(unsigned char dat)/* 當前位置寫字符子程序:E=1 RS=1 RW=0LCDE=0;RS=0;/*rs寄存器選擇輸入端,當 RS=0;當進行寫模塊操作,指向指令寄存器。RW=0;/* 當 RS=1 ,無論是讀操作還是寫操作,

5、都是指向數據寄存器。RS=1;RW=0;LCDE=1;Ddata=dat; / 將 dat 賦給 P0 口LCDE=0;RS=0;RW=0;unsigned char busycheck()/* 忙狀態(tài)檢查*/unsigned char i;LCDE=0;RS=0;RW=0;RS=0;RW=1;LCDE=1;i=Ddata;LCDE=0;return(i);void init()/* 初始化程序,必須按照產品的資料介紹的過程進行*/wr_com(0x38);/* 顯示模式設置必須三次,不用檢測忙信號delay5ms();wr_com(0x38);delay5ms();wr_com(0x38);

6、delay5ms();wr_com(0x01);/* 清屏 *delay5ms();busycheck();wr_com(0x08);delay5ms();busycheck();delay5ms();wr_com(0x06);/* 光標移動設置,寫一個字符后地址指針加1*delay5ms();busycheck();delay50us();wr_com(0x38);/* 顯示模式設置*delay50us();busycheck();delay50us();wr_com(0x0c); /* 顯示開,不顯示光標* delay50us();busycheck();delay50us();5頁wr_

7、com(0x40);/set cgram addressdelay50us();delay50us();/* 這些延時可用可不用*/void display() unsigned char i;wr_com(0x80); /set ram addressdelay50us();busycheck();delay50us();for(i=0;i<6;i+)wr_data(line1i); /display ( 6 個字符)delay50us();busycheck();busycheck();delay50us();wr_com(0xc0);/0xc0=0x80+0x40delay50us

8、();busycheck();delay50us();for(i=0;i<16;i+)wr_data(line2i); /displaydelay50us();busycheck();6 頁,*溫度傳感器ds1820 程序*/void delay_18B20(unsigned int i)/ 延時 1 微秒while(i-);void ds1820rst()/*ds1820 復位 */ unsigned char x=0;DQ = 1;/DQ 復位delay_18B20(4);/ 延時DQ = 0;/DQ 拉低delay_18B20(100); / 精確延時大于480usDQ = 1;/

9、拉高delay_18B20(40);uchar ds1820rd()/* 讀數據 */ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i-)/ 讀一個字節(jié)的數據函數 DQ = 0; / 給脈沖信號dat>>=1;DQ = 1; / 給脈沖信號if(DQ)dat|=0x80;/等價于 dat = dat | 0x80,dat 和 0x80 做“或”的運算,結果是最高位置1,其它位保持不變。delay_18B20(10);8頁return(dat);void ds1820wr(uchar wdata)/*寫數據*/uns

10、igned char i=0;for (i=8; i>0; i-) DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;/右移一位wdata>>=1;read_temp()/* 讀取溫度值并轉換*/uchar a,b;ds1820rst();/ds1802/ 初始化程序14 頁ds1820wr(0xcc);/* ds1820wr(0x44);* ds1820rst();ds1820wr(0xcc);/* ds1820wr(0xbe);/* a=ds1820rd();b=ds1820rd(); tvalue=b;跳過讀序列號啟動溫

11、度轉換跳過讀序列號讀取溫度*/*/*/*/讀低八位/讀高八位tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff) tflag=0;else/“ &是邏輯與“ |是邏輯或if (dat & 0x01 ):不管 dat 是什么數和 0x01(00000001)做了 與"的 運算后,最低位保持不變,其它位均為0.如果dat的最低位為1 , 則表達式為真,就會執(zhí)行if語句中的內容。如果dat最低位為0, 則表達式為假,不執(zhí)行if語句,執(zhí)行if語句后的下一條語句。dat |= 0x80 :等價于 dat = dat | 0x

12、80,dat 和 0x80 做 或”的運算, 意思是最高位置1 ,其它位保持不變。具體的可以去參考一下C語言的相關語法tvalue=tvalue+1;tflag=1;tvalue=tvalue*(0.625);/ 溫度值擴大10 倍,精確到1 位小數return(tvalue);/*/void ds1820disp()/ 溫度值顯示 uchar flagdat;disdata0=tvalue/1000+0x30;/ 百位數disdata1=tvalue%1000/100+0x30;/ 十位數disdata2=tvalue%100/10+0x30;/ 個位數disdata3=tvalue%10+

13、0x30;/ 小數位if(tflag=0)flagdat=0x20;/ 正溫度不顯示符號elseflagdat=0x2d;/ 負溫度顯示負號:-if(disdata0=0x30)disdata0=0x20;/ 如果百位為0,不顯示if(disdata1=0x30)disdata1=0x20;/ 如果百位為0,十位為0也不顯示wr_com(0x88);wr_data(flagdat);/ 顯示符號位wr_com(0x89);wr_data(disdata0);/ 顯示百位 wr_com(0x8a);wr_data(disdata1);/ 顯示十位 wr_com(0x8b);wr_data(dis

14、data2);/ 顯示個位wr_com(0x8c);wr_data(0x2e);/ 顯示小數點wr_com(0x8d);wr_data(disdata3);/ 顯示小數位void main()TMOD=0X01;EA=1;ET0=1;TR0=1;TH0=(65536-4995)/256;TL0=(65536-4995)%256;init();while(1)read_temp();/ 讀取溫度ds1820disp();/ 顯示time(); / 時間程序display();/ 時間顯示程序void t0(void)interrupt 1 using 0TH0=(65536-4995)/256;TL0=(65536-4995)%256;count+;if(count=200)count=0;sec+;if(sec=60)sec=0;min+;if(min=60)min=0;hour+;if(hour=24)hour=0;void time()line215=tabsec%10;line214=tabsec/10;line212=ta

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論