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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1351|回復: 0
收起左側

基于51單片機車載空調系統設計Proteus仿真+源程序

[復制鏈接]
ID:190577 發表于 2023-11-23 19:59 | 顯示全部樓層 |閱讀模式
一、系統方案
1、本設計采用這51單片機作為主控器。
2、DS18B20采集溫度值送到液晶1602顯示。
3、按鍵設置報警值。
4、溫度控制風扇檔位。
1.jpg

二、硬件設計
原理圖如下:
2.jpg

三、單片機軟件設計
1、首先是系統初始化
/*******************T0初始化********************/
void init_t0()
{
  //TMOD=0x01;//定時器0工作方式1
        TH0=(65536-100)/256;//賦初值定時
        TL0=(65536-100)%256;//0.01ms
        EA=1;//開總中斷
        ET0=1;//開定時器0中斷
        TR0=1;//啟動定時器0

        SCON = 0X50;  //UART方式1;8位UART
        REN  = 1;     //允許串行口接收數據
        PCON = 0x00;  //SMOD=0;波特率不加倍
        TMOD = 0x21;  //T1方式2,用于產生波特率
        TH1  = 0xFD;  //裝初值
        TL1  = 0xFD;
        TR1  = 1;     //啟動定時器1
        EA   = 1;     //打開全局中斷控制
        ES   = 1;     //打開串行口中斷        

}
2、液晶顯示程序
/*******************************************************************
                  寫命令
************************************************************************/
void xiemingling(unsigned char mingling)
{
  en=0;
  rs=0;
  rw=0;
  P0=mingling;
  delayxms(5);
  en=1;
  delayxms(10);
  en=0;
}
/*******************************************************************
                  寫數據
************************************************************************/
void xieshuju(unsigned char shuju)
{   
  en=0;
  rs=1;
  rw=0;
  P0=shuju;
  delayxms(5);
  en=1;
  delayxms(10);
  en=0;
}
/*******************************************************************
                  液晶初始化
************************************************************************/
void chushihua()
{
  en=0;
  xiemingling(0x38);//設置16*2顯示,5*7點陣,8位數據接口
  delayxms(20);
  xiemingling(0x0c);//設置開顯示,不顯示光標
  delayxms(20);
  xiemingling(0x06);//寫一個字符后地址指針加1
  delayxms(20);
  xiemingling(0x01);//顯示清零,數據指針清零
  delayxms(20);
  xiemingling(0x80);//指定字符顯示的實際地址,,,顯示位置的確定方法規定為"80H+地址碼x"
  delayxms(20);
}
/***********************lcd1602上顯示這字符函數************************/
void write_string(uchar hang,uchar add,uchar *p)
{
        if(hang==1)   
                xiemingling(0x80+add);
        else
                xiemingling(0x80+0x40+add);
                while(1)                                                                                                                 
                {
                        if(*p == '\0')  break;
                        xieshuju(*p);
                        p++;
                }        
}
/***********************lcd1602上顯示2位十進制數************************/
void write_num2(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                xiemingling(0x80+add);
        else
                xiemingling(0x80+0x40+add);
        xieshuju(0x30+date/10);
        xieshuju(0x30+date%10);        
}
/***********************lcd1602上顯示1位十進制數************************/
void write_num1(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                xiemingling(0x80+add);
        else
                xiemingling(0x80+0x40+add);
        xieshuju(0x30+date%10);        
}
3、DS18B20程序
/***************************初始化****************************************/
Init_DS18B20(void)
{  
     DQ = 1;      //DQ復位
     Delay(8);    //稍做延時
     DQ = 0;      //將DQ拉低
     Delay(90);   //精確延時 大于 480us
     DQ = 1;       //拉高總線
     Delay(8);
     presence = DQ;    //讀取存在信號
     Delay(100);
     DQ = 1;
     return(presence); //返回信號,0=presence,1= no presence
}
/***************************讀一位****************************************/
uchar read_bit(void)
{
   uchar i;
   DQ = 0;                      //將DQ 拉低開始讀時間隙
   DQ = 1;                         // then return high
   for (i=0; i<3; i++);         // 延時15μs
   return(DQ);                         // 返回 DQ 線上的電平值
}
/***************************讀一個字節****************************************/
uchar ReadOneChar(void)
{
   uchar i = 0;
   uchar dat = 0;

  for (i=0;i<8;i++)
  {                     // 讀取字節,每次讀取一個字節
    if(read_bit())
        dat|=0x01<<i;           // 然后將其左移

    Delay(4);
  }
    return (dat);
}
/***************************寫一位****************************************/
void write_bit(uchar bitval)
{
  DQ = 0;                                        // 將DQ 拉低開始寫時間隙
  if(bitval==1) DQ =1;          // 如果寫1,DQ 返回高電平
  Delay(5);                                       // 在時間隙內保持電平值,
  DQ = 1;                      // Delay函數每次循環延時16μs,因此delay(5) = 104μs
}        
/***************************寫一個字節****************************************/
void WriteOneChar(uchar dat)
{
  uchar i = 0;
  uchar temp;

   for (i=0; i<8; i++)         // 寫入字節, 每次寫入一位
   {
   temp = dat>>i;                 
   temp &= 0x01;                 
   write_bit(temp);
  }
  Delay(5);
}
/*------------------------------------------------
                    單個DS18B20  讀取溫度
------------------------------------------------*/
int ReadTemperature()
{               
                uchar a;
    uchar b;
                Init_DS18B20();
                WriteOneChar(0xCC); // 跳過讀序號列號的操作
                WriteOneChar(0x44); // 啟動溫度轉換
                delayxms(10);
                Init_DS18B20();
                WriteOneChar(0xCC); //跳過讀序號列號的操作
                WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
                a = ReadOneChar();   //低位
                b = ReadOneChar();   //高位
                t = b;
                t <<= 8;
            t |= a;

                if(t < 0)                   //溫度為負數
                {
                        flag_temp = 1;
                        t -= 1;
                        t = ~t;
                        t = t * 0.0625;//溫度值擴大-倍,精確到-位小數
                }
                else
                {
                        flag_temp = 0;  
                        t = t * 0.0625;//溫度值擴大-倍,精確到-位小數
                }
                return(t);
}
4、核心算法程序
if(number==0)
                   {
                           /*根據溫度控制檔位*/
                           if(t<alarm)
                           {
                              dangwei = 0;

                                         PWM1=0;
                                  TR0=0;
                                  pwm(0); //控制PWM輸出,進而控制電機的速度

                           }
                           else if(t<alarm+5)
                           {
                               dangwei = 1;

                                   TR0=1;
                                   pwm(20); //控制PWM輸出,進而控制電機的速度
                           }
                           else if(t<alarm+10)
                           {
                              dangwei = 2;

                                   TR0=1;
                                   pwm(50); //控制PWM輸出,進而控制電機的速度
                           }
                           else
                           {
                              dangwei = 3;

                                   TR0=1;
                                  pwm(99); //控制PWM輸出,進而控制電機的速度
                           }
四、 proteus仿真設計
Proteus軟件是一款應用比較廣泛的工具,它可以在沒有硬件平臺的基礎上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設定的目的,避免我們搭建實物的時候,如果當初選擇的方案有問題,我們器件都已經焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優方案。最后根據測試沒問題的仿真圖紙,焊接實物,調試,最終完成本設計的作品。


評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九福利 | 成人三级av | 99国产精品视频免费观看一公开 | 国产一区二区三区免费观看在线 | 久久av网 | wwwxx在线观看 | 久久久做 | 国产精品成人一区二区三区 | 99久久婷婷国产综合精品首页 | 中文字幕av第一页 | 一级做受毛片免费大片 | 欧美色性 | 欧美日韩国产精品一区 | 午夜三区 | 日韩在线一区二区三区 | 国产精品视频二区三区 | 性生生活大片免费看视频 | 亚洲在线一区 | 国产综合网址 | 久久国产一区二区三区 | 天天干天天草 | 久国产精品 | 美日韩视频 | 一区二区免费在线观看 | 精品一区二区av | 日本不卡一区二区三区 | 91porn国产成人福利 | 91精品国产综合久久精品 | 国产98色在线 | 日韩 | 欧美高清成人 | 91色网站 | www.日本在线 | 日本欧美国产 | 国产伦精品一区二区 | 欧美成ee人免费视频 | 国产精品一区二 | 欧美成年人网站 | 国产精品天堂 | 欧美福利视频一区 | 国产欧美日韩久久久 | 伊人一二三 |