欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC12 1T單片機DS18B20溫度檢測仿真+代碼+原理圖
[打印本頁]
作者:
yuchenggong2016
時間:
2018-11-21 22:42
標題:
STC12 1T單片機DS18B20溫度檢測仿真+代碼+原理圖
新人報道。了解學習下
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(14.59 KB, 下載次數: 55)
下載附件
2018-11-22 02:09 上傳
0.png
(32.59 KB, 下載次數: 46)
下載附件
2018-11-22 02:10 上傳
單片機源程序如下:
/*******************************************************************************************/
// 單片機原理與應用課程設計
// 題目:溫度檢測系統設計
// 要點:1、用溫度傳感器18B20測環境溫度,用LCD1602顯示測量結果
// 2、用PROTEUS仿真
// 3、焊接電路板并調試運行
// 出品:濰坊學院信息與控制工程學院
// 編程:戴曰章
// 日期:2014年12月
// 注意:該程序僅供參考。改程序用于STC12C5A60S2單片機。它是1T的指令周期,與傳統的12T的MCU不同
/*******************************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCDIO P1 //1602數據口
sbit DQ=P3^2;//ds18b20與單片機連接口
sbit rs=P2^0; //1602數據命令選擇引腳
sbit rd=P2^1; //讀寫選擇
sbit lcden=P2^2; //1602選通引腳
void DelayXus(uchar n);
void DS18B20_Reset();
void DS18B20_WriteByte(uchar dat);
uchar DS18B20_ReadByte();
float f_temp; //浮點型溫度值
uint tvalue;//溫度值
uchar tflag;
uchar code table[]= {"The temperature "}; //每行顯示16個字符
uchar code table1[]= {"is: 000.0C wfu"};
uchar data disdata[5];
void delay(uint z) //短延時
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //1602寫命令子程序
{
rs=0; //RS是數據命令選擇短,高電平寫數據,低電平寫命令
rd=0; //RD是讀寫選擇短,高電平讀,低電平寫
lcden=0; //1602選通端,高電平選通,低電平禁止
LCDIO =com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date) //1602寫數據子程序
{
rs=1; //RS是數據命令選擇短,高電平寫數據,低電平寫命令
rd=0; //RD是讀寫選擇短,高電平讀,低電平寫
lcden=0; //1602選通端,高電平選通,低電平禁止
LCDIO =date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //1602初始化程序
{
uchar num;
lcden=0;
write_com(0x38); //0011 1000B,功能模式設置,設置為8為數據口,兩行顯示,5*7點陣
write_com(0x0c); //0000 1011B,顯示開及光標設置,關顯示,顯示光標,光標閃爍
write_com(0x06); //0000 0110B,顯示光標移動設置,讀或寫一個字符,地址指針減一且光標減一,寫一個字符屏幕顯示不移動
write_com(0x01); //0000 0001B,顯示清屏,數據指針和所有顯示清屏
write_com(0x80); //1000 000B,關閉顯示
delay(5);
write_com(0x80); //1000 000B,設置為2行顯示,寫入第一行字符的地址,第一行地址是00-2F
for(num=0;num<16;num++)
{
write_date(table[num]); //寫入第一行數據
delay(5);
}
write_com(0x80+0x40); //1100 0000B,設置為2行顯示,寫入第二行字符的地址,第而行地址是40-67
for(num=0;num<16;num++) //寫入第二行數據
{
write_date(table1[num]);//寫入第二行數據
delay(5);
}
}
/**************************************
延時X微秒(STC12C5A60S2@12M)
不同的工作環境,需要調整此函數
此延時函數是使用1T的指令周期進行計算,與傳統的12T的MCU不同
**************************************/
void DelayXus(uchar n)
{
while (n--)
{
_nop_();
_nop_();
}
}
/**************************************
復位DS18B20,并檢測設備是否存在
**************************************/
void DS18B20_Reset()
{
CY = 1;
while (CY)
{
DQ = 0; //送出低電平復位信號
DelayXus(240); //延時至少480us
DelayXus(240);
DQ = 1; //釋放數據線
DelayXus(60); //等待60us
CY = DQ; //檢測存在脈沖
DelayXus(240); //等待設備釋放數據線
DelayXus(180);
}
}
/**************************************
從DS18B20讀1字節數據
**************************************/
uchar DS18B20_ReadByte()
{
uchar i;
uchar dat = 0;
for (i=0; i<8; i++) //8位計數器
{
dat >>= 1;
DQ = 0; //開始時間片
DelayXus(1); //延時等待
DQ = 1; //準備接收
DelayXus(1); //接收延時
if (DQ) dat |= 0x80; //讀取數據
DelayXus(60); //等待時間片結束
}
return dat;
}
/**************************************
向DS18B20寫1字節數據
**************************************/
void DS18B20_WriteByte(uchar dat)
{
char i;
for (i=0; i<8; i++) //8位計數器
{
DQ = 0; //開始時間片
DelayXus(1); //延時等待
dat >>= 1; //送出數據
DQ = CY;
DelayXus(60); //等待時間片結束
DQ = 1; //恢復數據線
DelayXus(1); //恢復延時
}
}
unsigned int ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
DS18B20_Reset(); //設備復位
DS18B20_WriteByte(0xCC); //跳過ROM命令
DS18B20_WriteByte(0x44); //開始轉換命令
while (!DQ); //等待轉換完成
DS18B20_Reset(); //設備復位
DS18B20_WriteByte(0xCC); //跳過ROM命令
DS18B20_WriteByte(0xBE); //讀暫存存儲器命令
a= DS18B20_ReadByte(); //讀溫度低字節
b= DS18B20_ReadByte(); //讀溫度高字節
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
//tvalue=tvalue*(0.425);//溫度值擴大10倍,精確到1位小數
f_temp=tvalue*(0.0625); // 溫度在寄存器中為12位,分辨率為0.0625
tvalue=f_temp*10+0.5; //乘以10表示小數點后面只取1位,加0.5時四舍五入
//f_temp=f_temp+0.05;
//f_temp=tvalue*(0.0625);
//tvalue=f_temp*100+(tvalue>0?0.5:-0.5);
return(tvalue);
}
void ds1820disp()//溫度值顯示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位數
disdata[1]=tvalue%1000/100+0x30;//十位數
disdata[2]=tvalue%100/10+0x30;//個位數
disdata[3]=tvalue%10+0x30;//小數位
if(tflag==0)
flagdat=0x20;//正溫度不顯示符號
else
flagdat=0x2d;//負溫度顯示負號:-
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位為0,不顯示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位為0,十位為0也不顯示
}
}
write_com(0x80+0x44); //1100 0000B,設置為2行顯示,寫入第二行字符的地址,第而行地址是40-67
write_date(flagdat);//顯示符號位
write_com(0x80+0x45);
write_date(disdata[0]);//顯示百位
write_com(0x80+0x46);
write_date(disdata[1]);//顯示十位
write_com(0x80+0x47);
write_date(disdata[2]);//顯示個位
write_com(0x80+0x48);
write_date(0x2e);//顯示小數點
write_com(0x80+0x49);
write_date(disdata[3]);//顯示小數位
write_com(0x80+0x4a);
write_date('C');
}
void main()
{
init();
ReadTemp();//讀取溫度
ds1820disp();//顯示
while(1)
{
ReadTemp();//讀取溫度
ds1820disp();//顯示
}
}
復制代碼
所有資料51hei提供下載:
http://www.raoushi.com/bbs/dpj-142615-1.html
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1