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, 下载次数: 514)
|