STC12C5A60S2單片機DS18B20溫度顯示工程(LCD1602顯示)的實物圖如下:
實物照片
單片機源程序如下:
- #include<STC12C5A60S2.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include<intrins.h>
- sbit RS = P1 ^ 0; //定義端口
- sbit RW = P1 ^ 1;
- sbit EN = P2 ^ 5;
- sbit DS = P2 ^ 2;
- unsigned char code Table[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
- bit flag;
- unsigned char xdata a, b;
- #define DataPort P0
- /************************LCD1602函數************************/
- /******延時函數******/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /******延時函數******/
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /******判忙函數******/
- bit LCD_Check_Busy(void)
- {
- DataPort = 0xFF;
- RS = 0;
- RW = 1;
- EN = 0;
- _nop_( );
- EN = 1;
- return (bit)(DataPort & 0x80);
- }
- /******寫入命令函數******/
- void LCD_Write_Com(unsigned char com)
- {
- while(LCD_Check_Busy( )); //忙則等待
- RS = 0;
- RW = 0;
- EN = 1;
- DataPort = com;
- _nop_( );
- EN = 0;
- }
- /******寫入數據函數******/
- void LCD_Write_Data(unsigned char Data)
- {
- while(LCD_Check_Busy( )); //忙則等待
- RS = 1;
- RW = 0;
- EN = 1;
- DataPort = Data;
- _nop_( );
- EN = 0;
- }
- /******清屏函數******/
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- DelayMs(5);
- }
- /******寫入字符串函數******/
- void LCD_Write_String(unsigned char x, unsigned char y, unsigned char *s)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x); //表示第一行
- }
- else
- {
- LCD_Write_Com(0xc0 + x); //表示第二行
- }
- while (*s)
- {
- LCD_Write_Data(*s);
- s ++;
- }
- }
- /******寫入字符函數******/
- void LCD_Write_Char(unsigned char x, unsigned char y, unsigned char Data)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xc0 + x);
- }
- LCD_Write_Data(Data);
- }
- /******初始化函數******/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38); /*顯示模式設置*/
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標移動設置*/
- DelayMs(5);
- LCD_Write_Com(0x0c); /*顯示開及光標設置*/
- }
-
- /************************DS18B20函數************************/
- /******延時函數******/
- void DS18B20_Delay(unsigned int j)//延時j * 1us
- {
- unsigned int i;
- for(i = 0; i < j; i ++)
- {
- _nop_( );//@11.0592M晶振(12M晶振:_nop_( );_nop_( );)
- }
-
- }
- /******初始化/復位函數******/
- void DS_Rest( )
- {
- DS = 1;
- DS18B20_Delay(60);
- DS = 0;
- DS18B20_Delay(700);
- DS = 1;
- DS18B20_Delay(150);
- if(DS == 0)
- {
- flag = 1;
- }
- else
- {
- flag = 0;
- }
- DS18B20_Delay(200);
- }
- /******位讀取函數******/
- bit DS_Read_Bit( )
- {
- bit Dat;
- DS = 0;
- _nop_( );_nop_( );
- DS = 1;
- _nop_( );
- Dat = DS;
- DS18B20_Delay(100);
- return Dat;
- }
- /******字節讀取函數******/
- unsigned char DS_Read_Byte( )
- {
- unsigned char idata i, j, k;
- for(i = 0; i < 8; i ++)
- {
- j = DS_Read_Bit( );
- k = (j << 7) | (k >> 1);
- }
- return k;
- }
- /******字節寫函數******/
- void DS_Write_Byte(unsigned char Dat)
- {
- unsigned char idata i;
- for(i = 0; i < 8; i ++)
- {
- DS = 0;
- _nop_( );
- DS = Dat & 0x01;
- DS18B20_Delay(70);
- DS = 1;
- Dat >>= 1;
- }
- DS18B20_Delay(70);
- }
- /******讀取溫度數據函數******/
- void Read_Temperature( )
- {
- unsigned char xdata tvalue_L, tvalue_H;
- float num;
-
- DS_Rest( );
- DS_Write_Byte(0xcc);
- DS_Write_Byte(0xbe);
- tvalue_L = DS_Read_Byte( );
- tvalue_H = DS_Read_Byte( );
- tvalue_H <<= 4;
- tvalue_H += (tvalue_L & 0xf0) >> 4;
- a = tvalue_H;
- num = (tvalue_L & 0x0f) * 0.0625;
- b = (unsigned char)(num * 100);
- }
- /******溫度顯示函數******/
- void DS18B20_Display( )
- {
- LCD_Write_String(0, 0, "The Temperature:");
- LCD_Write_Char(0, 1, Table[a / 10]);
- LCD_Write_Char(1, 1, Table[a % 10]);
- LCD_Write_Char(2, 1, '.');
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
基于STC12C5A60S2的DS18B20溫度顯示工程(LCD1602顯示).zip
(38.93 KB, 下載次數: 515)
2018-4-22 23:16 上傳
點擊文件名下載附件
工程文件(Keil5)
|