用8051单片机采集显示温度(LED数码管),用C语言怎么写?给出一个套路
# 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);
}