欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1