久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機數字溫度計+燈光報警的proteus仿真+注釋詳細的源碼
[打印本頁]
作者:
HENRY223
時間:
2018-8-22 09:11
標題:
51單片機數字溫度計+燈光報警的proteus仿真+注釋詳細的源碼
制作出來的實物圖如下:
0.jpg
(100.19 KB, 下載次數: 69)
下載附件
2018-8-22 16:47 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
#include<reg52.h> //包含reg52.h庫文件
#include<math.h> //包含絕對值函數
#define uint unsigned int //宏定義uint
#define uchar unsigned char //宏定義uchar
sbit lcden=P2^0; //液晶使能端
sbit lcdrw=P2^1;
sbit lcdrs=P2^2; //液晶數據命令選擇端選擇寫數據還是寫命令
sbit DQ = P2^3; //通過DQ口讀取溫度值
sbit s1=P1^2; //選擇按鍵
sbit s2=P1^7; //加按鍵
sbit s3=P3^3; //減按鍵
sbit D1=P3^4; //高溫報警燈
sbit D2=P1^3; //低溫報警燈
uchar temp_value,num,fig,s1num,figh,figl,t; //設置全局無符號字符型變量
char h,l; //設置全局有符號字符型變量
void delay(uint z); //申明延時程序
void init(); //申明LCD初始化程序
void write_com(uchar com); //申明寫命令程序
void write_data(uchar date); //申明寫數據程序
void keyscan(); //申明按鍵掃描程序
void write_hl(uchar add,char date); //申明設置的最高低溫度值在LCD上顯示程序
void write_temp_value(uchar add,char date); //申明溫度值在LCD上顯示程序
void delay_18B20(unsigned int i); //申明延時程序
void Init_DS18B20(void); //申明DS18B20初始化程序
unsigned char ReadOneChar(void); //申明ds18b20讀一個字節
void WriteOneChar(uchar dat); //申明ds18b20讀一個字節
void ReadTemp(void); //申明讀取ds18b20當前溫度
void comp();
void main()
{
init(); //LCD初始化
Init_DS18B20(); //DS18B20初始化
while(1) //大循環
{ if(s1==0||s1num>=1)
{ keyscan(); //按鍵掃描
}
else{ ReadTemp(); //讀取溫度值
write_temp_value(0,temp_value); //LCD顯示溫度值
}
comp();
}
}
void delay(uint z) //延時程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //LCD初始化程序
{ lcden=0;
lcdrw=0;
write_com(0x38); //設置16x2 顯示5x7 點陣,8 位數據接口
write_com(0x0c); //設置開始顯示不顯示光標
write_com(0x06); //寫一個字符后地址指針加1
write_com(0x01); //顯示清零數據指針清零
write_com(0x80); //將數據指針第一行第一個字處,
write_com(0x80+9); //定義當前指針位置
write_data('H'); //寫入
write_data(':'); //寫入
write_data('+'); //寫入
write_data('2'); //寫入
write_data('0'); //寫入
write_data(0xdf); //寫入°
write_data('C'); //寫入C
write_com(0x80+9+0x40); //定義當前指針位置
write_data('L'); //寫入
write_data(':'); //寫入
write_data('+'); //寫入
write_data('1'); //寫入
write_data('0'); //寫入
write_data(0xdf); //寫入°
write_data('C'); //寫入C
h=0x14; //h=+20
l=0+0x0a; //l=+10
D1=1;
D2=1;
figh=0; //給正確初始值,便于上電比較
figl=1; //給正確初始值,便于上電比較
}
void write_com(uchar com) //寫命令程序
{ lcdrs=0; //設置為寫入命令
P0=com; //將命令賦給P0 口
delay(5); //延時
lcden=1; //打開LCD使能,輸入一個高脈沖
delay(5); //延時
lcden=0; //置低完成高脈沖
}
void write_data(uchar date) //寫數據程序
{ lcdrs=1; //設置為寫入數據
P0=date; //將數據賦給P0 口
delay(5); //延時
lcden=1; //打開LCD使能,輸入一個高脈沖
delay(5); //延時
lcden=0; //置低完成高脈沖
}
void write_temp_value(uchar add,char date) //讀取的溫度值在LCD上顯示程序
{ uchar bai,shi,ge;
bai=date/100;
shi=date%100/10;
ge=date%10; //分離出百,十,個位數
if((bai|shi)==0) //如果百十都等于0
shi=0x70; //十賦值0x70,以便十位寫入空字符,write_data(0x30+shi),參考1602字符圖形碼
if(bai==0)
bai=0x70;
write_com(0x80+add); //設置當前光標位置,準備寫數據
if(fig==0&&shi!=0x70) //如果溫度為負且十位不等于0(如果十位等于0,shi=0x70)
{ write_data('-'); //在百位寫入負號
write_data(0x30+shi); //寫入十位數據
}
if(fig==0&&shi==0x70) //如果溫度為負且百十位都等于0
{ write_data(0x30+0x70); //在百位寫入一個空字符
write_data('-'); //在十位寫入負號
}
if(fig==1)write_data(0x30+bai); //溫度正,寫入百位數據
if(fig==1)write_data(0x30+shi); //溫度正,寫入十位數據
write_data(0x30+ge); //寫入個位數據
write_data(0xdf); //寫入°
write_data('C'); //寫入C
}
void write_hl(uchar add,char date) //設置的高低溫度值在LCD上顯示程序
{ uchar bai,shi,ge;
bai=date/100;
shi=date%100/10;
ge=date%10; //分離出百,十,個位數
write_com(0x80+add); //設置當前光標位置,準備寫數據
if(t==1&&shi!=0) //如果溫度為負且十位不等于0(如果十位等于0,shi=0x70) 負數:百位第1種情況,寫-
{ write_data('-');} //在百位寫入負號
if(t==1&&shi==0) //如果溫度為負且百十位都等于0 負數:百位第2種情況,寫空
{ write_data(0x30+0x70); //在百位寫入一個空字符
write_data('-'); //在十位寫入負號 負數:十位第1種情況,寫-
}
if(t==1&&shi!=0) //如果溫度為負且十不等于0 負數:十位第2種情況,寫數
{write_data(0x30+shi);} //在十位寫入數據
if(t==0&&bai==0&&shi!=0) //否則溫度為正,如果bai=0且shi!=0 正數:百位第1種情況,寫+
{write_data('+');} //在百位寫入+
if(t==0&&bai==0&&shi==0) //否則溫度為正,如果bai=0且shi=0 正數:百位第2種情況,寫空
{write_data(0x30+0x70);} //在百位寫入一個空字符
if(t==0&&bai!=0)
{write_data(0x30+bai);} //否則百位為正不等于0,寫入百位數 正數:百位第3種情況,寫數
if(t==0&&bai==0&&shi==0&&ge!=0) //如果百十等于0,個不等于0 正數:十位第1種情況,寫+
{write_data('+');} //在十位寫入+
if(t==0&&bai==0&&shi==0&&ge==0) //如果百十個都等于0
{write_data(' ');} //在十位寫入空字符 正數:十位第2種情況,寫空
if(t==0&&shi!=0)
{write_data(0x30+shi);} //在十位寫入數 正數:十位第3種情況,寫數
write_data(0x30+ge); //寫入個位數據
}
/***********ds18b20子程序*************************/
/***********ds18b20延遲子函數(晶振12MHz )*******/
void delay_18B20(unsigned int i)
{
while(i--);
}
/**********ds18b20初始化函數**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay_18B20(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay_18B20(80); //精確延時 大于 480us
DQ = 1; //拉高總線
delay_18B20(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay_18B20(20);
}
/***********ds18b20讀一個字節**************/
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20寫一個字節****************/
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/**************讀取ds18b20當前溫度************/
void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
delay_18B20(100); // this message is very important
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
delay_18B20(100);
a=ReadOneChar(); //讀取溫度值低位
b=ReadOneChar(); //讀取溫度值高位
// a=0xff; //測試無法讀取-16度的問題
// b=0xfe;
temp_value=b<<4; //temp_value=b左移動4位 , 轉換成10進制
temp_value+=(a&0xf0)>>4; //temp_value=temp_value+((a&0xf0)>>4) 轉換成10進制
fig=0x01; //設置fig=1溫度正
if(temp_value>0x7f) //如果temp_value大于0x7f,即為負數區,參考DS18B20datasheet
{fig=0; //設置fig=0溫度負,以便判斷顯示
a=~a+1; //將讀取的溫度轉換成10進制數
b=~b;
temp_value=b<<4; //temp_value=b左移動4位 , 轉換成10進制
temp_value+=(a&0xf0)>>4; //temp_value=temp_value+((a&0xf0)>>4) 轉換成10進制
}
}
void keyscan() //按鍵掃描
{ if(s1==0) //如果s1按下,執行下面程序
{ delay(5); // 延時一會
if(s1==0) //如果s1確實按下,執行下面程序
{ s1num++; //s1num自加1
while(!s1); //如果s1松開,執行下面程序,否則一直停在這
if(s1num==1) //如果s1只按一次,執行下面
{
write_com(0x80+13); //設置當前指針位置
write_com(0x0f); //寫入光標閃爍命令
}
if(s1num==2) //如果s1按2次,執行下面
{
write_com(0x80+0x40+13); //設置當前指針位置,光標閃
}
if(s1num==3) //如果s1按3次,執行下面
{ s1num=0; //s1num清0
write_com(0x0c); //寫入光標不閃爍命令
}
}
}
if(s2==0) //如果s2按下,執行下面程序
{ delay(5); //延時
if(s2==0); //如果s2按下,執行下面程序
{
while(!s2); //如果s2松開,執行下面程序,否則一直停在這
if(s1num==1) //如果光標在h的位置閃爍,執行下面程序
{ h++; //h加1
if(h==127) //=127清0
h=0;
figh=0; //設置figh=0,符號為正
t=figh; //賦值給t,以便液晶顯示
if(h<=-1) //如果h為負數
{figh=1; //設置figh=0
t=figh; //賦值給t,以便液晶顯示
h=abs(h); //h取絕對值
write_hl(11,h); //h寫入LCD
h=0-h; //把h變回原來的負數
}
else{write_hl(11,h);} //否則h寫入LCD
write_com(0x80+13); //光標在溫度值位置閃爍
}
if(s1num==2) //如果光標在l的位置閃爍,執行下面程序
{ l++;
if(l==127)
l=0;
figl=0;
t=figl;
if(l<=-1)
{figl=1;
t=figl;
l=abs(l);
write_hl(0x40+11,l);
l=0-l;
}
else{write_hl(0x40+11,l);}
write_com(0x80+0x40+13);
}
}
}
if(s3==0) //如果s3按下,執行下面程序
{ delay(5); //延時
if(s3==0);
{
while(!s3); //s3松開后,執行下面程序
if(s1num==1) //如果光標在h的位置閃爍,執行下面程序
{ h--; //h自減1
if(h==-55) //如果h=-55清0
h=0;
figh=0; //設置figh=0,溫度值為正
t=figh; //賦值給t,以便液晶顯示
if(h<=-1) //如果h溫度值為負數
{figh=1; //設置figh=1
t=figh; //賦值給t,以便液晶顯示
h=abs(h); //h取絕對值
write_hl(11,h); //h寫入LCD
h=0-h; //把h變回原來的負數
}
else{write_hl(11,h);} //否則h寫入LCD
write_com(0x80+13); //光標在溫度值位置閃爍
}
if(s1num==2)
{ l--;
if(l==-55)
h=0;
figl=0;
t=figl;
if(l<=-1)
{figl=1;
t=figl;
l=abs(l);
write_hl(0x40+11,l);
l=0-l;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
數字溫度計+報警HENRY.rar
(343.8 KB, 下載次數: 453)
2018-8-22 16:48 上傳
點擊文件名下載附件
數字溫度計+報警HENRY
下載積分: 黑幣 -5
作者:
李325
時間:
2018-9-13 10:52
贊,清晰明了
作者:
2551357568
時間:
2018-9-17 22:42
樓主你這個用stm32做要改程序嗎
作者:
小貓貓愛吃魚
時間:
2018-9-17 23:38
2551357568 發表于 2018-9-17 22:42
樓主你這個用stm32做要改程序嗎
兩種單片機的程序完全不一樣的,要重新寫
作者:
葉少
時間:
2018-12-12 21:07
用c52改成c51ma?
作者:
gude
時間:
2019-1-14 18:24
大佬我想問一下你這個DS18B20_V1.3.c文件打不開,我該怎么做
作者:
gude
時間:
2019-1-14 18:32
請問文件溫度HENRY.c和DS18B20_V1.3.c怎么打開,我用AltiumDesigner打不開
作者:
gude
時間:
2019-1-14 18:37
樓主請問一下你有沒有ad制圖文件
作者:
GTT2
時間:
2019-4-29 14:11
贊,這篇文章很收益 謝謝UP主
作者:
gchq521
時間:
2019-10-31 14:52
好東西~感謝樓主~
作者:
遙望、星空
時間:
2019-11-8 17:51
請問樓主,圖中的PNP有沒有具體型號呢,還是其他型號的也可以?
作者:
416659851
時間:
2019-11-23 11:23
為啥這個調試的時候,提示出現關鍵性錯誤呢?
可以了,原來這個仿真必須要用Proteus7.5這個版本才可以,其他版本都不行
作者:
陌上★
時間:
2019-11-26 21:10
請問樓主,把DS18B20換成熱敏電阻,需要改哪些程序,謝謝
作者:
無風雨同舟
時間:
2019-11-26 23:51
樓主辛苦了,感謝分享
作者:
heywhat
時間:
2020-3-4 08:04
上面給的是lcd顯示,下面資料變成了數碼管,而且protues仿真圖一點都不一樣.
作者:
guodongyu1
時間:
2020-4-13 21:46
這個程序不動
作者:
guodongyu1
時間:
2020-4-13 21:48
這個程序不動
作者:
溫存1
時間:
2020-6-23 17:40
真是好厲害
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
新疆少妇videos高潮
|
成人精品一区二区
|
日韩国产免费
|
91免费观看
|
亚洲三级国产
|
欧美精品一区在线
|
69亚洲精品
|
国产精品久久久久aaaa九色
|
日韩成人在线免费观看
|
久久久久国产一区二区三区四区
|
久久99精品久久久久久国产越南
|
一区二区国产精品
|
国产精品免费视频一区
|
成人亚洲网
|
亚洲九色
|
久久久久无码国产精品一区
|
中文字幕在线视频精品
|
欧美爱爱视频
|
久久国产精品一区二区三区
|
久久y
|
亚洲一区国产精品
|
国产成人精品一区二区在线
|
日韩欧美亚洲一区
|
视频一区在线
|
成人免费在线小视频
|
成人在线视频观看
|
视频精品一区二区三区
|
五月婷婷婷
|
一区二区国产精品
|
日韩成人久久
|
成人深夜福利
|
9999在线视频
|
91在线精品一区二区
|
成人一区精品
|
激情伊人网
|
午夜免费
|
国产成人一区二区
|
亚洲精品视
|
91久久精品国产
|
自拍偷拍一区二区三区
|
欧美性精品
|