日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

51单片机、DS18B20、智能窗帘控制系统

發布時間:2024/1/1 windows 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机、DS18B20、智能窗帘控制系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 寫在最前面:文章是我的設計報告搬運過來的,嫌排版亂的,可以直接下載設計報告,包含word,keil工程,proteus工程
  • !!!!!!全部文件下載地址
  • 項目意義

21世紀是科技飛速發展的時代,隨著國民經濟的發展和科學技術水平的提高,特別是計算機技術,通信技術,網絡技術,控制技術的迅猛發展,生活現代化得以實現,居住環境向舒適化,安全化發展,智能家居也隨之應運而生。由于我國的科技剛剛發展起來,各種科技產品還明顯的落后于發達國家,人民的生活也剛剛開始富裕起來,許多智能系統也剛剛在我國興起。但是,發展前景卻廣闊。這種系統可以為我們營造出高效、舒適、便捷的居住環境。并且它可以牽動一大批產業。

如此廣泛的應用,他的前景也必將非常廣闊。隨著科學技術的飛速發展,人們的生活觀念也在漸漸的發生轉變。各種家電也在發生著變化。由于單片機技術和計算機技術的的不斷成熟,家電越來越智能化。窗簾也不例外,在歐美等發達國家,智能窗簾系統已廣泛應用。智能窗簾在國內算是高端前沿產業,市場廣闊,有推廣和應用的意義,在發達的歐美市場智能窗簾已經并不新鮮,已經廣泛運用于平常百姓家中,所以有必要在國內推廣。 隨著現代社會的高速發展,人們對室內設計智能化的要求也越來越高,相對于傳統的窗簾,智能窗簾更能滿足人們對于生活品質的追求。在一年四季中,隨著不同的季節、氣候,人們對于窗簾打開與閉合的需求是不同的;在每一天中,隨著天氣的變化及時間段的不同,人們對于窗簾打開與閉合的需求也是不一致的。尤其在智能家居領域克服傳統的窗簾的許多缺點,為人們提供了更方便、快捷、舒適安全的生活環境,提供了人類的生活質量。

智能窗簾控制系統的控制方式大體上有三種:光控,時控,遙控。遙控屬于半自動類;而光控屬于全自動式,因光敏器件的靈敏度較高,十分適合窗簾控制系統的數據采集端。因此,設計一款價格低廉,結構簡單,靈敏度高,抗干擾能力強,實現光控、手動控制功能為一體的智能窗簾,具有十分重要的意義。

?

二、總體設計方案


本設計包括硬件和軟件設計兩個部分。模塊劃分為數據采集、按鍵控制、液晶顯示。電路結構可劃分為:溫度傳感器、光照傳感器(用可調電阻代替光敏電阻)、單片機控制電路。本系統采用AT89C51單片機作為核心控制單元,主控芯片將測得的數值與設定值進行比較,并顯示在LCD1602液晶顯示屏上,當測得的光照度小于或大于設定距離時,控制窗簾開閉。系統總體的設計方框圖如圖1所示。

  • 光照傳感器由光敏電阻和ADC0804模數轉換芯片組成。光敏電阻又稱光導管,具有在特定波長的光照射下,其阻值迅速減小的特性。這是由于光照產生的載流子都參與導電,在外加電場的作用下作漂移運動,電子奔向電源的正極,空穴奔向電源的負極,從而使光敏電阻器的阻值迅速下降。光敏電阻屬半導體光敏器件,除具靈敏度高,反應速度快,光譜特性及r 值一致性好等特點外,在高溫,多濕的惡劣環境下,還能保持高度的穩定性和可靠性,可廣泛應用于照相機,太陽能庭院燈,草坪燈,驗鈔機,石英鐘,音樂杯,禮品盒,迷你小夜燈,光聲控開關,路燈自動開關以及各種光控玩具,光控燈飾,燈具等光自動開關控制領域。

    由于本設計是基于仿真軟件來實現的,所以利用電位器分壓來模擬光敏電阻的功能。其電阻值大小變化與光照強度成負相關。

    A/D 轉換送入單片機的 P1 接口,單片機處理后輸出命令控制電機正轉或者反轉,以實現通過光照控制窗簾的開關功能。

    應用光控原理工作,天亮窗簾自動打開,天黑窗簾自動關閉。由于光敏電阻信號檢測后得到的是模擬信號,所以光控電路采集到的模擬信號需要經過A/D 轉換后輸出數字信號給單片機。A/D 轉換的作用是進行模數轉換,把接收到的模擬信號轉換成數字信號輸出。在選擇 A/D 轉換時,先要確定 A/D 轉換精度、轉換速度以及轉換位數等,A/D 轉換的位數確定與整個測量控制系統所需測量控制的范圍和精度有關,由于單片機IO口的限制,本設計采用了單通道8 位 A/D 轉換器 ADC0804。VCC接電源,A GND、D GEN、VIN-接地;CLK IN接入500khz的時鐘信號,RD是數據讀寫端,低電平讀取數據;WR是AD轉換開啟信號,接收到下降沿即開啟AD轉換,轉換結束后再INTR端輸出一個低電平,由于本設計需要連續讀取模擬信號,所以INTR引腳可以懸空。VIN+是正極性模擬量輸入;DB0-DB7是數據輸出端,接入單片機的P1口。硬件電路如圖所示。

  • LCD1602液晶顯示電路
  • LCD1602簡介:LCD1602液晶顯示器是廣泛使用的一種字符型液晶顯示模塊。它是由字符型液晶顯示屏、控制驅動主電路HD44780及其擴展驅動電路HD44100,以及少量電阻、電容元件和結構件等裝配在PCB板上而組成。

    顯示原理:點陣圖形式液晶由M×N個顯示單元組成,假設LCD顯示屏有64行,每行有128列,每8列對應1字節的8位,即每行由16字節,共16×8=128個點組成。顯示屏上64×16個顯示單元與顯示RAM區的1024字節相對應,每一字節的內容與顯示屏上相應位置的亮暗對應。例如顯示屏第一行的亮暗由RAM區的000H~00FH的16字節的內容決定,當(000H)=FFH時,屏幕左上角顯示一條短亮線,長度為8個點;當(3FFH)=FFH時,屏幕右下角顯示一條短亮線;當(000H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H時,在屏幕的頂部顯示一條由8條亮線和8條暗線組成的虛線。這就是LCD顯示的基本原理。

    字符型液晶顯示模塊是一種專門用于顯示字母、數字和符號等的點陣式LCD,常用16×1,16×2,20×2和40×2等的模塊。一般的LCD1602字符型液晶顯示器的內部控制器大部分為HD44780,能夠顯示英文字母、阿拉伯數字、日文片假名和一般性符號。?

    為了讓要顯示的數據直觀的顯示出來,本設計選用成本較低,控制方便的LCD1602液晶顯示模塊,硬件電路如圖5所示。D0-D7為數據線;RS為數據命令選擇端,高電平時選擇數據寄存器、低電平時選擇指令寄存器;RW為讀寫選擇端,高電平時進行讀操作,低電平時進行寫操作。E為使能信號端。VDD接電源正極,VSS接地。

    ?

    圖5 LCD1602液晶顯示電路

  • 本設計選用的溫度傳感器是DS18B20。DS18B20是常用的數字溫度傳感器,其輸出的是數字信號,具有體積小,硬件開銷低,抗干擾能力強,精度高的特點。DS18B20數字溫度傳感器接線方便,封裝成后可應用于多種場合。

    單總線是Dallas 的一項專有技術。與目前多數標準串行數據通信方式,如SPI/I2C/MICROWIRE 不同,它采用單根信號線,既傳輸時鐘,又傳輸數據,而且數據傳輸是雙向的。它具有節省 I/O 口線資源、結構簡單、成本低廉、便于總線擴展和維護等諸多優點。1-wire 單總線適用于單個主機系統,能夠控制一個或多個從機設備。當只有一個從機位于總線上時,系統可按照單節點系統操作;而當多個從機位于總線上時,則系統按照多節點系統操作。單總線要求外接一個約5k 的上拉電阻。這樣,單總線的閑置狀態為高電平。不管什么原因,如果傳輸過程需要暫時掛起,且要求傳輸過程還能夠繼續的話,則總線必須處于空閑狀態。位傳輸之間的恢復時間沒有限制,只要總線在恢復期間處于空閑狀態(高電平)。如果總線保持低電平超過 480us,總線上的所有器件將復位。另外在寄生方式供電時,為了保證單總線器件在某些工作狀態下(如溫度轉換期間 EEPROM寫入等)具有足夠的電源電流,必須在總線上提供強上拉,如圖6所示。

    典型的單總線命令序列如下 :

    第一步:初始化

    第二步:ROM命令(跟隨需要交換的數據 )

    第三步:功能命令(跟隨需要交換的數據)

    每次訪問單總線器件,必須嚴格遵守這個命令序列,如果出現序列混亂,則單總線器件不會響應主機。但是,這個準則對于搜索 ROM命令和報警搜索命令例外,在執行兩者中任何一條命令之后,主機不能執行其后的功能命令,必須返回至第一步。

    具體的時序操作會在軟件設計部分展開。

    ?

    圖6 溫度傳感器電路

  • 5.步進電機驅動電路

    窗簾的開閉動力來源于步進電機。步進電機驅動能力范圍內,其輸出的角位移或線位移與輸入的脈沖個數成正比,不因電源電壓、負載變化和環境條件等的變化而變化。所以其輸出的角速度或線速度也與輸入的脈沖頻率成正比,通過改變輸入脈沖頻率的高低就可以調節步進電機的轉速,并能控制步進電機的快速啟動,暫停,正反轉和加減速等。由于步進電機具有步距誤差不積累、運行可靠、結構簡單、慣性小、成本低等優點,因此,被廣泛使用于計算機外圍電路、自動化控制裝置以及其他的數字控制裝置中,如打印機、鐘表、數模轉換設備等裝置中。

    驅動芯片:使用驅動芯片 ULN2003A。ULN2003A芯片可以直接處理數字信號,例如經過數字邏輯電子電路產生的脈沖信號。該芯片的內部結構由7個NPN達林頓管組成的,并且每一對達林頓管都分別與一個基極電阻串聯。通常被廣泛應用于單片機、 PLC、儀表電器等控制驅動電路中。特點是電流增益高、 工作電壓高、驅動能力強、穩定性能好、體積小、價格低廉等等。

    步進電機:本設計選用的步進電機屬于四相八拍電機,輸入電壓范圍為直流5V-12V。當步進電機輸入一系列連續的脈沖信號時,步進電機按照相應的運行狀態,轉動相應的角度。例如,當輸入步進電機的通電狀態改變一次時,相應的轉子也就轉過對應的一個步距角,與之相對。步進電機驅動電路如圖7所示。

    圖7 步進電機驅動電路

  • 系統軟件設計
  • LCD1602驅動程序
  • LCD1602的驅動程序包括:

  • LCD1602初始化函數:void InitLcd1602();
  • ?

  • LCD1602忙檢測函數:void Read_Busy();
  • 在每次相LCD1602寫入數據前,都要讀取其工作狀態,空閑時方可寫入。

    ?

  • LCD1602寫命令函數:void Lcd1602_Write_Cmd(uchar cmd);
  • 1602 液晶模塊內部的控制器共有 11 條控制指令,1602 液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現的。

    ?

  • LCD1602寫數據函數:void Lcd1602_Write_Data(uchar dat);
  • 在配置命令函數運行完之后,就可以給1602液晶配置顯示數據

    ?

  • 顯示字符函數:void DisplayOneChar(uchar X, uchar Y, uchar DData);
  • 為了讓1602液晶顯示字符,編寫顯示函數,在內部調用寫命令函數和寫數據函數。

    ?

  • DS18B20驅動程序
  • 本設計的重點是DS18B20的驅動程序。由于其采用單總線協議,對于時序的要求及其嚴格,必須嚴格遵守其操作時序。

  • 初始化
  • unsigned char DS18B20_Init() //初始化

    {

    uchar i;

    DQ = 0;??????????????? //將總線拉低

    i = 90;????

    while(i--);//延時700us

    ?????? DQ = 1;??????????????? //然后拉高總線,如果DS18B20做出反應會將在15us~60us

    后總線拉低

    i = 0;

    while(DQ)???? //等待DS18B20拉低總線

    {

    ??????? Delay1ms(1);

    ??????? i++;

    ??????? if(i>7)//等待>5MS

    ??????? {

    ?????????????? return 0;//初始化失敗

    ??????? }

    }

    return 1;//初始化成功

    }

  • 寫命令
  • void DS18B20_Write(uchar dat) //寫命令

    {

    uint i, j;

    for(j=0; j<8; j++)

    {

    ??????? DQ = 0;? ???? ???? ??//每寫入一位數據之前先把總線拉低1us

    ??????? i++;

    ??????? DQ = dat & 0x01;? //然后寫入一個數據,從最低位開始

    ??????? i=8;

    ??????? while(i--); //延時68us,持續時間最少60us

    ??????? DQ = 1;? //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值

    ??????? dat >>= 1;

    }

    }

    ?

  • 開始溫度轉換
  • DS18B20_Write(0xcc); //跳過ROM操作命令????????

    ?????? DS18B20_Write(0x44); //溫度轉換命令

    ?

  • 讀取ROM
  • DQ = 0;//先將總線拉低1us

    i++;

    DQ = 1;//然后釋放總線

    i++;

    i++;//延時6us等待數據穩定

    b = DQ;? //讀取數據,從最低位開始讀取

    byte = (byte >> 1) | (b << 7);

    i = 4;???????????? //讀取完之后等待48us再接著讀取下一個數

    return byte;

    ?

    ?????? TEMPL = DS18B20_Read();?????? //讀取溫度值共16位,先讀低字節

    ?????? TEMPH = DS18B20_Read();?????? //再讀高字節

    ?????? TEMP = TEMPH;

    ?????? TEMP <<= 8;

    ?????? TEMP |= TEMPL;

    ?????? return TEMP;

    ?

  • ADC0804 驅動
  • ADC 0804接收電位器的模擬量輸入,轉換成8位的數字量送入單片機處理。由于采用連續ADC方式,而一次AD轉換時間遠小于一次機器周期,所以INTR引腳可以懸空,以節省IO資源。此算法適用于大多數單總線協議器件,以下是部分重要算法:

    void ADC_Init()

    {

    ? ADCWR=0;

    ?????? delay(1);

    ? ADCWR=1;?? //上升沿,內部寄存器清零,鎖存地址

    }

    void ADC()? //模擬光敏電阻功能

    {

    ?????? ADCRD=0;????? //輸出轉換得到的數據

    ?????? LUX=P1;??????

    ?????? ADCRD=1;??? //讀結果

    ?????? LUX=LUX*39/1000;? //5V電壓分為0~255級 放大到10V

    ?????? LV=9-LUX;

    }

    ?

    ?

    ?

    ?

    五、系統調試

    單片機程序編寫采用keil5集成開發環境,仿真軟件選用proteus8.6。仿真結果如下圖8所示。

    單片機檢測SW引腳電平,當switch閉合后,就關閉相應中斷,這時是自動模式,這時OPEN和CLOSE 再按下就無效了。

    在軟件編程和仿真調試中,發現兩個問題:一是由于DS18B20采用單總線協議,所以其時序操作必須嚴格遵守技術手冊,不然就會出現溫度無法讀取、數據錯誤等一系列問題。在數據讀取的過程中,其先讀取的是低字節在讀取高位字節,由于編程書寫錯誤,導致溫度數值遲遲不能正常獲取,排查多次后,終于發現。二是本仿真中LCD1602通過lable標簽的方式和IO口相連,標簽格式是D0-D7;但是在ADC0804的數據總線中,也采用了LBL標簽,并且格式也是D0-D7,一時的疏忽讓我付出了慘重的代價,仿真時,LCD顯示不正常,IO口提示黃色短路狀態,由于沒用遇到過這種情況,當時也不清楚實際的錯誤在哪,我排查了一晚上,在快要崩潰的時候,發現LBL標簽沖突了!遂更改標簽格式,仿真正常。

    ?

    ?
    ?

    ?

    ?

    ?

    ?

    圖8 仿真效果圖

    最后是主函數的代碼:

    #include<reg51.h> #include"LCD1602.h" #include"DS18B20.h" sbit SW = P3^6; //模式切換 sbit ADCRD = P3^0; //低電平輸出 sbit ADCWR = P3^1; //低電平開啟adc bit gate=1; //自動開關使能位 1有效 uchar minlux = 5; //光照閾值緩存器 uint LUX; //光照度緩存器 uchar LV; //光照等級 uchar sign; //符號位 uchar TEMPtitle[4] = "TEMP"; //顯示溫度title uchar ADCtitle[8] = "Min:Now:" ; //顯示光照title uchar code ASCII[10] = {'0','1','2','3','4','5','6','7','8','9'};//顯示字庫 uchar cw[8] = {0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //正轉 uchar acw[8] = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //反轉void delay(uint x) //延時 1 ms {uint i,j;for(i=x;i>0;i--)for(j=120;j>0;j--); } void ADC_Init() {ADCWR=0;delay(1);ADCWR=1; //上升沿,內部寄存器清零,鎖存地址 } void ADC() //模擬光敏電阻功能 {ADCRD=0; //輸出轉換得到的數據LUX=P1; //讀結果ADCRD=1; LUX=LUX*39/1000; //5V電壓分為0~255級 放大到10V,等級L0-L9LV=9-LUX;DisplayOneChar(5, 1, 'L');DisplayOneChar(6, 1,ASCII[minlux] ); //光照閾值DisplayOneChar(13, 1, 'L');DisplayOneChar(14, 1, ASCII[LV]); //顯示光照等級delay(1); } void Motor_cw() //正轉 {uchar i;uchar j=2;while(j--){for(i=0;i<8;i++){ P2=cw[i];delay(100);}} } void Motor_acw() //反轉 {uchar i;uchar j=2;while(j--){for(i=0;i<8;i++){ P2=acw[i];delay(100);}} } void AutoControl() //每到一次閾值啟動電機轉兩圈就停止 {if(gate==1) {if(LV==minlux){Motor_cw();gate=0;}}else if(gate==0){if(LV==(minlux-1)){Motor_acw();gate=1;}}else gate=1; } void int0() interrupt 0 //手動開啟窗簾 {Motor_acw(); } void int1() interrupt 2 //手動關閉窗簾 {Motor_cw(); } void INC() interrupt 1 {if(minlux<9)minlux++; } void DEC() interrupt 3 {if(minlux>0)minlux--; } void SYS_Init() {uchar i;TMOD=0X66;TH0=0XFF;TL0=0XFF;TH1=0XFF;TL1=0XFF;EA=1; //開總中斷ET0=1; //定時器中斷0,1,擴展成為外部中斷ET1=1;TR0=1;TR1=1;InitLcd1602();for(i=0;i<4;i++){DisplayOneChar(i+2, 0, TEMPtitle[i]); //顯示“temp:”DisplayOneChar(i, 1, ADCtitle[i]); //顯示“Min”DisplayOneChar(i+8, 1, ADCtitle[i+4]); //顯示"Now"} } void Datapros(int temp) //數據處理函數 { if(temp<0) //當溫度值為負數{sign = '-'; temp=~temp; //補碼減1再取反求出原碼temp=temp+1;}else{ sign = ' '; //溫度為正,不顯示正符號}temp*=6.25;DisplayOneChar(6, 0,':');DisplayOneChar(7, 0,sign);DisplayOneChar(8, 0,ASCII[(temp / 1000%10)]);DisplayOneChar(9, 0,ASCII[(temp/ 100 %10)]);DisplayOneChar(10, 0,'.');DisplayOneChar(11, 0,ASCII[(temp/ 10 % 10)]);DisplayOneChar(12, 0,0xDF); //。DisplayOneChar(13, 0,'C'); //C } void AUTOEN() {if(!SW){EX0=0;EX1=0;AutoControl();}else {EX0=1; //開外部中斷0IT0=1; //配置外部中斷0 下降沿有效EX1=1;IT1=1;} } void main() {SYS_Init();while(1){Datapros(GetTemp()); //數據處理函數ADC_Init(); //ADC初始化函數delay(1);ADC(); // start ADCAUTOEN();delay(1);} }

    ?

    總結

    以上是生活随笔為你收集整理的51单片机、DS18B20、智能窗帘控制系统的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。