配置DS18B20完成数码管显示温度功能; 2)完善数码管显示的同时利用串口将数据发送到电脑串口传输助手上,51单片机AT89C52的代码
时间: 2024-02-23 18:02:09 浏览: 86
好的,这里是AT89C52单片机的代码示例,实现DS18B20完成数码管显示温度功能并利用串口将数据发送到电脑串口传输助手上:
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DQ P3_7
sbit DQ = P3^7;
sbit LATCH = P2^0;
sbit DIO = P2^1;
sbit CLK = P2^2;
uchar code DIGITS[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //共阳数码管
void delay(uint t)
{
while(t--);
}
void write_ds18b20(uchar dat)
{
uchar i;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = dat & 0x01;
_nop_();
_nop_();
DQ = 1;
dat >>= 1;
}
}
uchar read_ds18b20()
{
uchar i, dat = 0;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
dat = (dat >> 1) | (DQ << 7);
}
return dat;
}
void init_ds18b20()
{
DQ = 1;
_nop_();
_nop_();
DQ = 0;
delay(480);
DQ = 1;
delay(60);
}
void convert_ds18b20()
{
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0x44);
}
uchar read_temp()
{
uchar temp_l, temp_h;
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0xbe);
temp_l = read_ds18b20();
temp_h = read_ds18b20();
return (temp_h << 4) | (temp_l >> 4);
}
void send_byte(uchar dat)
{
uchar i;
for(i = 0; i < 8; i++)
{
CLK = 0;
DIO = dat & 0x01;
dat >>= 1;
CLK = 1;
}
}
void send_data(uchar dat)
{
uchar i;
send_byte(0x08);
send_byte(0x00);
for(i = 0; i < 8; i++)
{
CLK = 0;
DIO = dat & 0x01;
dat >>= 1;
CLK = 1;
}
send_byte(0x0c);
}
void display_temp(uchar temp)
{
uchar shiwei, gewei;
shiwei = temp / 10;
gewei = temp % 10;
LATCH = 0;
P0 = DIGITS[shiwei];
LATCH = 1;
delay(1000);
LATCH = 0;
P0 = DIGITS[gewei];
LATCH = 1;
delay(1000);
}
void main()
{
uchar temp;
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
while(1)
{
convert_ds18b20();
delay(1000);
temp = read_temp();
display_temp(temp);
send_data(temp);
}
}
```
在这个代码中,我们定义了一些常量和变量,其中`DIGITS`数组存储了共阳数码管的数码段码;`delay`函数用于延时;`write_ds18b20`函数用于向DS18B20写入数据;`read_ds18b20`函数用于读取DS18B20的数据;`init_ds18b20`函数用于初始化DS18B20;`convert_ds18b20`函数用于进行温度转换;`read_temp`函数用于读取DS18B20转换后的温度值;`send_byte`和`send_data`函数用于通过串口发送数据;`display_temp`函数用于将温度值显示在数码管上。
在`main`函数中,我们首先设置了串口通信的波特率,然后进入一个无限循环中,不断进行温度转换、读取温度值、显示温度值和通过串口发送温度值的操作。
希望这个代码示例能够帮助您完成您的项目!
阅读全文