#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ =P3^3; //数据口define interface
sbit LCS =P1^2;
sbit LDATA =P1^1;
sbit LCLK =P1^0;
uint A1; //温度值 variable of temperature
uchar code table[]="0123456789";
uchar table1[]="温度:";
uchar table2[]=".";
uchar table3[]="C";
uchar table4[]="-";
uchar MSB; //温度高字节
uchar LSB; //温度低字节
int t1=0; //温度整数部分数值
uint t2=0; //温度小数部分数值
uchar flag; //负温度标志
/*************精确延时函数*****************/
/*******************************************************************************
* @function delay 1 ms and delay 1us
*
* @param
* @return none
*
* @attention The crystal is 22.1184M Suggest range: 8-12 us
*******************************************************************************/
void Delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Delay_10us(uint xms)
{
uchar i;
for(i=xms;i>0;i--);
}
//延时函数
void delay_us(uchar count)
{
uchar i;
for(i=0;i<count;i++);
}
/*******************************************************************************
* @function write a byte to LCD12232 (serial)
*
* @param datx: data to LCD12232
* @return none
*
* @attention If the SCLK cycle is too short(e.g. 5us) or too long(e.g. 15us),
Suggest range: 8-12 us
*******************************************************************************/
void wrbyte_12232(char datx)
{
char i;
for(i=0; i<8; i++)
{ /* Data = Highest bit */
if(datx & 0x80)
{
LDATA=1; /* Data = 1 */
}
else
{
LDATA=0; /* Data = 0 */
}
LCLK=1;
Delay_10us(10); /* delay 10us */
LCLK=0;
Delay_10us(10); /* delay 10us */
datx = datx << 1; /* next bit */
}
}
/*******************************************************************************
* @function write command to LCD12232 (1st line = 0x80; 2nd line = 0x90)
*
* @param com: the command to LCD12232
* @return none
*******************************************************************************/
void wr_com(char com)
{
LCS=1; /* CS = 1, start serial transfer */
wrbyte_12232(0xf8); /* 1 1 1 1 1 RW RS 0 */
wrbyte_12232(com & 0xf0); /* D7 D6 D5 D4 0 0 0 0 */
wrbyte_12232((com << 4) & 0xf0); /* D3 D2 D1 D0 0 0 0 0 */
LCS=0; /* CS = 0, stop serial transfer */
Delay_10us(100);
}
/*******************************************************************************
* @function write data to LCD12232
*
* @param dat: the data to LCD12232
* @return none
*******************************************************************************/
void wr_data(char dat)
{
LCS=1; /* CS = 1, start serial transfer */
wrbyte_12232(0xfa); /* 1 1 1 1 1 RW RS 0 */
wrbyte_12232(dat & 0xf0); /* D7 D6 D5 D4 0 0 0 0 */
wrbyte_12232((dat << 4) & 0xf0); /* D3 D2 D1 D0 0 0 0 0 */
LCS=0; /* CS = 0, stop serial transfer */
Delay_10us(100);
}
/*******************************************************************************
* @function Initialize LCD12232
*
* @param none
* @return none
*******************************************************************************/
void LCD12232_Init()
{
// P2DIR |= LCS+LDATA+LCLK; /* LCD12232端口初始化 */
Delay(20); /* delay for start LCD */
LCLK=0; /* Initial SCLK */
wr_com(0x30); /*8-bits interface & basic instruction*/
wr_com(0x02); /* clear DDRAM */
wr_com(0x06); /* DIR --> (right , AC++) */
wr_com(0x0c); /* display ON & cursor OFF */
wr_com(0x01); /* clear screen */
}
//初始化DS18B20
void DS18B20Init()
{
uchar x=0;
DQ = 1; //DQ复位
delay_us(9); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_us(80); //精确延时
DQ = 1; //拉高总线
delay_us(15);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_us(25);
}
//读一个字节
uchar ReadByte()
{
uchar i;
uchar ReadData=0;
for(i=0;i<8;i++)
{
DQ=0;
ReadData>>=1;
DQ=1;
if(DQ) ReadData|=0x80;
delay_us(4);
}
return ReadData;
}
//写一个字节
void WriteByte(uchar WriteData)
{
uchar i;
uchar tmpData;
for(i=0;i<8;i++)
{
tmpData=WriteData&0x01;
WriteData>>=1;
if(tmpData)
{
DQ=0;
DQ=1;
delay_us(4);
}
else
{
DQ=0;
delay_us(4);
DQ=1;
}
}
}
void GetT()
{
uchar a;
DS18B20Init(); //复位DS18B20
WriteByte(0xCC); //跳过ROM配置
WriteByte(0x44); //启动温度转换
DS18B20Init();
WriteByte(0xCC);
WriteByte(0xBE); //读温度寄存器
LSB=ReadByte(); //读温度数据低字节
MSB=ReadByte(); //读温度数据高字节
MSB=MSB<<8; //得到温度整数部分
MSB|=LSB;
t2=MSB*625/1000; //得到温度小数部分并扩大10000倍
//计算各位数码管要显示的数值
wr_com(0x80);
for(a=0;a<6;a++)
wr_data(table1[a]);
wr_com(0x80+4);
A1=t2/100;
if(A1==0)
wr_data(' ');
wr_data(table[t1%100/10]);
wr_data(table2[0]);
wr_data(table[t2%10]);
wr_data(table3[0]);
}
void main()
{
LCD12232_Init();
while(1)
{
GetT(); //计算温度
}
}
此帖出自
小平头技术问答
先要保证液晶能显示数。
一周热门 更多>