仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
截圖01.png (35.4 KB, 下載次數: 34)
下載附件
2019-5-8 23:04 上傳
0.png (21.12 KB, 下載次數: 37)
下載附件
2019-5-8 23:37 上傳
0.png (8.05 KB, 下載次數: 34)
下載附件
2019-5-8 23:38 上傳
0.png (4.82 KB, 下載次數: 37)
下載附件
2019-5-8 23:38 上傳
單片機源程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="NOW is:" ;
uchar table1[]="HH:0000" ; //超溫報警值初始為0
uchar code table2[]="LH:0000" ;//超溫報警值初始為0
unsigned char code wendu[]="0123456789" ;
uint count,shi,fen,miao,s1number,s2,tempH,tempL;
sbit Le=P2^5;
sbit RS=P1^0;
sbit RW=P1^1;
sbit key1=P3^4; //設置按鍵
sbit key2=P3^5; //加操作按鍵
sbit key3=P3^6; //減操作按鍵
sbit scl=P1^2;
sbit sda=P1^3;
sbit DQ=P2^2; //DS18B20數據接口
sbit DQ1=P2^1; //DS18B20數據接口
sbit speak=P2^6; //蜂鳴器接口
sbit led=P2^7; //指示燈報警接口
sbit jiangwen=P2^3; // 降溫指示燈接口
sbit jiare=P2^4;///加熱指示接口
uchar num;
uint num1,num2,temper;
//**********************延時1毫秒**************************//
void delay (uint m)
{
uint x,y;
for(x=m;x>0;x-- )
for(y=120;y>0;y--);
}
//*******************************掉電存儲芯片讀寫程序*****************************//
void delay1()
{
;;
}
void start() //起始信號
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}
void stop() //停止信號
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
void respons() //應答信號
{
uchar i;
scl=1;
delay1();
while((sda==1)&&(i<250)) i++; //等待sdA變低電平
scl=0;
delay1();
}
void init1() //2402c初始化
{
sda=1;
scl=1;
}
void write_byte(uchar date) //寫一個字節
{
uchar i,temp;
temp=date;
scl=0;
for(i=0;i<8;i++)
{
temp=temp<<1; //從高至低依次寫入
sda=CY;
delay1();
scl=1;
delay1();
scl=0;
delay1();
}
sda=1;
delay1();
}
uchar read_byte() //讀一個字節
{
uchar i,j,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i<8;i++)
{
scl=1;
delay1();
j=sda;
k=(k<<1)|j; //定義變量K每左移一次與J相與,變量K的地址從低到高依次存儲數據的高到低位
scl=0;
delay1();
}
return k;
}
void write_data1(uchar a,uchar value) //寫數據
{
start();
write_byte(0xa0);
respons();
write_byte(a);
respons();
write_byte(value);
respons();
stop();
}
uchar read_data(uchar a) //讀數據
{
uchar date;
start();
write_byte(0xa0); //寫器件地址
respons();
write_byte(a); //寫內容
respons();
start();
write_byte(0xa1); //讀器件地址
respons();
date=read_byte(); //將讀取的內容存儲變量data
stop();
return date;
}
//*****************************液晶1602顯示程序******************************************/
void write_com(uchar com ) //讀數據狀態
{
RS=0;
P0=com;
delay(5);
Le=1;
delay(5);
Le=0;
}
void write_data(uchar date ) //讀數據狀態
{
RS=1;
P0=date;
delay(5);
Le=1;
delay(5);
Le=0;
}
//一液晶初始化
void init()
{
RW=0;
write_com(0x38); //基本功能設置
write_com(0x0c); //光標開關設置
write_com(0x06);
write_com(0x01); //清屏設置
}
void write_sfm( uchar add, uchar date) //寫入數據
{
uchar bai,shi,ge;
bai=date/100;
shi=date%100/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
void LCDstring_write(uchar x,uchar y,uchar *s) //寫入字符串
{
if(y==0)
write_com(0x80+x);
else
write_com(0xc0+x);
while(*s)
{
write_data(*s);
s++;
}
}
//**************************按鍵掃描函數********************//
void keyscan() //按鍵掃描處理
{
if(key1==0)
{
delay(5); //消除抖動
if(key1==0)
{
while(!key1);
led=1;
speak=1;
jiangwen=1;
jiare=1;
s1number++;
if(s1number==1)
{
write_com(0xc0+6);
write_com(0x0f); //第二行7位置開始閃爍
}
}
if(s1number==2)
{
write_com(0x0f);
write_com(0xc0+14); //第二行15位置開始閃爍
}
if(s1number==3)
{
s1number=0;
write_com(0x0c); //閃爍取消
}
}
}
//**************************報警值操作函數*********************//
void jiajian() //按鍵數值操作
{
if(s1number!=0)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
if(s1number==1)
{
tempH++;
if(tempH>200) //大于200度時清零
tempH=0;
write_sfm(3,tempH); //顯示按鍵操作值
write_com(0xc0+5);
write_data1(3,tempH); //寫入掉電存儲芯片
delay(100); //稍微作延遲
}
if(s1number==2)
{
tempL++;
if(tempL>200)
tempL=0;
write_sfm(11,tempL);
write_com(0xc0+13);
write_data1(5,tempL);
delay(100);
}
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
if(s1number==1)
{
tempH--;
if(tempH<=0)
tempH=200;
write_sfm(3,tempH);
write_com(0xc0+5);
write_data1(3,tempH);
delay(100);
}
if(s1number==2)
{
tempL--;
if(tempL<=0)
tempL=200;
write_sfm(11,tempL);
write_com(0xc0+13);
write_data1(5,tempL);
delay(100);
}
}
}
}
}
//*********************************DS18B20溫度獲取函數*****************/
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1; //DQ復位
DelayUs2x(5); //稍做延時
DQ = 0; //單片機將DQ拉低
DelayUs2x(200); //精確延時 大于 480us 小于960us
DelayUs2x(200);
DQ = 1; //拉高總線
DelayUs2x(50); //15~60us 后 接收60-240us的存在脈沖
dat=DQ; //如果x=0則初始化成功, x=1則初始化失敗
DelayUs2x(25); //稍作延時返回
return dat;
}
/*------------------------------------------------
讀取一個字節
------------------------------------------------*/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
DelayUs2x(25);
}
return(dat);
}
/*------------------------------------------------
寫入一個字節
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
DelayUs2x(25);
DQ = 1;
dat>>=1;
}
DelayUs2x(25);
}
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
//**************DS18B20溫度采集函數***************//
bit Init_DS18B20_a(void)
{
bit dat=0;
DQ1 = 1; //DQ復位
DelayUs2x(5); //稍做延時
DQ1 = 0; //單片機將DQ拉低
DelayUs2x(200); //精確延時 大于 480us 小于960us
DelayUs2x(200);
DQ1 = 1; //拉高總線
DelayUs2x(50); //15~60us 后 接收60-240us的存在脈沖
dat=DQ1; //如果x=0則初始化成功, x=1則初始化失敗
DelayUs2x(25); //稍作延時返回
return dat;
}
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="NOW is:" ;
uchar table1[]="HH:0000" ; //超溫報警值初始為0
uchar code table2[]="LH:0000" ;//超溫報警值初始為0
unsigned char code wendu[]="0123456789" ;
uint count,shi,fen,miao,s1number,s2,tempH,tempL;
sbit Le=P2^5;
sbit RS=P1^0;
sbit RW=P1^1;
sbit key1=P3^4; //設置按鍵
sbit key2=P3^5; //加操作按鍵
sbit key3=P3^6; //減操作按鍵
sbit scl=P1^2;
sbit sda=P1^3;
sbit DQ=P2^2; //DS18B20數據接口
sbit DQ1=P2^1; //DS18B20數據接口
sbit speak=P2^6; //蜂鳴器接口
sbit led=P2^7; //指示燈報警接口
sbit jiangwen=P2^3; // 降溫指示燈接口
sbit jiare=P2^4;///加熱指示接口
uchar num;
uint num1,num2,temper;
//**********************延時1毫秒**************************//
void delay (uint m)
{
uint x,y;
for(x=m;x>0;x-- )
for(y=120;y>0;y--);
}
//*******************************掉電存儲芯片讀寫程序*****************************//
void delay1()
{
;;
}
void start() //起始信號
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}
void stop() //停止信號
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
void respons() //應答信號
{
uchar i;
scl=1;
delay1();
while((sda==1)&&(i<250)) i++; //等待sdA變低電平
scl=0;
delay1();
}
void init1() //2402c初始化
{
sda=1;
scl=1;
}
void write_byte(uchar date) //寫一個字節
{
uchar i,temp;
temp=date;
scl=0;
for(i=0;i<8;i++)
{
temp=temp<<1; //從高至低依次寫入
sda=CY;
delay1();
scl=1;
delay1();
scl=0;
delay1();
}
sda=1;
delay1();
}
uchar read_byte() //讀一個字節
{
uchar i,j,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i<8;i++)
{
scl=1;
delay1();
j=sda;
k=(k<<1)|j; //定義變量K每左移一次與J相與,變量K的地址從低到高依次存儲數據的高到低位
scl=0;
delay1();
}
return k;
}
void write_data1(uchar a,uchar value) //寫數據
{
start();
write_byte(0xa0);
respons();
write_byte(a);
respons();
write_byte(value);
respons();
stop();
}
uchar read_data(uchar a) //讀數據
{
uchar date;
start();
write_byte(0xa0); //寫器件地址
respons();
write_byte(a); //寫內容
respons();
start();
write_byte(0xa1); //讀器件地址
respons();
date=read_byte(); //將讀取的內容存儲變量data
stop();
return date;
}
//*****************************液晶1602顯示程序******************************************/
void write_com(uchar com ) //讀數據狀態
{
RS=0;
P0=com;
delay(5);
Le=1;
delay(5);
Le=0;
}
void write_data(uchar date ) //讀數據狀態
{
RS=1;
P0=date;
delay(5);
Le=1;
delay(5);
Le=0;
}
//一液晶初始化
void init()
{
RW=0;
write_com(0x38); //基本功能設置
write_com(0x0c); //光標開關設置
write_com(0x06);
write_com(0x01); //清屏設置
}
void write_sfm( uchar add, uchar date) //寫入數據
{
uchar bai,shi,ge;
bai=date/100;
shi=date%100/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
void LCDstring_write(uchar x,uchar y,uchar *s) //寫入字符串
{
if(y==0)
write_com(0x80+x);
else
write_com(0xc0+x);
while(*s)
{
write_data(*s);
s++;
}
}
//**************************按鍵掃描函數********************//
void keyscan() //按鍵掃描處理
{
if(key1==0)
{
delay(5); //消除抖動
if(key1==0)
{
while(!key1);
led=1;
speak=1;
jiangwen=1;
jiare=1;
s1number++;
if(s1number==1)
{
write_com(0xc0+6);
write_com(0x0f); //第二行7位置開始閃爍
}
}
if(s1number==2)
{
write_com(0x0f);
write_com(0xc0+14); //第二行15位置開始閃爍
}
if(s1number==3)
{
s1number=0;
write_com(0x0c); //閃爍取消
}
}
}
//**************************報警值操作函數*********************//
void jiajian() //按鍵數值操作
{
if(s1number!=0)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
if(s1number==1)
{
tempH++;
if(tempH>200) //大于200度時清零
tempH=0;
write_sfm(3,tempH); //顯示按鍵操作值
write_com(0xc0+5);
write_data1(3,tempH); //寫入掉電存儲芯片
delay(100); //稍微作延遲
}
if(s1number==2)
{
tempL++;
if(tempL>200)
tempL=0;
write_sfm(11,tempL);
write_com(0xc0+13);
write_data1(5,tempL);
delay(100);
}
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
if(s1number==1)
{
tempH--;
if(tempH<=0)
tempH=200;
write_sfm(3,tempH);
write_com(0xc0+5);
write_data1(3,tempH);
delay(100);
}
if(s1number==2)
{
tempL--;
if(tempL<=0)
tempL=200;
write_sfm(11,tempL);
write_com(0xc0+13);
write_data1(5,tempL);
delay(100);
}
}
}
}
}
//*********************************DS18B20溫度獲取函數*****************/
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1; //DQ復位
DelayUs2x(5); //稍做延時
DQ = 0; //單片機將DQ拉低
DelayUs2x(200); //精確延時 大于 480us 小于960us
DelayUs2x(200);
DQ = 1; //拉高總線
DelayUs2x(50); //15~60us 后 接收60-240us的存在脈沖
dat=DQ; //如果x=0則初始化成功, x=1則初始化失敗
DelayUs2x(25); //稍作延時返回
return dat;
}
/*------------------------------------------------
讀取一個字節
------------------------------------------------*/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
DelayUs2x(25);
}
return(dat);
}
/*------------------------------------------------
寫入一個字節
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
DelayUs2x(25);
DQ = 1;
dat>>=1;
}
DelayUs2x(25);
}
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
//**************DS18B20溫度采集函數***************//
bit Init_DS18B20_a(void)
{
bit dat=0;
DQ1 = 1; //DQ復位
DelayUs2x(5); //稍做延時
DQ1 = 0; //單片機將DQ拉低
DelayUs2x(200); //精確延時 大于 480us 小于960us
DelayUs2x(200);
DQ1 = 1; //拉高總線
DelayUs2x(50); //15~60us 后 接收60-240us的存在脈沖
dat=DQ1; //如果x=0則初始化成功, x=1則初始化失敗
DelayUs2x(25); //稍作延時返回
return dat;
}
全部資料51hei下載地址:
溫度控制系統仿真(電路圖).rar
(199.67 KB, 下載次數: 73)
2019-5-8 23:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|