用8051单片机采集显示温度(LED数码管),用C语言怎么写?给出一个套路

# include & ltreg52.h & gt//包含头文件,一般不需要更改。头文件包含特殊功能寄存器的定义。

# include & ltstdio.h & gt

#包含“18b20.h”

#包含“1602.h”

#包含“delay.h”

位ReadTempFlag//定义读取时间戳

void Init _ timer 0(void);//定时器初始化

/* -

串行通信初始化

- */

void UART_Init(void)

{

SCON = 0x 50;// SCON:模式1,8位UART,使能接收。

TMOD | = 0x 20;//tmod:定时器1,模式2,8位重载。

th 1 = 0x FD;// TH1:重新加载晶振,波特率为9600+01.0592mhz。

tr 1 = 1;// TR1:定时器1开启。

//EA = 1;//打开主机中断

//ES = 1;//打开串行端口中断

TI = 1;

}

/* -

主要功能

- */

无效总管(无效)

{

内部温度;

浮子温度;

char显示温度[16];//定义显示区域临时存储数组。

LCD _ Init();//初始化液晶

戴莱姆斯(20);//延迟有助于稳定。

LCD _ Clear();//清除屏幕

init _ timer 0();

UART _ Init();

LCD _ User _ Chr();//编写自定义字符

LCD_Write_String(0,0,“www.doflye.net”);

LCD_Write_Char(13,1,0x 01);//写上温度的右上角。

LCD_Write_Char(14,1,' C ');//写入字符c

While (1) //主循环

{

if(ReadTempFlag==1)

{

ReadTempFlag = 0;

temp = read temperature();

温度=(浮点)temp * 0.0625

sprintf(displaytemp," Temp % 7.3f ",温度);//打印温度值

LCD_Write_String(0,1,display temp);//显示第二行

}

}

}

/* -

定时器初始化子程序

- */

void Init_Timer0(void)

{

TMOD | = 0x 01;//使用1和16位定时器,使用多个定时器时使用“|”符号不受影响。

//TH0 = 0x 00;//给定初始值

//TL0 = 0x 00;

EA = 1;//总中断打开

ET0 = 1;//定时器中断打开

TR0 = 1;//定时器开关打开

}

/* -

定时器中断子程序

- */

无效定时器0_isr(无效)中断1

{

静态无符号整数;

TH0 =(65536-2000)/256;//重新分配2毫秒的值

TL0 =(65536-2000)% 256;

num++;

if(num==300) //

{

num = 0;

ReadTempFlag = 1;//读取标志位置1

}

}

/* -

名称:LCD1602

论坛:www.doflye.net

十方写的

日期:2009年5月

修改:无

内容:

管脚定义如下:1-VSS 2-vdd 3-v04-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK。

- */

#包含“1602.h”

#包含“delay.h”

sbit RS = p2^4;//定义端口

sbit rw = p2^5;

sbit en = p2^6;

#定义RS_CLR RS=0

#define RS_SET RS=1

#定义RW_CLR RW=0

#define RW_SET RW=1

#define EN_CLR EN=0

#define EN_SET EN=1

#定义数据端口P0

/* -

繁忙决策功能

- */

位LCD_Check_Busy(void)

{

数据端口= 0xFF

RS _ CLR

RW _ SET

EN _ CLR

_ nop _();

EN _ SET

返回(位)(数据端口& amp0x 80);

}

/* -

写命令功能

- */

void LCD_Write_Com(无符号字符Com)

{

//while(LCD _ Check _ Busy());//忙就等。

戴莱姆斯(5);

RS _ CLR

RW _ CLR

EN _ SET

DataPort = com

_ nop _();

EN _ CLR

}

/* -

写数据功能

- */

void LCD_Write_Data(无符号字符数据)

{

//while(LCD _ Check _ Busy());//忙就等。

戴莱姆斯(5);

RS _ SET

RW _ CLR

EN _ SET

DataPort=数据;

_ nop _();

EN _ CLR

}

/* -

清除屏幕功能

- */

void LCD_Clear(void)

{

LCD _ Write _ Com(0x 01);

戴莱姆斯(5);

}

/* -

写字符串函数

- */

void LCD_Write_String(无符号字符x,无符号字符y,无符号字符*s)

{

如果(y == 0)

{

LCD _ Write _ Com(0x 80+x);//指示第一行。

}

其他

{

LCD _ Write _ Com(0xc 0+x);//表示第二行。

}

while (*s)

{

LCD _ Write _ Data(* s);

s++;

}

}

/* -

写字符功能

- */

void LCD_Write_Char(无符号字符x、无符号字符y、无符号字符数据)

{

如果(y == 0)

{

LCD _ Write _ Com(0x 80+x);

}

其他

{

LCD _ Write _ Com(0xc 0+x);

}

LCD_Write_Data(数据);

}

/* -

初始化功能

- */

void LCD_Init(void)

{

LCD _ Write _ Com(0x 38);/*显示模式设置*/

戴莱姆斯(5);

LCD _ Write _ Com(0x 38);

戴莱姆斯(5);

LCD _ Write _ Com(0x 38);

戴莱姆斯(5);

LCD _ Write _ Com(0x 38);

LCD _ Write _ Com(0x 08);/*显示关闭*/

LCD _ Write _ Com(0x 01);/*显示清晰的屏幕*/

LCD _ Write _ Com(0x 06);/*显示光标移动设置*/

戴莱姆斯(5);

LCD _ Write _ Com(0x0C);/*显示开启和光标设置*/

}

/* -

设置两个自定义字符,自定义字符在LCD1602中的地址为0x00 - 0x07。

您可以定义8个字符。

这里我们将自定义字符设置为0x00 (000)。

另一个放在位置0x001 (001)。

- */

void Lcd_User_Chr(void)

{//第一个自定义字符

LCD _ Write _ Com(0x 40);//"01 000 000 "行1地址(D7D6是以地址设置命令的形式?D5D4D3是字符存储位置(0-7),D2D1D0是字符行地址(0-7))。

LCD _ Write _ Data(0x 00);//" XXX 1111 "行1数据(D7D6D5为XXX,表示为任意数字(一般为000),D4D3D2D1D0为字符行数据(1

LCD _ Write _ Com(0x 41);//"01 000 001 "第2行地址

LCD _ Write _ Data(0x 04);//"XXX 10001 "第2行数据

LCD _ Write _ Com(0x 42);//"01 000 010 "第三行地址

LCD _ Write _ Data(0x0e);//"XXX 10101 "第3行数据

LCD _ Write _ Com(0x 43);//地址在“01 000 011”的第4行

LCD _ Write _ Data(0x0e);//"XXX 10001 "第4行数据

LCD _ Write _ Com(0x 44);//"01 000 100 "第5行地址

LCD _ Write _ Data(0x0e);//“XXX 11111”数据在第5行。

LCD _ Write _ Com(0x 45);//"01 000 101 "第6行地址

LCD _ Write _ Data(0x 1f);//"XXX 01010 "第6行数据

LCD _ Write _ Com(0x 46);//"01 000 110 "第7行地址

LCD _ Write _ Data(0x 04);//" XXX 11111 "第7行数据

LCD _ Write _ Com(0x 47);//" 01 000 111 "第8行地址

LCD _ Write _ Data(0x 00);//"XXX 00000 "第8行数据

//第二个自定义字符

LCD _ Write _ Com(0x 48);//“01 001 000”地址在第1行

LCD _ Write _ Data(0x 03);//"XXX 00001 "行1数据

LCD _ Write _ Com(0x 49);//地址在“01 001 001”的第2行

LCD _ Write _ Data(0x 03);//“XXX 11011”数据在第2行

LCD _ Write _ Com(0x4a);//"01 001 010 "第3行地址

LCD _ Write _ Data(0x 00);//" XXX 11101 "第3行数据

LCD _ Write _ Com(0x4b);//“01 001 01”地址在第四行。

LCD _ Write _ Data(0x 00);//"XXX 11001 "第4行数据

LCD _ Write _ Com(0x4c);//"01 001 100 "第5行地址

LCD _ Write _ Data(0x 00);//" XXX 11101 "数据在第5行

LCD _ Write _ Com(0x4d);//" 01 001 101 "第6行地址

LCD _ Write _ Data(0x 00);//" XXX 11011 "第6行数据

LCD _ Write _ Com(0x4e);//" 01 001 110 "第7行地址

LCD _ Write _ Data(0x 00);//"XXX 00001 "第7行数据

LCD _ Write _ Com(0x4f);//" 01 001 11 "第8行地址

LCD _ Write _ Data(0x 00);//"XXX 00000 "第8行数据

}

#包含“delay.h”

#包含“18b20.h”

/* -

18b20初始化

- */

位Init_DS18B20(空)

{

位dat = 0;

DQ = 1;//DQ复位

delayus 2x(5);//有点延迟

DQ = 0;//单片机拉低DQ。

dela Yus 2x(200);//精确延迟大于480us小于960us。

dela Yus 2x(200);

DQ = 1;//拉高总线

德拉尤斯2x(50);//15~60us然后接收60-240us存在脉冲。

dat = DQ;//如果x=0,初始化成功,如果x=1,初始化失败。

德拉尤斯2x(25);//稍微延迟返回

返回dat

}

/* -

读取一个字节

- */

无符号字符ReadOneChar(void)

{

无符号字符I = 0;

无符号字符dat = 0;

for(I = 8;我& gt0;我-)

{

DQ = 0;//给出脉冲信号

dat & gt& gt=1;

DQ = 1;//给出脉冲信号

if(DQ)

dat | = 0x80

德拉尤斯2x(25);

}

return(dat);

}

/* -

写入一个字节

- */

void WriteOneChar(无符号字符数据)

{

无符号字符I = 0;

for(I = 8;我& gt0;我-)

{

DQ = 0;

DQ =日期与时间;0x 01;

德拉尤斯2x(25);

DQ = 1;

dat & gt& gt=1;

}

德拉尤斯2x(25);

}

/* -

读数温度

- */

无符号整数读取温度(void)

{

无符号字符a = 0;

无符号int b = 0;

无符号整数t = 0;

init _ ds 18b 20();

WriteOneChar(0x cc);//跳过读取序列号和列号。

WriteOneChar(0x 44);//开始温度转换

delay ms(10);

init _ ds 18b 20();

WriteOneChar(0x cc);//跳过读取序列号和列号。

WriteOneChar(0x be);//读取温度寄存器(* * *可以读取9个寄存器),前两个是温度。

a = ReadOneChar();//低位

b = ReadOneChar();//高位

b & lt& lt=8;

t = a+b;

返回(t);

}