标题:
STC12C5A60S2单片机驱动18b20显示整数,12m晶振 串口全是00
[打印本页]
作者:
maizhi99
时间:
2021-8-13 14:26
标题:
STC12C5A60S2单片机驱动18b20显示整数,12m晶振 串口全是00
STC12C5A60S2驱动18b20显示整数 12m晶振 串口全是00
请各位大佬指教
单片机源程序如下:
#include "STC12C5A60S2.h" //调用51单片机的头文件
#include <Intrins.h>
sbit ds18b20=P3^2;
//---------------------------------------
unsigned char temp1;
unsigned int temp2;
unsigned char xiaoshu1;//小数第一位
unsigned char xiaoshu2;//小数第二位
unsigned char xiaoshu;//两位小数
//---------------------------------------
void Timer0Init(void) //1微秒@12MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xF4; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
/* 微秒延时函数 参数给几 就延时几微秒 */
void delay_us(unsigned int us)
{
while(us--)
{
Timer0Init();
}
}
//---------------------------------------
//名称:复位DS18B20函数
bit Reset(void)
{
bit k;
ds18b20=1;
ds18b20=0; //拉低DQ总线开始复位
delay_us(870); //保持DQ低大约870uS,符合不低于48US的要求
ds18b20=1; //拉高准备接收数据
delay_us(80); //大约80uS后
k=ds18b20; //读出数据并保存
delay_us(400); //维持约400US,符合总读时隙不低于480US的要求
return k; //k=0为复位成功,k=1为复位失败
}
//---------------------------------------
//名称:读一字节函数
unsigned char ReadByte(void)
{
unsigned char j,buf=0;
for(j=0;j<8;j++) //接收8次还原一个字节数据
{
buf=buf>>1; //接收前,想将接收缓冲区右移
ds18b20=0; //拉低
delay_us(2);
ds18b20=1; //拉高,为读数据做准备
delay_us(6);
if(ds18b20==1) buf|=0x80; //读出1位数据保存于buf中
//维持约52US,符合总读时隙不低于60US的要求
delay_us(52);
}
return buf; //退出的同时将接收缓冲区参数返回
}
//---------------------------------------
//名称:写一字节函数
void WriteByte(unsigned char dat)
{
unsigned char j;
for(j=0;j<8;j++)
{
if(dat&0x01) //如果写1
{
ds18b20=0; //拉低
delay_us(2);
ds18b20=1; //拉高
delay_us(63);
}
else //如果写0
{
ds18b20=0; //拉低
delay_us(63);
ds18b20=1; //拉高
delay_us(2);
}
dat=dat>>1; //写入字节右移1位
}
}
//---------------------------------------
//名称:DS18B20温度转换函数
bit Convert()
{
if(Reset()==0) //复位DS18B20
{
WriteByte(0xcc); //写入跳过序列号命令字 Skip Rom
WriteByte(0x44); //写入温度转换命令字 Convert T
return 1; //启动温度转换成功
}
else
{
return 0; //启动温度转换失败
}
}
//---------------------------------------
//名称:转换结束处理函数
void ReadFlash(void)
{
unsigned char Lsb,Msb;
if(Reset()==0) //复位DS18B20
{
WriteByte(0xcc); //写入跳过序列号命令字 Skip Rom
WriteByte(0xbe); //写入读取数据令字 Read Scratchpad
Lsb=ReadByte(); //读出第一个字节暂存于LSB
Msb=ReadByte(); //读出第二个字节暂存于MSB
temp1=Lsb&0x0f; //temp1内装温度参数的小数部分
temp2=(Lsb>>4)|(Msb<<4);//temp2内装温度参数的整数部分
xiaoshu1 = (temp1&0x0f)*10/16; //小数第一位
xiaoshu2 = (temp1&0x0f)*100/16%10;//小数第二位
xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
temp2=((temp2/100)<<8)+(temp2/10%10)*16+(temp2%10);
}
else
{
temp1=0; //如果复位失败,温度参数清零
temp2=0; //如果复位失败,温度参数清零
}
}
void main(void) //主函数,单片机开机后就是从这个函数开始运行
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xC7; //设置定时初始值
TH1 = 0xFE; //设置定时初始值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
while(1) //死循环,单片机初始化后,将一直运行这个死循环
{
if(Convert()==1) //启动转换
{
ReadFlash(); //读取温度
}
SBUF=temp2;
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
}
复制代码
作者:
xuyaqi
时间:
2021-8-13 15:20
查18b20与串口硬件接线是否正确。
作者:
lamcare
时间:
2024-3-17 10:46
你好,请问解决了吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1