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

標題: 基于51單片機車載空調系統設計Proteus仿真+源程序 [打印本頁]

作者: bbxyliyang    時間: 2023-11-23 19:59
標題: 基于51單片機車載空調系統設計Proteus仿真+源程序
一、系統方案
1、本設計采用這51單片機作為主控器。
2、DS18B20采集溫度值送到液晶1602顯示。
3、按鍵設置報警值。
4、溫度控制風扇檔位。


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

三、單片機軟件設計
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仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優方案。最后根據測試沒問題的仿真圖紙,焊接實物,調試,最終完成本設計的作品。







歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲一区二区av | 日本激情网 | 欧美一区二区三区在线播放 | 成人免费看 | 中文字幕国产 | 天天操天天碰 | 黄色福利 | 成人在线小视频 | 中国一级毛片 | 黄色精品视频 | 国产又黄又猛 | 4438成人网 | 国产精品911 | 国产网站免费 | 久久国产精品一区二区 | 国产成年人视频 | 日韩国产欧美 | 秋霞午夜鲁丝一区二区老狼 | 亚洲国产精品久久久 | 日韩亚洲欧美在线 | 激情做爰呻吟视频舌吻 | 国产一级二级视频 | 三级在线观看 | 国产高清一区二区 | 官场少妇尤物雪白高耸 | 在线免费看黄网站 | 亚洲精品影院 | www精品| 中文字幕三区 | 黄色片网站视频 | 成人一区在线观看 | 色av综合| 蜜桃av一区二区三区 | 欧美激情精品 | 欧美黄色免费网站 | 久久免费精品 | 欧美人与性动交α欧美精品 | 日韩成人精品一区二区 | 欧美午夜精品一区二区三区 | 日韩久久久久久久 | 精品小视频 |