LCD12864,LCD1602溫度顯示測試程序,有興趣的可以自己動手試試
單片機源程序如下:
- /*******************************************
- 功 能:溫度測量儀表--12864液晶顯示器顯示
- 傳感器:DS18B20
- 顯示器:12864液晶屏
- *******************************************/
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ=P2^0;//溫度傳感器DQ端接單片機P2.0口
- // 12864液晶位定義
- sbit lcdrs=P3^4;//液晶的RS端接P3.4口
- sbit lcdrw=P3^6;//液晶的RW端接P3.6口
- sbit lcden=P3^7;// 液晶的EN使能端接P3.7口
- uint wendu=0; //溫度初始數值0
- /********************延時函數,延時一毫秒************************/
- void delay1ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=114;y>0;y--);
- }
- /**************************12864顯示****************************/
- void write_com(uchar com) //寫指令函數
- {
- lcdrs=0;
- P0=com;
- delay1ms(1);
- lcden=1;
- delay1ms(1);
- lcden=0;
- }
- void write_date(uchar date) //寫數據函數
- {
- lcdrs=1;
- P0=date;
- delay1ms(1);
- lcden=1;
- delay1ms(1);
- lcden=0;
- }
- void write_str(uchar *str) //寫字符串函數
- {
- while(*str!='\0') //未結束
- {
- write_date(*str++);
- delay1ms(5);
- }
- }
- void write_pos(uchar x,uchar y) //從第X行的第Y位置開始顯示
- {
- uchar pos;
- if(x==1) //第一行
- { x=0x80;}
- else if(x==2) //第二行
- { x=0x90;}
- else if(x==3) //第三行
- { x=0x88;}
- else if(x==4) //第四行
- { x=0x98;}
- pos=x+y-1; //首地址為0X80
- write_com(pos);
- }
- /***************************12864液晶初始化******************************/
- void init_12864()
- {
- lcdrw=0;
- lcden=0;
- write_com(0x01); //清屏命令
- delay1ms(5);
- write_com(0x30); //設置基本指令集動作
- write_com(0x06); //進入顯示模式
- write_com(0x0c); // 開顯示
- write_com(0x88);
- write_pos(1,1);
- write_str(" 溫度測量實驗");
- write_pos(2,1);
- write_str("實時溫度:");
- write_pos(2,8);
- write_str("度");
- write_pos(3,1);
- write_str("淘寶店鋪實名搜索");
- write_pos(4,1);
- write_str("順通電子工作室");
- }
- /************************DS18B20程序*************************/
- bit init_DS18B20()
- {
- uchar num;
- bit flag;
- DQ=1;
- for(num=0;num<2;num++); //先拉高
- DQ=0;
- for(num=0;num<200;num++); // 480-960us powerup
- DQ=1;
- for(num=0;num<20;num++); // >60us wait
- flag=DQ; // 響應
- for(num=0;num<150;num++); // 60-240us ds18b20存在信號
- DQ=1;
- return flag;
- }
- void DS18B20_WR_CHAR(uchar byte) // 先寫低位
- {
- uchar num;
- uchar num1;
- for(num1=0;num1<8;num1++)
- {
- DQ=0; //拉低
- _nop_(); //下拉1us
- _nop_();
- DQ=byte&0x01;
- for(num=0;num<20;num++); // >60us wait
- byte>>=1;
- DQ=1; //拉高
- _nop_();
- _nop_();
- }
- }
- uchar DS18B20_RD_CHAR() //先讀低位
- {
- uchar num;
- uchar num1;
- uchar byte=0;
- for(num1=0;num1<8;num1++)
- {
- DQ=0; //拉低
- _nop_();
- DQ=1;
- for(num=0;num<1;num++); // <10us
- byte>>=1;
- if(DQ==1)
- byte|=0x80;
- else
- byte|=0x00;
- DQ=1; //拉高
- _nop_();
- _nop_();
- for(num=0;num<20;num++); // >60us
-
- }
- return byte;
- }
- uint DS18B20_WENDU()
- {
- uchar temperaturel=0,temperatureh=0;
- uint temperature=0;
- if(init_DS18B20()==0)
- {
- DS18B20_WR_CHAR(0xcc); //發命令:Skip ROM,跳過讀序列號
- DS18B20_WR_CHAR(0x44); //啟動溫度轉換
- delay1ms(1000);
- if(init_DS18B20()==0)
- {
- DS18B20_WR_CHAR(0xcc); //發命令:Skip ROM,跳過讀序列號
- DS18B20_WR_CHAR(0xBE); //讀取溫度
- _nop_();
- temperaturel=DS18B20_RD_CHAR(); //溫度值低8為存入temperaturel
- temperatureh=DS18B20_RD_CHAR(); //溫度值高8為存入temperatureh
- temperature=(temperatureh*256+temperaturel)*0.625; //完成數據整合,溫度比正常大10倍
- init_DS18B20();
- }
- return temperature;
- }
- }
- /************************主函數******************************/
- main()
- {
- init_12864(); //12864液晶初始化函數
- delay1ms(1000);
- while(1)
- {
- if( init_DS18B20()==0)
- {
- wendu=DS18B20_WENDU();
- write_pos(2,6);
- write_date((wendu/100)%10+48); //+48 實現十進制與ASCII碼之間的轉換 讓1602液晶顯示十進制數
- write_date((wendu/10)%10+48);
- write_date('.');
- write_date(wendu%10+48);
-
- delay1ms(2000);
- }
- }
- }
復制代碼
所有資料51hei提供下載:
DS18B20溫度傳感器電子資料.zip
(457.98 KB, 下載次數: 27)
2018-5-15 19:09 上傳
點擊文件名下載附件
|