stc8k8h64u基于DS18B20和上位机显示的数字温度计设计,汇编语言代码怎么写
时间: 2024-02-12 20:05:25 浏览: 98
以下是基于STC8单片机以汇编语言实现的DS18B20数字温度计设计代码:
```
#include <reg52.h>
#include <intrins.h>
typedef unsigned char byte;
typedef unsigned int word;
sbit DQ=P2^4; // DS18B20数据线接在P2.4上
byte code temp_table[]={ // DS18B20温度转换表
0x0c,0x1c,0x2c,0x3c,0x4b,0x5b,0x6b,0x7b,
0x8a,0x9a,0xaa,0xba,0xc9,0xd9,0xe9,0xf9
};
void delay(word i) // 延时函数
{
while(i--);
}
void ds18b20_init() // DS18B20初始化函数
{
DQ=1; // 数据线输入1
delay(8);
DQ=0; // 发送复位脉冲
delay(80);
DQ=1; // 释放数据线
delay(8);
}
void write_byte(byte dat) // 写入一个字节的数据
{
byte i;
for(i=0; i<8; i++)
{
DQ=0; // 发送数据位
_nop_();
DQ=dat&0x01;
delay(5);
DQ=1; // 释放数据线
dat>>=1;
}
}
byte read_byte() // 读取一个字节的数据
{
byte i,dat=0;
for(i=0; i<8; i++)
{
dat>>=1;
DQ=0; // 发送读取命令
_nop_();
DQ=1;
_nop_();
dat|=(DQ<<7);
delay(5);
}
return dat;
}
void convert() // DS18B20转换函数
{
ds18b20_init(); // 发送初始化命令
write_byte(0xcc); // 跳过ROM操作
write_byte(0x44); // 启动温度转换
}
byte get_temp() // 获取温度值函数
{
byte temp_l,temp_h;
ds18b20_init(); // 发送初始化命令
write_byte(0xcc); // 跳过ROM操作
write_byte(0xbe); // 发送读取温度命令
temp_l=read_byte(); // 读取温度值低字节
temp_h=read_byte(); // 读取温度值高字节
return (temp_h<<4)+(temp_l>>4); // 返回温度值
}
void main()
{
byte temp;
while(1)
{
convert(); // 发送转换命令
delay(1000); // 等待转换完成
temp=get_temp(); // 获取温度值
P1=temp_table[temp>>4]; // 在P1口显示温度值
}
}
```
这段代码实现了DS18B20数字温度计的初始化、温度转换和读取温度值等功能,并将温度值在P1口进行显示。你可以根据自己的需要进行修改和调整。
阅读全文