久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3959|回復: 3
打印 上一主題 下一主題
收起左側

單片機溫度控制系統液晶顯示自帶存儲Proteus仿真+代碼

[復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
#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)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:108622 發表于 2019-5-12 05:36 | 只看該作者
記憶儲存加什么芯片有沒有直接儲存的程序
回復

使用道具 舉報

板凳
ID:526896 發表于 2019-5-13 21:14 | 只看該作者
溫度顯示部分是不是有問題
回復

使用道具 舉報

地板
ID:532387 發表于 2019-5-14 12:22 | 只看該作者
仿真卡住出不來
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 能看的av | 国产激情在线 | 国产精品视频免费观看 | 久久久久国产精品一区 | 国产精品高潮呻吟 | 国产精品一区久久久久 | 天堂一区在线观看 | 99pao成人国产永久免费视频 | 国产久 | 亚洲国产欧美国产综合一区 | 久久国产一区 | 国产精品久久久久久久久久久久 | 看a网站| 日韩久久久久 | 欧洲视频一区二区 | 日韩精品免费一区二区在线观看 | 色综合久| 亚洲精品在线观看视频 | 日韩中文字幕在线 | 亚洲午夜一区二区 | 国产一级视屏 | 91原创视频在线观看 | 欧美电影免费观看高清 | 二区在线视频 | 久久久精品网 | 国产精品久久欧美久久一区 | 欧美一区二区三区在线观看 | 亚洲综合色视频在线观看 | 日韩视频在线观看中文字幕 | 欧美日韩久久精品 | 亚洲精品国产电影 | 精品中文字幕一区二区 | 亚洲精品久久久一区二区三区 | 日韩中文字幕视频在线 | 日韩欧美在线视频观看 | 玖玖色在线视频 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美日韩综合视频 | 亚洲网站在线 | 黄网免费 | 性天堂网 |