剛開始學習單片機,這是我第一次做著玩的,希望別噴,所有模塊除了電源都買的成品,沒有畫圖.主要由外殼,LCD1602顯示屏, 4×4單線鍵盤, DS3231時鐘模塊, STM8S103最小系統板,電源模塊,DS18B20溫度傳感器,4繼電器模塊組成.
用途就是無線電業余中繼控制柜里散熱用通風機的邏輯控制,能夠控制通風機運行時間段,根據不同的當前溫度調整通風機轉速工況
FB-9B型通風機控制器使用說明書
目錄
1. 概述
1.1. 適用范圍
1.2. 功能
2. 主要技術參數
2.1. 環境條件
2.2. 技術參數
3. 安裝
3.1. 存儲
3.2. 安裝
4. 控制器組成
5. 使用與操作
5.1. 操作說明
5.2. 設置參數:
5.2.1. “日期時間參數設置”說明:
5.2.2. “溫度判定參數設置”說明:
5.2.3. “季節與時間段參數設置”說明:
6. 常見故障與處理
7. 裝箱單
通風機控制器是為FB-9B橫流風機而設計的專用控制器。 圖1 控制器總圖
1.LCD1602液晶顯示屏;2.模擬量單線4×4鍵盤;3.DS18B20溫度傳感器插座; 4.通風機插座;5.電源插座與電源開關 時間顯示:通過DS3231時鐘芯片進行時鐘顯示,時間格式:24小時制,XX年XX月XX日,XX小時XX分XX秒。 溫度顯示: 通過DS18B20溫度傳感器對溫度進行測量溫度顯示范圍:-55℃~125℃。 通風機工況控制: 繼電器K1/K2/K3,根據日期、時間、當前溫度,可以控制通風機的啟動、停止、中速運行、高速運行。 顯示屏背光控制:繼電器K4控制顯示屏背光。 鍵盤輸入操作:主要實現參數信息輸入,功能界面變換,顯示屏背光控制觸發。 參數設置:可設定通風機允許工作的日期范圍,可設定通風機允許工作的時間范圍,可設定通風機中速運行的溫度范圍,可設定大于多少溫度通風機高速運行;可設定小于多少溫度通風機停止運行。 使用環境溫度 -25℃~60℃ 空氣的相對濕度 在95%以下(溫度為25℃時); 控制器禁止放在含有腐蝕性或爆炸性氣體(如灰塵、蒸汽或煤氣、石油液化氣等)的環境中。 電 源: AC220V. N. PE. 50Hz. 0.2kVA 顯 示: LCD1602 鍵 盤: 模擬信號單線4×4小鍵盤 MCU芯片: STM8S103K 時鐘芯片: DS3231 溫度采集: 單路DS18B20 溫度測量范圍: -55℃~125℃ 顯示分辨率: 1℃ 繼電器輸出: 4組單觸點 調試接口: ST-LINK V2 控制電源: DC 5V 2A線性電源 控制器重量: 300g 外形尺寸(L×W×H): 250×150×100 mm 長期儲存前,須對控制器進行保養、修復損壞器件,并對其進行徹底清理,保持技術狀態良好; 存放前,用保鮮膜將屏幕及鍵盤覆蓋; 應將控制器面板四個螺絲必須完全鎖閉; 應儲存在清潔、干燥、無腐蝕性氣體的環境中,避免周圍環境劇烈變化,無陽光直接照射并且不能堆放。 存儲溫度 -10~60℃; 空氣的相對濕度在95%以下(溫度為25℃時); FB-9B型通風機控制器安裝管理人員要仔細研究和分析控制器的設計方案和設計圖紙,理解使用方法、控制原理。 校驗控制器外型尺寸,確認安裝位置。 按照圖3連接控制器供電的電源線、連接控制器與通風機的線纜、連接控制器與DS18B20溫度傳感器的線纜,即安裝完畢。
圖片1.png (106.09 KB, 下載次數: 66)
下載附件
2018-8-16 14:02 上傳
圖2 控制面板實物圖片

圖3 接口實物圖片 通風機控制器主要由DS18B20溫度傳感器,DS3231時鐘芯片,STM8S103K八位單片機,LCD1602液晶顯示器顯示,模擬量單線4×4鍵盤,繼電器K1/K2/K3/K4,供電模塊等組成。 
圖4 DS18B20溫度傳感器實物圖片 
圖5 DS3231時鐘芯片實物圖片 
圖6 STM8S103K八位單片機實物圖片 
圖7 LCD1602液晶顯示器實物圖片 
圖8 繼電器K1/K2/K3/K4實物圖片 
圖9 電源模塊實物圖片 
圖10模擬量單線4×4鍵盤實物圖片 
圖11通風機電機實物圖片 
圖12 MCU控制系統原理框圖 鍵盤按鍵定義請參考圖10。 通風機控制器正常使用只需要將圖1電源開關打開即可,無需其它操作。 該控制器控制通風機邏輯: 當首次打開電源開關后,LCD1602屏幕背光開啟,進入系統初始化界面,初始化一切正常則進入圖13正常工作界面。 開機首次進入正常工作界面后,LCD1602的背光將被自動關閉,如果需要打開背光按下鍵盤F1鍵,背光將被開啟,隨便按下任意按鍵之后再次按下F1鍵背光關閉。程序設計重復的按鍵操作是不被執行的,正常工作推薦關閉LCD1602背光。 控制器正常工作狀態,每5秒左右更新一次溫度,通過溫度值控制通風機運行狀態,當溫度小于用戶設定溫度時通風機停止工作, 此時顯示屏工作狀態位顯示S。 當大于用戶設定溫度上限時通風機高速運行, 此時顯示屏工作狀態位顯示H。 當溫度設定在用戶設定溫度之間時通風機中速運行, 此時顯示屏工作狀態位顯示M。 每個小時發生變化則對用戶設定的時間范圍參數進行檢查,當在用戶設定小時范圍內則通風機允許工作,否則不允許工作,這個判定優先級大于溫度判定, 此時顯示屏工作狀態位顯示C。 每個月發生變化則對用戶設定的日期范圍參數進行檢查,當前值在用戶設月范圍內則通風機允許工作,否則不允許工作,這個判定優先級最高,此時顯示屏工作狀態位顯示C。 
圖13正常工作界面 第一行顯示XX年XX月XX日 星期幾 最后一個字符代表工作狀態位:S代表停機 M代表風機中速運行 H代表風機高速運行 C特殊季節或者特殊時間段風機不允許工作,這個參數可以根據使用情況自行設置,具體設置方法后面詳細描述 第二行顯示XX小時XX分XX秒 T:代表溫度,系統大概5秒檢測一次溫度并在屏幕更新溫度值。 在圖13正常工作界面按下F2鍵進入圖14日期時間參數設置界面,在該界面下可以設置DS3231時鐘芯片的日期時間參數,其格式為XX年XX月XX日X星期XX小時XX分XX秒,也就是如圖14第一行YYMMDD W hhmmss。 第二行光標對應第一行的相應位,這時候按照順序輸入即可,但是每輸入一個字符必須按下OK鍵確認,輸入數據舉例,18年08月08日星期三12點30分30秒,則這樣操作:"1OK8OK0OK8OK0OK8OK OK1OK2OK3OK0OK3OK0OK",當敲入最后一個OK時自動更新數據并返回正常工作界面,如果輸入錯誤或者不想修改,只要最后一個OK沒有按下則隨時按下ESC鍵,則不更新數據并返回工作界面。 
圖14 日期時間參數設置界面 在圖13正常工作界面按下F3鍵進入圖15溫度判定參數設置界面。 S:T<XX代表溫度小于XX通風機為停機狀態。 H:T>XX代表溫度大于XX通風機為高速運行狀態。 M:XX<T>XX代表溫度大于XX并且小于XX通風機為中速運行狀態。 每輸入一個字符必須按下OK鍵確認,輸入數據舉例,S:T<30 H:>40 M:40<T>30,則這樣操作:"3OK0OK4OK0OK4OK0OK3OK0OK",當敲入最后一個OK時自動更新數據并返回正常工作界面,如果輸入錯誤或者不想修改,只要最后一個OK沒有按下則隨時按下ESC鍵,則不更新數據并返回工作界面。 
圖15 溫度判定參數設置界面 在圖13正常工作界面按下F4鍵進入圖16季節與時間段參數設置界面。 RUN_H:XX<hh>XX代表小時大于多少XX并且小于多少XX通風機允許工作。 RUN_M:XX<MM>MM代表月份大于多少XX并且小于多少XX通風機允許工作。 每輸入一個字符必須按下OK鍵確認,輸入數據舉例,RUN_h:21<hh>08 RUN_M:10<MM>07。則這樣操作:"2OK1OK0OK8OK1OK0OK0OK7OK",當敲入最后一個OK時自動更新數據并返回正常工作界面,如果輸入錯誤或者不想修改,只要最后一個OK沒有按下則隨時按下ESC鍵,則不更新數據并返回工作界面。 
圖16季節與時間段參數設置界面
常見故障及處理方法: | | | | | 1更換檢查FU1玻璃管保險絲; 2.檢查維修供電模塊; 3.更換檢查總開關; 4.檢查線路。 | | | | | | | | | 1.檢查DS18B20溫度傳感器電纜以及連接器; 2.檢查更換DS18B20溫度傳感器; 3.檢查線路。 | | | - 檢查時間條件參數的設置;
- 檢查溫度條件參數的設置;
- 當以上參數寫入不符合規則有可能造成,控制邏輯失常。
|
0.png (7.69 KB, 下載次數: 81)
下載附件
2018-8-16 15:37 上傳
單片機源程序如下:
- /*****************************************************************
- * 實驗名稱及內容:風機控制
- * 實驗平臺及編程人員:stm8s103k3開發版 Hao
- ******************************************************************/
- #include "iostm8s103k3.h"//主控芯片的頭文件
- /*************************常用數據類型定義*************************/
- #define u8 uint8_t
- #define u16 uint16_t
- #define u32 uint32_t
- typedef unsigned char uint8_t;//自定義類型
- typedef unsigned short uint16_t;//自定義類型
- typedef unsigned long uint32_t;//自定義類型
- /*************************端口/引腳定義區域************************/
- #define LCDRS PC_ODR_ODR1 //LCD1602數據/命令選擇端口
- #define LCDRW PC_ODR_ODR2 //LCD1602讀寫控制端口
- #define LCDEN PC_ODR_ODR3 //LCD1602使能信號端口
- #define LCDDATA PB_ODR //LCD1602數據端口D0至D7
- #define LCDBUSY PB_IDR_IDR7 //LCD1602數據端口D7
- #define DS18B20_DQ PA_ODR_ODR3 //PA3單總線引腳位定義
- #define K1 PD_ODR_ODR2 //PD2控制K1繼電器引腳定義
- #define K2 PD_ODR_ODR3 //PD3控制K2繼電器引腳定義
- #define K3 PD_ODR_ODR4 //PD4控制K3繼電器引腳定義
- #define K4 PD_ODR_ODR5 //PD5控制K4繼電器引腳定義
- #define SDA_OUT PC_ODR_ODR7 //I2C總線時鐘引腳PC7(輸出)
- #define SDA_IN PC_IDR_IDR7 //I2C總線時鐘引腳PC7(輸入)
- #define SCL PC_ODR_ODR6 //I2C總線時鐘引腳PC6
- /***********************用戶自定義數據區域***********************/
- u8 table0[]="==Sys FAN init==";//LCD1602顯示字符串數組1顯示效果用初始化界面
- u8 table3[]={'0','1','2','3','4','5','6','7','8','9'};//0至9字符數組
- u8 add_word_year[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02};//LCD1602自造字“年”地址00H
- u8 add_word_month[]={0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00};//LCD1602自造字“月”地址01H
- u8 add_word_day[]={0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00};//LCD1602自造字“日”地址02H
- u8 add_word_Temp[]={0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00};//LCD1602自造字“℃”地址05H
- static u16 Tem_u16=0; //整數溫度值變量
- static float Tem_f=0; //浮點數溫度值變量
- u8 flag=0; //溫度值正負標志變量
- u8 flag_DIS=0; //界面選擇標志位
- u8 cj=1; //風機切換標志位
- u8 flag_time=0; //時間日期讀取標志位
- u8 flag_KOC=0,stemp1,stemp2; //繼電器邏輯控制標志位
- u8 flag_save=0;//按鍵存儲數據標志位
- static u16 AD_Vtemp[10]={0};//裝載10次ADC采樣數據
- static u16 AD_val=0;//ADC單次采樣數據
- static u8 KEY_NO=0,KEY_NO1=0;;//按鍵鍵值碼
- static u16 GETvoltage=0;//獲取到的電壓
- u8 GETDS3231_DAT; //定義全局變量用于保存DS3231讀回數據值
- u8 OPT[8]={0x30,0x30,0x40,0x40,0x09,0x20,0x06,0x10};//用戶自定義選項參數數組
- u8 OPT1[8]={0x30,0x30,0x40,0x40,0x09,0x20,0x06,0x10};//用戶自定義選項參數數組
- u8 KS=0,qian,bai,shi,ge;//KS為按鍵按下標志位,qian為千位、百、十、個
- u8 year,month,day,week,hour,branch,second;//修改時間臨時存儲變量
- u8 mt,lt;//高位存儲臨時變量,低位存儲臨時變量
- /***************************函數聲明區域***************************/
- void delay(u16 Count);//延時函數聲明
- void delay_u(u16 Count);//us延時函數聲明
- void delay_ms(u16 Count);//ms延時函數聲明
- void GPIO_Init(void);//GPIO配置函數聲明
- void LCD1602_Write(u8 cmdordata,u8 writetype);//寫入液晶模組命令或數據函數聲明
- void LCD1602_init(void);//LCD1602初始化函數聲明
- void LCD1602_DIS(u8 val);//顯示字符函數聲明
- void LCD1602_Busy(void);//LCD1602判忙函數
- void add_word(void);//LCD1602自造字添加到CGRAM函數聲明
- void LCD1602_DIS_CHAR(u8 x,u8 y,u8 z);//在設定地址寫入字符數據函數聲明
- void LCD1602_DIS_CHAR_S(u8 x,u8 y,u8 z);//在設定地址寫入光標函數聲明
- void LCD1602_screen_sidesway(u8 x);//LCD1602屏幕移動函數聲明
- void LCD1602_cursor_sidesway(u8 x,u8 y);//LCD1602光標移動函數聲明
- void LCD1602_DIS_swich(u8 x,u8 y,u8 z);//LCD1602屏幕開關與光標開關函數聲明
- void LCD1602_DIS_Clear();//LCD1602屏幕清屏命令函數聲明
- void DS18B20_reset(void); //DS18B20初始化時序
- void DS18B20_DQ_DDR(u8 ddr); //DG單總線引腳方向配置函數
- void DS18B20_init(void); //DS18B20初始化函數
- void DS18B20_Wbyte(u8 x); //DS18B20寫字節函數
- u8 DS18B20_Rbit(void); //DS18B20讀總線位函數
- u8 DS18B20_Rbyte(void); //DS18B20讀字節函數
- void DS18B20_get_Temperature(void); //溫度取值和處理函數
- void ADC_init(void); //ADC2初始化函數聲明
- void ADC_GET(void); //ADC2模數轉換函數聲明
- void AVG_AD_Vtemp(void); //平均值濾波函數聲明
- void I2C_SDA_DDR(u8 ddr);//I2C_SDA串行數據引腳方向性配置函數聲明
- void I2C_START(void);//I2C總線起始信號配置函數聲明
- void I2C_STOP(void);//I2C總線終止信號配置函數聲明
- u8 I2C_Write8Bit(u8 DAT);//I2C總線單字節數據寫入函數聲明
- u8 I2C_Read8BitNACK(void);//單字節數據讀出(發送無應答)函數聲明
- u8 I2C_Read8BitACK(void);//單字節數據讀出(發送應答)函數聲明
- u8 DS3231_ReadByte(u8 ADDR);//DS3231讀出單個字節函數聲明
- void DS3231_WriteByte(u8 ADDR,u8 DAT);//DS3231寫入單個字節函數聲明
- u8 BCD2HEX(u8 val); //BCD轉換為Byte函數聲明
- u8 HEX2BCD(u8 val); //Byte轉換為BCD碼函數聲明
- u8 unlock_EEPROM(void);//解鎖EEPROM函數聲明
- void OPTconfig(void);//OPT選項字節配置函數聲明
- void read_DS3231(void);//讀取日期函數聲明
- void read_18b20_flag(void);//上電讀取溫度判斷工作位標志函數聲明
- void key_Testing(void);//鍵盤檢測函數聲明
- void OPT_Load(void);//參數初始化函數聲明
- void K_OC(void);//繼電器邏輯控制函數聲明
- u8 ASC_shi(u8 val);//取十位變換0~9ASCII碼函數聲明
- u8 ASC_ge(u8 val);//取個位變換0~9ASCII碼函數聲明
- /**************************主函數區域****************************/
- int main( void )
- {
- //************HSI->HSE時鐘自動切換流程及注釋說明************
- //如果CLK_CMSR中的主時鐘源為HSI,則CLK_CMSR=0xE1
- //如果CLK_CMSR中的主時鐘源為LSI,則CLK_CMSR=0xD2
- //如果CLK_CMSR中的主時鐘源為HSE,則CLK_CMSR=0xB4
- if(CLK_CMSR!=0xB4)
- //判斷主時鐘狀態寄存器CLK_CMSR中的主時鐘源是否是HSE
- //若不是則進入if程序段
- {
- //1.首先要配置時鐘切換使能位SWEN=1,使能切換過程
- CLK_SWCR|=0x02;//展開為二進制0000 0010 SWEN位=1
- //2.選擇主時鐘源,對主時鐘切換寄存器CLK_SWR寫入欲切換時鐘
- CLK_SWR=0xB4;//配置CLK_CMSR中的主時鐘源為HSE
- //3.等待時鐘切換控制寄存器CLK_SWCR中的切換中斷標志位SWIF=1
- while((CLK_SWCR & 0x08)==0);
- //4.清除相關標志位
- CLK_SWCR=0;
- }
-
- GPIO_Init(); //配置GPIO
- LCD1602_init(); //LCD1602初始化
- K4=1; //打開LCD1602背光
- LCD1602_DIS(0); //顯示系統初始化界面
- LCD1602_DIS(1); //顯示控制系統正常運行界面
- delay_ms(500);
- K4=0; //進入正常運行界面后關閉LCD1602背光
- ADC_init(); //初始化ADC
- OPT_Load(); //讀取系統參數
- DS18B20_init(); //初始化DS18B20設備
- read_18b20_flag(); //讀取18B20溫度確定標志位
- u8 time=255; //溫度采集標志
-
-
- IWDG_KR=0xCC;//軟件程序啟用IWDG
- IWDG_KR=0x55;//允許對受保護的IWDG_PR和IWDG_RLR寄存器進行操作
- //*********************預分頻因子配置語句**********************
- //IWDG_PR=0;//設定預分頻因子為4分頻
- //IWDG_PR=0x01;//設定預分頻因子為8分頻
- //IWDG_PR=0x02;//設定預分頻因子為16分頻
- //IWDG_PR=0x03;//設定預分頻因子為32分頻
- // IWDG_PR=0x04;//設定預分頻因子為64分頻
- //IWDG_PR=0x05;//設定預分頻因子為128分頻
- IWDG_PR=0x06;//設定預分頻因子為256分頻
- //*************************************************************
- IWDG_RLR=0xFF;//配置重裝載寄存器數值為最大0xFF
- IWDG_KR=0xAA;//刷新IWDG相關配置
-
- while(1)
- {
- IWDG_KR=0xAA;//執行完成delay函數后“喂狗”
- key_Testing();//鍵盤檢測
- if(flag_DIS==1)
- {
- read_DS3231();//讀取DS3231時鐘數據
-
- if(time>20)
- {
- time=0;
- DS18B20_init(); //初始化DS18B20設備
- delay(15);
- DS18B20_get_Temperature();//溫度取值和處理
- delay(15);//等待采樣轉換完成
- if(flag==1)//溫度正負判斷
- LCD1602_DIS_CHAR(2,11,'+');//在第2行第10列顯示+
- else
- LCD1602_DIS_CHAR(2,11,'-');//在第2行第10列顯示-
-
- bai=Tem_u16%1000/100;//取轉換百位
- shi=Tem_u16%100/10;//取轉換十位
- ge=Tem_u16%10;//取轉換個位
- LCD1602_DIS_CHAR(2,12,table3[bai]);//在設定地址寫入百位
- LCD1602_DIS_CHAR(2,13,table3[shi]);//在設定地址寫入十位
- LCD1602_DIS_CHAR(2,14,table3[ge]);//在設定地址寫入個位
-
- if(stemp2==1)//判定月份是否在范圍內
- {
- if(stemp1==1)//判斷小時是否在范圍內
- {
- flag_KOC=1;//判斷在月份內,符合小時范圍內,繼電器邏輯控制允許啟動
- }
- else
- {
- flag_KOC=0;
- }
- }
- else//如果月份不在范圍內,繼電器邏輯控制不允許啟動
- {
- flag_KOC=0;
- }
- if(flag_KOC==1)
- {
- K_OC();//繼電器邏輯控制
- }
- else
- {
- cj=1;
- K3=0;
- K2=0;
- K1=0;
- LCD1602_DIS_CHAR(1,15,'C');//在第1行第15列顯示風機停止運轉狀態
- }
- }
- else
- {
- time=time+1;
- }
- }
- }
- }
- /****************************************************************/
- //延時函數delay(),有形參Count用于控制延時函數執行次數,無返回值
- /****************************************************************/
- void delay(u16 Count)//延時函數
- {
- Count=Count*200;
- u8 i,j;
- while (Count--)//Count形參控制延時次數
- {
- IWDG_KR=0xAA;//執行完成delay函數后“喂狗”
- for(i=0;i<50;i++)
- for(j=0;j<20;j++);
- }
- }
- /****************************************************************/
- //延時函數delay_u(),有形參Count,無返回值
- /****************************************************************/
- void delay_u(u16 Count)
- {
- do{ }//直到型循環執行空操作
- while(Count--);//Count形參控制執行次數影響延時時間
- }
- /****************************************************************/
- //延時函數delay_ms(),有形參Count用于控制延時函數執行次數,無返回值
- /****************************************************************/
- void delay_ms(u16 Count)//延時函數
- {
- u16 i;
- while(Count--)
- IWDG_KR=0xAA;//執行完成delay函數后“喂狗”
- for(i=900;i>0;i--)
- delay_u(1);
- }
- /****************************************************************/
- //LCD1602判忙函數LCD1602_Busy(),無形參和返回值
- /****************************************************************/
- void LCD1602_Busy(void)
- {
- LCDRS=0; //判斷寫入類型0為命令1為數據
- LCDRW=1;
- PB_DDR_DDR7=0; //配置PB7為輸入模式
- PB_CR1_C17=0; //配置PB7為懸浮輸入模式
- PB_CR2_C27=0; //配置PB7關閉
- do
- {
- LCDEN=0;//使能清“0”
- LCDEN=1;//使能置“1”
- }while(LCDBUSY==1);
- LCDEN=0;
- LCDRW=0;
- delay(50);
- PB_DDR_DDR7=1; //配置PB7為輸出模式
- PB_CR1_C17=1; //配置PB7為推挽輸出模式
- PB_CR2_C27=0; //配置PB7低速
- delay(50);
- }
- /****************************************************************/
- //LCD1602初始化函數LCD1602_init(),無形參和返回值
- /****************************************************************/
- void LCD1602_init(void)
- {
- LCD1602_Write(0x02,0);//數據總線為4位
- LCD1602_Write(0x28,0);//數據總線為4位,顯示2行,5*7點陣/每字符
- LCD1602_DIS_swich(1,0,0);//設置開顯示,不顯示光標
- LCD1602_Write(0x06,0);//寫入新數據后顯示屏整體不移動僅光標右移
- LCD1602_DIS_Clear();//LCD1602清屏命令
- add_word();//加載自造字到CGRAM
- }
- /****************************************************************/
- //顯示字符函數LCD1602_DIS(),有形參無返回值
- /****************************************************************/
- void LCD1602_DIS(u8 val)
- {
- if(val==0)//系統初始化界面顯示
- {
- LCD1602_Write(0x01,0);//寫入清屏命令
- u8 i;//定義控制循環變量i
- LCD1602_Write(0x80,0);//選擇第一行
- for(i=0;i<16;i++)
- {
- LCD1602_Write(table0[i],1);//寫入table1[]內容
- delay(5);
- }
- LCD1602_Write(0xC0,0);//選擇第二行
- for(i=0;i<16;i++)
- {
- LCD1602_Write('>',1);//帶延時逐一顯示字符“*”模擬進度條
- delay(100);
- }
- flag_DIS=0;//屏幕標志位 ,系統初始化界面
- }
- if(val==1)//正常工作界面顯示,時鐘 溫度 風機工作狀態
- {
- LCD1602_Write(0x01,0);//寫入清屏命令
- LCD1602_Write(0x80,0);//選擇第一行
- LCD1602_DIS_CHAR(1,0,' ');
- LCD1602_DIS_CHAR(1,1,' ');
- LCD1602_DIS_CHAR(1,2,0x00);
- LCD1602_DIS_CHAR(1,3,' ');
- LCD1602_DIS_CHAR(1,4,' ');
- LCD1602_DIS_CHAR(1,5,0x01);
- LCD1602_DIS_CHAR(1,6,' ');
- LCD1602_DIS_CHAR(1,7,' ');
- LCD1602_DIS_CHAR(1,8,0x02);
- LCD1602_DIS_CHAR(1,9,' ');
- LCD1602_DIS_CHAR(1,10,' ');
- LCD1602_DIS_CHAR(1,11,' ');
- LCD1602_DIS_CHAR(1,12,' ');
- LCD1602_DIS_CHAR(1,13,' ');
- LCD1602_DIS_CHAR(1,14,' ');
- LCD1602_DIS_CHAR(1,15,' ');
- LCD1602_DIS_CHAR(2,0,' ');
- LCD1602_DIS_CHAR(2,1,' ');
- LCD1602_DIS_CHAR(2,2,':');
- LCD1602_DIS_CHAR(2,3,' ');
- LCD1602_DIS_CHAR(2,4,' ');
- LCD1602_DIS_CHAR(2,5,':');
- LCD1602_DIS_CHAR(2,6,' ');
- LCD1602_DIS_CHAR(2,7,' ');
- LCD1602_DIS_CHAR(2,8,' ');
- LCD1602_DIS_CHAR(2,9,'T');
- LCD1602_DIS_CHAR(2,10,':');
- LCD1602_DIS_CHAR(2,11,' ');
- LCD1602_DIS_CHAR(2,12,' ');
- LCD1602_DIS_CHAR(2,13,' ');
- LCD1602_DIS_CHAR(2,14,' ');
- LCD1602_DIS_CHAR(2,15,0x05);//在設定地址寫入個位
- read_18b20_flag();//進入正常工作界面后,重新檢測溫度并且對控制風機狀態標志位初始化
- flag_DIS=1;//屏幕標志位 ,正常工作界面顯示,時鐘 溫度 風機工作狀態
- }
- if(val==2)//設置風機調速控制溫度值界面
- {
- LCD1602_Write(0x01,0);//寫入清屏命令
- LCD1602_Write(0x80,0);//選擇第一行
- LCD1602_DIS_CHAR(1,0,'S');
- LCD1602_DIS_CHAR(1,1,':');
- LCD1602_DIS_CHAR(1,2,'T');
- LCD1602_DIS_CHAR(1,3,'<');
- LCD1602_DIS_CHAR(1,4,ASC_shi(OPT[0]));
- LCD1602_DIS_CHAR(1,5,ASC_ge(OPT[0]));
- LCD1602_DIS_CHAR(1,6,' ');
- LCD1602_DIS_CHAR(1,7,' ');
- LCD1602_DIS_CHAR(1,8,'H');
- LCD1602_DIS_CHAR(1,9,':');
- LCD1602_DIS_CHAR(1,10,'T');
- LCD1602_DIS_CHAR(1,11,'>');
- LCD1602_DIS_CHAR(1,12,ASC_shi(OPT[1]));
- LCD1602_DIS_CHAR(1,13,ASC_ge(OPT[1]));
- LCD1602_DIS_CHAR(1,14,' ');
- LCD1602_DIS_CHAR(1,15,' ');
- LCD1602_DIS_CHAR(2,0,'M');
- LCD1602_DIS_CHAR(2,1,':');
- LCD1602_DIS_CHAR(2,2,ASC_shi(OPT[2]));
- LCD1602_DIS_CHAR(2,3,ASC_ge(OPT[2]));
- LCD1602_DIS_CHAR(2,4,'<');
- LCD1602_DIS_CHAR(2,5,'T');
- LCD1602_DIS_CHAR(2,6,'>');
- LCD1602_DIS_CHAR(2,7,ASC_shi(OPT[3]));
- LCD1602_DIS_CHAR(2,8,ASC_ge(OPT[3]));
- LCD1602_DIS_CHAR(2,9,' ');
- LCD1602_DIS_CHAR(2,10,' ');
- LCD1602_DIS_CHAR(2,11,' ');
- LCD1602_DIS_CHAR(2,12,' ');
- LCD1602_DIS_CHAR(2,13,' ');
- LCD1602_DIS_CHAR(2,14,' ');
- LCD1602_DIS_CHAR(2,15,' ');//在設定地址寫入個位
- LCD1602_DIS_CHAR_S(1,4,1);//在設定地址顯示光標閃爍
- flag_DIS=2;//屏幕標志位 ,設置風機調速控制溫度值界面
- }
- if(val==3)//設置系統時鐘界面
- {
- LCD1602_Write(0x01,0);//寫入清屏命令
- LCD1602_Write(0x80,0);//選擇第一行第1列
- LCD1602_DIS_CHAR(1,0,'Y');
- LCD1602_DIS_CHAR(1,1,'Y');
- LCD1602_DIS_CHAR(1,2,'M');
- LCD1602_DIS_CHAR(1,3,'M');
- LCD1602_DIS_CHAR(1,4,'D');
- LCD1602_DIS_CHAR(1,5,'D');
- LCD1602_DIS_CHAR(1,6,' ');
- LCD1602_DIS_CHAR(1,7,'W');
- LCD1602_DIS_CHAR(1,8,' ');
- LCD1602_DIS_CHAR(1,9,'h');
- LCD1602_DIS_CHAR(1,10,'h');
- LCD1602_DIS_CHAR(1,11,'m');
- LCD1602_DIS_CHAR(1,12,'m');
- LCD1602_DIS_CHAR(1,13,'s');
- LCD1602_DIS_CHAR(1,14,'s');
- LCD1602_DIS_CHAR(1,15,' ');
- LCD1602_DIS_CHAR(2,0,' ');
- LCD1602_DIS_CHAR(2,1,' ');
- LCD1602_DIS_CHAR(2,2,' ');
- LCD1602_DIS_CHAR(2,3,' ');
- LCD1602_DIS_CHAR(2,4,' ');
- LCD1602_DIS_CHAR(2,5,' ');
- LCD1602_DIS_CHAR(2,6,' ');
- LCD1602_DIS_CHAR(2,7,' ');
- LCD1602_DIS_CHAR(2,8,' ');
- LCD1602_DIS_CHAR(2,9,' ');
- LCD1602_DIS_CHAR(2,10,' ');
- LCD1602_DIS_CHAR(2,11,' ');
- LCD1602_DIS_CHAR(2,12,' ');
- LCD1602_DIS_CHAR(2,13,' ');
- LCD1602_DIS_CHAR(2,14,' ');
- LCD1602_DIS_CHAR(2,15,' ');//在設定地址寫入個位
- LCD1602_DIS_CHAR_S(2,0,1);//在設定地址顯示光標閃爍
- flag_DIS=3;//屏幕標志位 ,設置系統時鐘界面
- }
- if(val==4)//設置風機允許運行時間的參數界面
- {
- LCD1602_Write(0x01,0);//寫入清屏命令
- LCD1602_Write(0x80,0);//選擇第一行
- LCD1602_DIS_CHAR(1,0,'R');
- LCD1602_DIS_CHAR(1,1,'U');
- LCD1602_DIS_CHAR(1,2,'N');
- LCD1602_DIS_CHAR(1,3,'_');
- LCD1602_DIS_CHAR(1,4,'h');
- LCD1602_DIS_CHAR(1,5,':');
- LCD1602_DIS_CHAR(1,6,ASC_shi(OPT[4]));
- LCD1602_DIS_CHAR(1,7,ASC_ge(OPT[4]));
- LCD1602_DIS_CHAR(1,8,'<');
- LCD1602_DIS_CHAR(1,9,'h');
- LCD1602_DIS_CHAR(1,10,'h');
- LCD1602_DIS_CHAR(1,11,'>');
- LCD1602_DIS_CHAR(1,12,ASC_shi(OPT[5]));
- LCD1602_DIS_CHAR(1,13,ASC_ge(OPT[5]));
- LCD1602_DIS_CHAR(1,14,' ');
- LCD1602_DIS_CHAR(1,15,' ');
- LCD1602_DIS_CHAR(2,0,'R');
- LCD1602_DIS_CHAR(2,1,'U');
- LCD1602_DIS_CHAR(2,2,'N');
- LCD1602_DIS_CHAR(2,3,'_');
- LCD1602_DIS_CHAR(2,4,'M');
- LCD1602_DIS_CHAR(2,5,':');
- LCD1602_DIS_CHAR(2,6,ASC_shi(OPT[6]));
- LCD1602_DIS_CHAR(2,7,ASC_ge(OPT[6]));
- LCD1602_DIS_CHAR(2,8,'<');
- LCD1602_DIS_CHAR(2,9,'M');
- LCD1602_DIS_CHAR(2,10,'M');
- LCD1602_DIS_CHAR(2,11,'>');
- LCD1602_DIS_CHAR(2,12,ASC_shi(OPT[7]));
- LCD1602_DIS_CHAR(2,13,ASC_ge(OPT[7]));
- LCD1602_DIS_CHAR(2,14,' ');
- LCD1602_DIS_CHAR(2,15,' ');//在設定地址寫入個位
- LCD1602_DIS_CHAR_S(1,6,1);//在設定地址顯示光標閃爍
- flag_DIS=4;//屏幕標志位 ,設置風機允許運行時間的參數界面
- }
- }
- /****************************************************************/
- //寫入液晶模組命令或數據函數LCD1602_Write(),有形參cmdordata
- //和writetype,無返回值。
- /****************************************************************/
- void LCD1602_Write(u8 cmdordata,u8 writetype)
- {
- LCD1602_Busy();//LCD1602判忙
- LCDRS=writetype;//判斷寫入類型0為命令1為數據
- LCDDATA &= 0x0F; //清高四位
- LCDDATA|=cmdordata & 0xF0; //寫高四位
- LCDEN=1;delay(5);//使能置“1”
- LCDEN=0;delay(5);//使能清“0”
- cmdordata=cmdordata << 4; //低四位移到高四位
- LCDDATA &= 0x0F; //清高四位
- LCDDATA |= cmdordata & 0xF0; //寫低四位
- LCDEN=1;delay(5);//使能置“1”
- LCDEN=0;delay(5);//使能清“0”
- }
- /****************************************************************/
- //寫入液晶模組自造字“月”add_yue(),無形參和返回值
- /****************************************************************/
- void add_word() //自造字庫“年、月、日、$、元、℃、↑、10”
- {
- int a,b;
- for (a=0x40;a<0x48;a++)//年
- {
- LCD1602_Write(a,0);
- b=a&0x0f;
- LCD1602_Write(add_word_year[b],1);
- }
- for (a=0x48;a<0x50;a++)//月
- {
- LCD1602_Write(a,0);
- b=a&0x07;
- LCD1602_Write(add_word_month[b],1);
- }
- for (a=0x50;a<0x58;a++)//日
- {
- LCD1602_Write(a,0);
- b=a&0x0f;
- LCD1602_Write(add_word_day[b],1);
- }
- for (a=0x68;a<0x70;a++)//℃
- {
- LCD1602_Write(a,0);
- b=a&0x07;
- LCD1602_Write(add_word_Temp[b],1);
- }
- }
- /****************************************************************/
- //設定地址寫入字符函數LCD1602_DIS_CHAR(),有形參x、y、z無返回值
- //x表示1602液晶的行,y表示列地址,z表示欲寫入的字符
- /****************************************************************/
- void LCD1602_DIS_CHAR(u8 x,u8 y,u8 z)
- {
- LCD1602_DIS_swich(1,0,0);//設置開顯示,不顯示光標
- u8 address;
- if(x==1)//若欲顯示在第一行
- address=0x80+y;//第一行的行首地址+列地址
- else
- address=0xC0+y;//第二行的行首地址+列地址
- LCD1602_Write(address,0);//設定顯示地址
- LCD1602_Write(z,1);//寫入字符數據
- }
- /****************************************************************/
- //設定地址寫入光標函數聲明LCD1602_DIS_CHAR_S(),有形參x、y無返回值
- //x表示1602液晶的行,y表示列地址,z=1表示開顯示,顯示光標,z=0表示開顯示,不顯示光標
- /****************************************************************/
- void LCD1602_DIS_CHAR_S(u8 x,u8 y,u8 z)
- {
- if(z==1)
- LCD1602_DIS_swich(1,1,1);//設置開顯示,顯示光標
- else
- LCD1602_DIS_swich(1,0,0);//設置開顯示,不顯示光標
- u8 address;
- if(x==1)//若欲顯示在第一行
- address=0x80+y;//第一行的行首地址+列地址
- else
- address=0xC0+y;//第二行的行首地址+列地址
- LCD1602_Write(address,0);//設定顯示地址
- }
- /****************************************************************/
- //設定LCD1602液晶顯示與光標顯示的函數LCD1602_DIS_swich(),有形參x、y、z無返回值
- //x表示1602顯示,y表示1602光標顯示,z表示1602光標閃動
- /****************************************************************/
- void LCD1602_DIS_swich(u8 x,u8 y,u8 z)
- {
- int a=0x08;
- if(x==1)
- {
- a=a|0x04;
- }
- if(y==1)
- {
- a=a|0x02;
- }
- if(z==1)
- {
- a=a|0x01;
- }
- LCD1602_Write(a,0);
- }
- /****************************************************************/
- //設定LCD1602液晶畫面平移的函數LCD1602_screen_sidesway(),有形參x無返回值
- //x=1畫面向右移動一個字符;X=0畫面向左移動一個字符
- /****************************************************************/
- void LCD1602_screen_sidesway(u8 x)
- {
- if(x==1)
- {
- LCD1602_Write(0x1c,0);//畫面向右平移一個字符位
- }
- else
- {
- LCD1602_Write(0x18,0);//畫面向左平移一個字符位
- }
- }
- /****************************************************************/
- //設定LCD1602液晶畫面平移的函數LCD1602_cursor_sidesway(),有形參x,y無返回值
- //x=1光標向右移動;X=0光標向左移動 y代表多少個字符
- /****************************************************************/
- void LCD1602_cursor_sidesway(u8 x,u8 y)
- {
- for(int i=0;i<y;i++)
- {
- if(x==1)
- {
- LCD1602_Write(0x14,0);//光標向右平移一個字符位
- }
- else
- {
- LCD1602_Write(0x10,0);//光標向左平移一個字符位
- }
- }
- }
- /****************************************************************/
- //設定LCD1602液晶清屏LCD1602_DIS_Clear(),無形參無返回值
- /****************************************************************/
- void LCD1602_DIS_Clear()
- {
- LCD1602_Write(0x01,0);//寫入清屏命令
- }
- /****************************************************************/
- //GPIO配置函數GPIO_Init(),無返回值
- /****************************************************************/
- void GPIO_Init(void)
- {
- PD_DDR_DDR2=1; //配置PD2為輸出模式 K1
- PD_CR1_C12=1; //配置PD2為推挽輸出模式 K1
- PD_CR2_C22=0; //配置PD2低速率輸出 K1
- PD_DDR_DDR3=1; //配置PD3為輸出模式 K2
- PD_CR1_C13=1; //配置PD3為推挽輸出模式 K2
- PD_CR2_C23=0; //配置PD3低速率輸出 K2
- PD_DDR_DDR4=1; //配置PD4為輸出模式 K3
- PD_CR1_C14=1; //配置PD4為推挽輸出模式 K3
- PD_CR2_C24=0; //配置PD4低速率輸出 K3
- PD_DDR_DDR5=1; //配置PD5為輸出模式 K4
- PD_CR1_C15=1; //配置PD5為推挽輸出模式 K4
- PD_CR2_C25=0; //配置PD5低速率輸出 K4
- K4=0; //K4初始化為不輸出
-
- PC_DDR_DDR1=1; //配置PC1為輸出模式
- PC_CR1_C11=1; //配置PC1為推挽輸出模式
- PC_CR2_C21=0; //配置PC1低速率輸出
-
- PC_DDR_DDR2=1; //配置PC2為輸出模式
- PC_CR1_C12=1; //配置PC2為推挽輸出模式
- PC_CR2_C22=0; //配置PC2低速率輸出
- LCDRW=0; //配置LCD1602為寫入模式
-
- PC_DDR_DDR3=1; //配置PC3為輸出模式
- PC_CR1_C13=1; //配置PC3為推挽輸出模式
- PC_CR2_C23=0; //配置PC3低速率輸出
-
- PC_DDR_DDR6=1; //配置PC6引腳(SCL)為輸出模式
- PC_CR1_C16=1; //配置PC6引腳(SCL)為推挽輸出模式
- PC_CR2_C26=0; //配置PC6引腳(SCL)低速率輸出模式
-
- PB_DDR=0xF0; //配置PB端口為輸出模式
- PB_CR1=0xFF; //配置PB端口為推挽輸出模式
- PB_CR2=0x00; //配置PB端口低速率輸出
- LCDDATA=0xFF; //初始化PB端口全部輸出高電平
-
- DS18B20_DQ_DDR(1); //配置DQ單總線為輸出模式
- DS18B20_DQ=1; //配置DQ單總線為高電平狀態
- delay(300); //延時等待配置穩定
- }
- /****************************************************************/
- //設備初始化時序產生函數DS18B20_reset(),無形參和返回值
- /****************************************************************/
- void DS18B20_reset(void)
- {
- u8 x;//變量x用于取回總線電平狀態
- DS18B20_DQ_DDR(1);//改變DQ引腳方向性為輸出方式
- DS18B20_DQ=1;//控制器首先應為高電平狀態
- delay_u(910);//延時大約800us
- DS18B20_DQ=0;//控制器拉低總線發送復位脈沖
- delay_u(910);//拉低時間大約800us
- DS18B20_DQ=1;//控制器釋放總線
- delay_u(30);//DS18B20等待大約30us
- DS18B20_DQ_DDR(0);//改變DQ引腳方向性為輸入方式
- delay_u(30);//等待DS18B20應答脈沖大約30us
- x=PA_IDR_IDR3;//取回總線電平狀態
- while(x);//等待應答脈沖出現低電平
- delay_u(900);//控制器等待至少480us
- }
- /****************************************************************/
- //設備DQ引腳方向性配置函數DS18B20_DQ_DDR(),有形參ddr無返回值
- /****************************************************************/
- void DS18B20_DQ_DDR(u8 ddr)
- {
- if(ddr==1)//配置為輸出方式
- {
- PA_DDR_DDR3=1;//配置PA3引腳為輸出引腳
- PA_CR1_C13=1;//配置PA3引腳為推挽輸出模式
- PA_CR2_C23=0;//配置PA3引腳低速率輸出模式
- }
- else//配置為輸入方式
- {
- PA_DDR_DDR3=0;//配置PA3引腳為輸入引腳
- PA_CR1_C13=1;// 配置PA3引腳為弱上拉模式
- PA_CR2_C23=0;//禁止PA3引腳外部中斷功能
- }
- }
- /****************************************************************/
- //設備初始化函數DS18B20_init(),無形參和返回值
- /****************************************************************/
- void DS18B20_init(void)
- {
- DS18B20_reset();//DS18B20初始化時序
- delay_u(500);//等待初始化結束
- DS18B20_Wbyte(0xCC);//寫ROM指令(跳過ROM)
- DS18B20_Wbyte(0x44);//寫功能指令(溫度轉換)
- }
- /****************************************************************/
- //設備寫一個字節函數DS18B20_Wbyte(),有形參xbyte無返回值
- /****************************************************************/
- void DS18B20_Wbyte(u8 xbyte)
- {
- u8 i,x=0;//i為循環控制變量,x為取位運算變量
- DS18B20_DQ_DDR(1);//改變DQ引腳方向性為輸出方式
- for(i=0;i<8;i++)//8次循環實現逐位寫入
- {
- x=xbyte & 0x01;//從最低位取值到最高位
- if(x)//寫“1”
- {
- DS18B20_DQ=0;//DQ單總線拉低
- delay_u(13);//延時大約15us
- DS18B20_DQ=1;//DQ單總線寫入“1”
- delay_u(42);//延時大約45us
- DS18B20_DQ=1;//最終保持高電平
- delay_u(2);
- }
- else//寫“0”
- {
- DS18B20_DQ=0;//DQ單總線拉低
- delay_u(13);//延時大約15us
- DS18B20_DQ=0;//DQ單總線寫入“0”
- delay_u(42);//延時大約45us
- DS18B20_DQ=1;//最終保持高電平
- delay_u(2);
- }
- xbyte=xbyte>>1;//右移一位實現逐位移出
- }
- }
- /****************************************************************/
- //設備讀字節函數DS18B20_Rbyte(),無形參有返回值rbyte
- /****************************************************************/
- u8 DS18B20_Rbyte(void)
- {
- u8 rbyte=0,i=0,tempbit=0;//rbyte是最終得到的字節,i為循環控制變量
- //tempbit為逐位取出的中間運算變量
- for(i=0;i<8;i++)//8次循環實現逐位拼合
- {
- tempbit=DS18B20_Rbit();//讀取單個位
- rbyte=rbyte>>1;//右移實現將高低位排列
- rbyte=rbyte|tempbit;//或運算移入數據
- }
- return rbyte;//返回最終字節
- }
- /****************************************************************/
- //設備讀取單個位函數DS18B20_Rbit(),無形參有返回值rbit
- /****************************************************************/
- u8 DS18B20_Rbit(void)
- {
- u8 rbit=0,x=0;//rbit是最終位數據,x是取狀態變量
- DS18B20_DQ_DDR(1);//改變DQ引腳方向性為輸出方式
- DS18B20_DQ=0;//DQ單總線寫入“0”
- delay_u(13);//延時大約15us
- DS18B20_DQ=1;//釋放DQ單總線
- DS18B20_DQ_DDR(0);//改變DQ引腳方向性為輸入方式
- //delay_u(30);//延時大約15us【舊版本,應適當縮小這個時間】
- delay_u(9);//延時小于15us,在10us左右【新版本】
- x=PA_IDR_IDR3;//獲取單總線電平狀態
- if(x)//狀態判定
- rbit=0x80;//若為高電平則最高位“1”得到0x80反之為初始值0
- delay_u(54);//延時大約60us
- return rbit;////返回最終位數據
- }
- /****************************************************************/
- //設備溫度獲取和轉換函數DS18B20_get_Temperature(),無形參和返回值
- /****************************************************************/
- void DS18B20_get_Temperature(void)
- {
- u8 msb_byte=0,lsb_byte=0;//msb是溫度值高位,lsb是溫度值低位
- DS18B20_reset();//初始化時序
- delay_u(900);//等待初始化穩定
- DS18B20_Wbyte(0xCC);//寫ROM指令(跳過ROM)
- DS18B20_Wbyte(0xBE);//寫功能指令(讀暫存器)
- delay_u(900);//等待配置穩定
- lsb_byte=DS18B20_Rbyte();//讀取第一個低位數據字節
- msb_byte=DS18B20_Rbyte();//讀取第二個高位數據字節
- Tem_u16=msb_byte;//先將高位給全局變量Tem_u16
- Tem_u16=Tem_u16<<8;//然后將Tem_u16低8位左移為高8位
- Tem_u16=Tem_u16|lsb_byte;//拼合低位給Tem_u16低8位
- if(Tem_u16<=0x07FF)//溫度值正負判斷
- flag=1;//溫度值為正
- else
- flag=0;//溫度值為負
- Tem_f=Tem_u16*0.0625;//乘以0.0625最小分辨值得到12位溫度實際值
- Tem_u16=(u16)(Tem_f+0.5);//4舍5入得到溫度整數值
- }
- /****************************************************************/
- //ADC2初始化函數ADC_init(),無形參,無返回值
- /****************************************************************/
- void ADC_init(void)
- {
- //1.選擇模擬通道,按需配置中斷
- ADC_CSR=0x00;//選擇通道AIN0(PB0),禁止中斷
- //2.配置分頻系數,明確轉換模式
- ADC_CR1=0x02;//配置預分頻為fMaster/2,連續轉換模式
- //3.配置觸發事件,明確對齊方式
- ADC_CR2=0x08;//禁止外部觸發,數據右對齊(先讀低再讀高)
- //ADC_CR2=0x00;//禁止外部觸發,數據左對齊(先讀高再讀低)
- //4.初始配置模擬通道(無中斷懸浮輸入)
- PB_DDR_DDR0=0;//配置PB0端口為輸入模式
- PB_CR1_C10=0;//配置PB0端口為懸浮輸入模式
- PB_CR2_C20=0;//配置PB0端口禁止外部中斷
- //5.按需禁止/使能施密特觸發器功能
- ADC_TDRL=0x00;//使能斯密特觸發器
- //6.使能ADC上電喚醒并禁用I/O輸出功能
- ADC_CR1|=0x01;//首次將ADON位置1用于喚醒
- //7.啟動ADC轉換并獲取轉換數據
- //ADC_GET();//用戶編寫的ADC轉換函數
- }
- /****************************************************************/
- //ADC2模數轉換函數ADC_GET(),無形參,無返回值
- /****************************************************************/
- void ADC_GET(void)
- {
- u8 num=0;//循環控制變量,用于控制次數
- ADC_CR1=0x02;//配置預分頻為fMaster/2,連續轉換模式
- ADC_CR1|=0x01;//首次將ADON位置1用于喚醒
- ADC_CR1|=0x01;//再次將ADON位置1用于啟動ADC轉換
- while(num<10)//采10次結果
- {
- while((ADC_CSR & 0x80)==0);//等待ADC轉換結束
- ADC_CSR &= 0x7F;//清除ADC轉換完成標志位
- AD_Vtemp[num]=(u16)ADC_DRL;//先將ADC轉換數據低位賦值
- AD_Vtemp[num]|=(u16)ADC_DRH<<8;//再將左移8位后的高位數據與原低位數據進行或連接
- //(高位數據)+(低位數據)=完整ADC采樣數據結果
- num++;//循環控制變量自增
- }
- ADC_CR1 &= 0xFD;//關閉ADC轉換
- }
- /****************************************************************/
- //平均值濾波函數AVG_AD_Vtemp(),無形參,無返回值
- /****************************************************************/
- void AVG_AD_Vtemp(void)
- {
- u8 i,j;//定義排序用內外層循環變量i和j
- u16 temp;//定義中間“暫存”變量temp
- for(i=10;i>=1;i--)//外層循環
- {
- for(j=0;j<(i-1);j++)//內層循環
- {
- if(AD_Vtemp[j]>AD_Vtemp[j+1])//數值比較
- {
- temp=AD_Vtemp[j];//數值換位
- AD_Vtemp[j]=AD_Vtemp[j+1];
- AD_Vtemp[j+1]=temp;
- }
- }
- }
- for(i=2;i<=7;i++)//去掉2個最低去掉2個最高
- AD_val+=AD_Vtemp[i];//將中間6個數值累加
- AD_val=(u16)(AD_val/6);//累加和求平均值
- }
- /****************************************************************/
- //I2C_SDA串行數據引腳方向性配置函數I2C_SDA_DDR(),有形參ddr,無返回值
- /****************************************************************/
- void I2C_SDA_DDR(u8 ddr)
- {
- if(ddr==1)//配置為輸出方式
- {
- PC_DDR_DDR7=1;//配置PC7引腳(SDA)為輸出引腳
- PC_CR1_C17=1;//配置PC7引腳(SDA)為推挽輸出模式
- PC_CR2_C27=0;//配置PC7引腳(SDA)低速率輸出模式
- }
- else//配置為輸入方式
- {
- PC_DDR_DDR7=0;//配置PC7引腳(SDA)為輸入引腳
- PC_CR1_C17=1;//配置PC7引腳(SDA)為弱上拉輸入模式
- PC_CR2_C27=0;//禁止PC7引腳(SDA)外部中斷功能
- }
- }
- /****************************************************************/
- //I2C總線起始信號配置函數I2C_START(),無形參,無返回值
- /****************************************************************/
- void I2C_START(void)
- {
- I2C_SDA_DDR(1);//配置SDA引腳為推挽輸出模式
- SDA_OUT=1;//SDA引腳置為高電平
- SCL=1;//SCL引腳置為高電平
- delay(1);//延時等待
- SDA_OUT=0;//將SDA置低產生下降沿(產生起始信號)
- delay(1);//延時等待
- SCL=0;//將SCL置低產生下降沿(允許SDA數據傳送)
- delay(1);//延時等待
- }
- /****************************************************************/
- //I2C總線終止信號配置函數I2C_STOP(),無形參,無返回值
- /****************************************************************/
- void I2C_STOP(void)
- {
- I2C_SDA_DDR(1);//配置SDA引腳為推挽輸出模式
- SDA_OUT=0;//SDA引腳置為低電平
- SCL=0;//SCL引腳置為低電平
- delay(1);//延時等待
- SCL=1;//將SCL引腳置高產生上升沿
- delay(1);//延時等待
- SDA_OUT=1;//將SDA引腳置高產生上升沿(產生終止信號)
- delay(1);//延時等待
- }
- /****************************************************************/
- //I2C總線單字節數據寫入函數I2C_Write8Bit(u8 DAT),有形參DAT
- //有返回值I2C_Write_ACK(應答信號變量值),若返回值為“0”則有從機應答
- //若返回值為“1”則從機無應答
- /****************************************************************/
- u8 I2C_Write8Bit(u8 DAT)
- {
- u8 num,I2C_Write_ACK=0;//定義循環控制變量num
- //定義應答信號變量I2C_Write_ACK
- I2C_SDA_DDR(1);//配置SDA引腳為推挽輸出模式
- delay(1);//延時等待
- for(num=0x80;num!=0;num>>=1)//執行8次循環
- {
- if((DAT&num)==0)//按位“與”判斷DAT每一位值
- SDA_OUT=0;//判斷數值為“0”送出低電平
- else
- SDA_OUT=1;//判斷數值為“1”送出高電平
- delay(1);//延時等待
- SCL=1;//拉高SCL引腳以保持SDA引腳數據穩定
- delay(1);//延時等待
- SCL=0;//拉低SCL引腳以允許SDA引腳數據變動
- delay(1);//延時等待
- }
- SDA_OUT=1;//置高SDA引腳電平(釋放數據線)
- delay(1);//延時等待
- SCL=1;//拉高SCL產生應答位時鐘
- delay(1);//延時等待
- I2C_SDA_DDR(0);//配置SDA引腳為弱上拉輸入模式
- delay(1);//延時等待
- I2C_Write_ACK=SDA_IN;//取回SDA線上電平賦值給應答信號變量
- delay(1);//延時等待
- SCL=0;//將SCL引腳置低
- delay(5);
- return I2C_Write_ACK;//將應答信號變量值進行返回
- }
- /****************************************************************/
- //單字節數據讀出函數(發送無應答)I2C_Read8BitNACK()
- //無形參,有返回值(讀出的單字節數據)
- /****************************************************************/
- u8 I2C_Read8BitNACK(void)
- {
- u8 x,I2CDATA;//定義循環控制變量x,讀出數據暫存變量I2CDATA
- I2C_SDA_DDR(1);//配置SDA引腳為推挽輸出模式
- SDA_OUT=1;//首先確保主機釋放SDA
- SCL=0;//置低SCL引腳以允許從機發送下一位
- delay(1);//延時等待
- I2C_SDA_DDR(0);//配置SDA引腳為弱上拉輸入模式
- delay(1);//延時等待
- for(x=0x80;x!=0;x>>=1)//從高位到低位依次進行
- {
- delay(1);//延時等待
- SCL=1;//將SCL引腳置為高電平
- if(SDA_IN==0)//讀取SDA引腳的電平狀態并進行判定
- I2CDATA&=~x;//判定為“0”則將I2CDATA中對應位清零
- else
- I2CDATA|=x;//判定為“1”則將I2CDATA中對應位置“1”
- delay(1);//延時等待
- SCL=0;//置低SCL引腳以允許從機發送下一位
- }
- I2C_SDA_DDR(1);//配置SDA引腳為推挽輸出模式
- delay(1);//延時等待
- SDA_OUT=1;//8位數據發送后拉高SDA引腳發送“無應答信號”
- delay(1);//延時等待
- SCL=1;//將SCL引腳置為高電平
- delay(1);//延時等待
- SCL=0;//將SCL引腳置為低電平完成“無應答位”并保持總線
- return I2CDATA;//將讀出的單字節數據進行返回
- }
- /****************************************************************/
- //單字節數據讀出函數(發送應答)I2C_Read8BitACK()
- //無形參,有返回值(讀出的單字節數據)
- /****************************************************************/
- u8 I2C_Read8BitACK(void)
- {
- u8 x,I2CDATA;//定義循環控制變量x,讀出數據暫存變量I2CDATA
- I2C_SDA_DDR(1);//配置SDA引腳為推挽輸出模式
- delay(1);//延時等待
- SDA_OUT=1;//首先確保主機釋放SDA
- delay(1);//延時等待
- I2C_SDA_DDR(0);//配置SDA引腳為弱上拉輸入模式
- delay(1);//延時等待
- for(x=0x80;x!=0;x>>=1)//從高位到低位依次進行
- {
- delay(1);//延時等待
- SCL=1;//將SCL引腳置為高電平
- if(SDA_IN==0)//讀取SDA引腳的電平狀態并進行判定
- I2CDATA&=~x;//判定為“0”則將I2CDATA中對應位清零
- else
- I2CDATA|=x;//判定為“1”則將I2CDATA中對應位置“1”
- delay(1);//延時等待
- SCL=0;//置低SCL引腳以允許從機發送下一位
- }
- I2C_SDA_DDR(1);//配置SDA引腳為推挽輸出模式
- delay(1);//延時等待
- SDA_OUT=0;//8位數據發送后置低SDA引腳發送“應答信號”
- delay(1);//延時等待
- SCL=1;//將SCL引腳置為高電平
- delay(1);//延時等待
- SCL=0;//將SCL引腳置為低電平完成“應答位”并保持總線
- return I2CDATA;//將讀出的單字節數據進行返回
- }
- /****************************************************************/
- //DS3231讀出單個字節函數DA3231_ReadByte(),有形參ADDR
- //ADDR為欲讀出數據的地址,有返回值DS3231_DATA(讀出的單字節數據)
- /****************************************************************/
- u8 DS3231_ReadByte(u8 ADDR)
- {
- u8 DS3231_DATA;//定義變量用于存放讀出數據
- I2C_START();//產生I2C通信起始信號
- I2C_Write8Bit(0xD0);//寫入(器件地址+寫)指令
- I2C_Write8Bit(ADDR);//指定欲讀取DS3231芯片的地址
- I2C_START();//產生I2C通信起始信號
- I2C_Write8Bit(0xD1);//寫入(器件地址+讀)指令
- DS3231_DATA=I2C_Read8BitNACK();//單字節讀取(發送無應答)
- I2C_STOP();//產生I2C通信終止信號
- return DS3231_DATA;//返回實際讀取到的數據值
- }
- /****************************************************************/
- //DS3231寫入單個字節函數DS3231_WriteByte(),有形參ADDR、DAT
- //ADDR為欲寫入地址,DAT為欲寫入數據,無返回值
- /****************************************************************/
- void DS3231_WriteByte(u8 ADDR,u8 DAT)
- {
- I2C_START();//產生I2C通信起始信號
- I2C_Write8Bit(0xD0);//寫入(器件地址+寫)指令
- I2C_Write8Bit(ADDR);//指定欲寫入DS3231芯片的地址
- I2C_Write8Bit(DAT);//寫入實際數據
- I2C_STOP();//產生I2C通信終止信號
- }
- /****************************************************************/
- //BCD轉換為Byte函數BCD2HEX(),有形參val
- //val為欲轉換的BCD碼,返回Byte
- /****************************************************************/
- u8 BCD2HEX(u8 val) //BCD轉換為Byte
- {
- u8 temp;
- temp=val&0x0f;
- val>>=4;
- val&=0x0f;
- val*=10;
- temp+=val;
- return temp;
- }
- /****************************************************************/
- //Byte碼轉換為BCD碼函數HEX2BCD(),有形參val
- //val為欲轉換Byte碼,返回值為BCD碼
- /****************************************************************/
- u8 HEX2BCD(u8 val) //Byte碼轉換為BCD碼
- {
- u8 i,j,k;
- i=val/10;
- j=val;
- k=j+(i<<4);
- return k;
- }
- /****************************************************************/
- //解鎖EEPROM函數unlock_EEPROM(),無形參,有返回值“0”或者“1”
- //若返回值為“1”則解鎖失敗,若返回值為“0”則解鎖成功
- /****************************************************************/
- u8 unlock_EEPROM(void)
- {
- //1.首先寫入MASS密匙以解鎖EEPROM
- FLASH_DUKR=0xAE;
- FLASH_DUKR=0x56;
- //2.判斷DUL位是否解鎖成功
- if(FLASH_IAPSR & 0x80)
- return 1;//解鎖失敗
- else
- return 0;//解鎖成功
- }
- /****************************************************************/
- //OPT選項字節配置函數OPTconfig(),無形參,無返回值
- /****************************************************************/
- void OPTconfig(void)
- {
- do//輸入MASS密匙用于解鎖DATA EEPROM的寫保護
- {
- FLASH_DUKR=0xAE;//硬件密匙1
- FLASH_DUKR=0x56;//硬件密匙2
- }
- while(!(FLASH_IAPSR & 0x08));//等待解鎖Flash完成
- FLASH_CR2 =0x80;//對選項字節進行寫操作被使能
- FLASH_NCR2=0x7F;//互補控制寄存器FLASH_NCR2中的NOPT位要為“0”
- *((u8*)0X4000)= OPT[0];//配置低于多少溫度風機停機條件
- *((u8*)0x4001)= OPT[1];//配置大于多少溫度風機中速啟動條件
- *((u8*)0x4002)= OPT[2];//配置小于多少溫度風機中速啟動條件
- *((u8*)0x4003)= OPT[3];//配置大于多少溫度風機高速啟動條件
- *((u8*)0x4004)= OPT[4];//配置小于哪個小時風機允許啟動條件
- *((u8*)0x4005)= OPT[5];//配置大于哪個小時風機允許啟動條件
- *((u8*)0x4006)= OPT[6];//配置小于哪個月份風機允許啟動條件
- *((u8*)0x4007)= OPT[7];//配置大于哪個月份風機允許啟動條件
- FLASH_IAPSR=0x40;//程序存儲區(FLASH)上鎖,數據存儲區(EEPROM)上鎖
- }
- /****************************************************************/
- //讀取時鐘并顯示函數read_DS3231(),無形參,無返回值
- /****************************************************************/
- void read_DS3231(void)
- {
- u8 stemp,shi1,ge1;
- GETDS3231_DAT=DS3231_ReadByte(0x00);//讀取指定地址的數據秒
- stemp=BCD2HEX(GETDS3231_DAT);
- shi1=stemp/10;//取轉換十位
- ge1=stemp%10;//取轉換個位
- LCD1602_DIS_CHAR(2,6,table3[shi1]);//在第2行第6列顯示讀回數據
- LCD1602_DIS_CHAR(2,7,table3[ge1]);//在第2行第7列顯示讀回數據
- if(table3[shi1]=='0' & table3[ge1]=='0' | flag_time==0)
- {
- GETDS3231_DAT=DS3231_ReadByte(0x01);//讀取指定地址的數據分
- stemp=BCD2HEX(GETDS3231_DAT);
- shi1=stemp/10;//取轉換十位
- ge1=stemp%10;//取轉換個位
- LCD1602_DIS_CHAR(2,3,table3[shi1]);//在第2行第3列顯示讀回數據
- LCD1602_DIS_CHAR(2,4,table3[ge1]);//在第2行第4列顯示讀回數據
- }
- if(table3[shi1]=='0' & table3[ge1]=='0' | flag_time==0)
- {
- GETDS3231_DAT=DS3231_ReadByte(0x02);//讀取指定地址的數據小時
- GETDS3231_DAT&=0x3f;
- stemp=BCD2HEX(GETDS3231_DAT);
- if(stemp>OPT1[5] & stemp<OPT1[4])
- {
- stemp1=1;
- }
- else
- {
- stemp1=0;
- }
- shi1=stemp/10;//取轉換十位
- ge1=stemp%10;//取轉換個位
- LCD1602_DIS_CHAR(2,0,table3[shi1]);//在第2行第0列顯示讀回數據
- LCD1602_DIS_CHAR(2,1,table3[ge1]);//在第2行第1列顯示讀回數據
- }
- if(table3[shi1]=='0' & table3[ge1]=='0' | flag_time==0)
- {
- GETDS3231_DAT=DS3231_ReadByte(0x04);//讀取指定地址的數據日
- GETDS3231_DAT&=0x3f;
- stemp=BCD2HEX(GETDS3231_DAT);
- shi1=stemp/10;//取轉換十位
- ge1=stemp%10;//取轉換個位
- LCD1602_DIS_CHAR(1,6,table3[shi1]);//在第2行第0列顯示讀回數據
- LCD1602_DIS_CHAR(1,7,table3[ge1]);//在第2行第1列顯示讀回數據
- GETDS3231_DAT=DS3231_ReadByte(0x05);//讀取指定地址的數據月
- GETDS3231_DAT&=0x3f;
- stemp=BCD2HEX(GETDS3231_DAT);
- if(stemp>OPT1[7] & stemp<OPT1[6])
- {
- stemp2=1;
- }
- else
- {
- stemp2=0;
- }
- shi1=stemp/10;//取轉換十位
- ge1=stemp%10;//取轉換個位
- LCD1602_DIS_CHAR(1,3,table3[shi1]);//在第2行第0列顯示讀回數據
- LCD1602_DIS_CHAR(1,4,table3[ge1]);//在第2行第1列顯示讀回數據
- GETDS3231_DAT=DS3231_ReadByte(0x06);//讀取指定地址的數據年
- GETDS3231_DAT&=0x3f;
- stemp=BCD2HEX(GETDS3231_DAT);
- shi1=stemp/10;//取轉換十位
- ge1=stemp%10;//取轉換個位
- LCD1602_DIS_CHAR(1,0,table3[shi1]);//在第2行第0列顯示讀回數據
- LCD1602_DIS_CHAR(1,1,table3[ge1]);//在第2行第1列顯示讀回數據
- GETDS3231_DAT=DS3231_ReadByte(0x03);//讀取指定地址的數據星期
- stemp=BCD2HEX(GETDS3231_DAT);
- ge1=stemp%10;//取轉換個位
- u8 week[4];//星期顯示數組
- switch(ge1)
- {
- case 1:
- week[0]='M';
- week[1]='o';
- week[2]='n';
- week[3]=' ';
- break;
- case 2:
- week[0]='T';
- week[1]='u';
- week[2]='e';
- week[3]='s';
- break;
- case 3:
- week[0]='W';
- week[1]='e';
- week[2]='d';
- week[3]=' ';
- break;
- case 4:
- week[0]='T';
- week[1]='h';
- week[2]='u';
- week[3]='r';
- break;
- case 5:
- week[0]='F';
- week[1]='r';
- week[2]='i';
- week[3]=' ';
- break;
- case 6:
- week[0]='S';
- week[1]='a';
- week[2]='t';
- week[3]=' ';
- break;
- case 7:
- week[0]='S';
- week[1]='u';
- week[2]='n';
- week[3]=' ';
- break;
- default: break;
- }
- LCD1602_DIS_CHAR(1,10,week[0]);//在第2行第0列顯示讀回數據
- LCD1602_DIS_CHAR(1,11,week[1]);//在第2行第1列顯示讀回數據
- LCD1602_DIS_CHAR(1,12,week[2]);//在第2行第1列顯示讀回數據
- LCD1602_DIS_CHAR(1,13,week[3]);//在第2行第1列顯示讀回數據
- flag_time=1;
- }
- }
- /****************************************************************/
- //上電讀取溫度判斷工作位標志函數read_18b20_flag(),無形參,無返回值
- /****************************************************************/
- void read_18b20_flag(void)
- {
- DS18B20_init(); //初始化DS18B20設備
- delay(15);
- DS18B20_get_Temperature();//溫度取值和處理
- delay(15);//等待采樣轉換完成
- if(Tem_u16>OPT1[3] & Tem_u16<OPT1[2])
- {
- cj=1;
- }
- if(Tem_u16>OPT1[1] | Tem_u16==OPT1[1])
- {
- cj=2;
- }
- if(Tem_u16<OPT1[0] | Tem_u16==OPT1[0])
- {
- cj=1;
- }
- }
- /****************************************************************/
- //讀取OPT參數函數OPT_Load(),無形參,無返回值
- /****************************************************************/
- void OPT_Load(void)
- {
- //讀取STM8EEPROM數據
- OPT[0]=*((u8*)0X4000);//配置低于多少溫度風機停機條件
- OPT[1]=*((u8*)0X4001);//配置大于多少溫度風機高速啟動條件
- OPT[2]=*((u8*)0X4002);//配置小于多少溫度風機中速啟動條件
- OPT[3]=*((u8*)0X4003);//配置大于多少溫度風機中速啟動條件
- OPT[4]=*((u8*)0X4004);//配置小于哪個小時風機允許啟動條件
- OPT[5]=*((u8*)0X4005);//配置大于哪個小時風機允許啟動條件
- OPT[6]=*((u8*)0X4006);//配置小于哪個月份風機允許啟動條件
- OPT[7]=*((u8*)0X4007);//配置大于哪個月份風機允許啟動條件
- OPT1[0]=BCD2HEX(OPT[0]);//配置低于多少溫度風機停機條件
- OPT1[1]=BCD2HEX(OPT[1]);//配置大于多少溫度風機高速啟動條件
- OPT1[2]=BCD2HEX(OPT[2]);//配置小于多少溫度風機中速啟動條件
- OPT1[3]=BCD2HEX(OPT[3]);//配置大于多少溫度風機中速啟動條件
- OPT1[4]=BCD2HEX(OPT[4]);//配置小于哪個小時風機允許啟動條件
- OPT1[5]=BCD2HEX(OPT[5]);//配置大于哪個小時風機允許啟動條件
- OPT1[6]=BCD2HEX(OPT[6]);//配置小于哪個月份風機允許啟動條件
- OPT1[7]=BCD2HEX(OPT[7]);//配置大于哪個月份風機允許啟動條件
- }
- /****************************************************************/
- //繼電器邏輯控制函數K_OC(),無形參,無返回值
- /****************************************************************/
- void K_OC(void)
- {
- if(Tem_u16>OPT1[3] & Tem_u16<OPT1[2] & cj==1)
- {
- cj=2;
- K3=0;
- delay_ms(500);
- K1=1;
- delay_ms(500);
- K2=1;
- LCD1602_DIS_CHAR(1,15,'M');//在第1行第15列顯示風機中速運轉狀態
- }
- if(Tem_u16>OPT1[1] | Tem_u16==OPT1[1] & cj==2)
- {
- cj=1;
- K2=0;
- delay_ms(500);
- K1=1;
- delay_ms(500);
- K3=1;
- LCD1602_DIS_CHAR(1,15,'H');//在第1行第15列顯示風機高速運轉狀態
- }
- if(Tem_u16<OPT1[0] | Tem_u16==OPT1[0])
- {
- cj=1;
- K3=0;
- K2=0;
- K1=0;
- LCD1602_DIS_CHAR(1,15,'S');//在第1行第15列顯示風機停止運轉狀態
- }
- }
- /****************************************************************/
- //鍵盤檢測函數key_Testing(),無形參,無返回值
- /****************************************************************/
- void key_Testing(void)
- {
-
- ADC_GET();//啟動AD轉換獲取AD采樣數據AD_val
- AVG_AD_Vtemp();//求6次平均值(去掉2個最低去掉2個最高)
- delay(50);//延時
- GETvoltage=(u16)(AD_val*4.92);//4.8828125);//計算對應電壓(mV)
- AD_val=0;//清零ADC轉換數據
- qian=GETvoltage/1000;//取轉換電壓千位
- bai=GETvoltage%1000/100;//取轉換電壓百位
- if(qian==0)
- {
- if(bai<1){KS=1;KEY_NO='1';}//S1按鍵電壓0判斷低于0.1
- else if(bai<5){KS=1;KEY_NO='2';}//S2按鍵電壓0.31判斷0.1至0.5之間
- else if(bai<8){KS=1;KEY_NO='3';}//S3按鍵電壓0.622判斷0.5至0.8之間
- else {KS=1;KEY_NO='A';}//S4按鍵電壓0.938判斷0.8至1.0之間
-
- }
- else if(qian==1)
- {
- if(bai<1){KS=1;KEY_NO='A';}//S4按鍵電壓0.938判斷1.0至1.1之間
- else if(bai<5){KS=1;KEY_NO='4';}//S5按鍵電壓1.243判斷1.1至1.5之間
- else if(bai<7){KS=1;KEY_NO='5';}//S6按鍵電壓1.554判斷1.5至1.7之間
- else {KS=1;KEY_NO='6';}//S7按鍵電壓1.863判斷1.7至2.0之間
- }
- else if(qian==2)
- {
- if(bai<3){KS=1;KEY_NO='B';}//S8按鍵電壓2.185判斷2.0至2.3之間
- else if(bai<7){KS=1;KEY_NO='7';}//S9按鍵電壓2.495判斷2.3至2.7之間
- else {KS=1;KEY_NO='8';}//S10按鍵電壓2.814判斷2.7至3.0之間
- }
- else if(qian==3)
- {
- if(bai<3){KS=1;KEY_NO='9';}//S11按鍵電壓3.133判斷3.0至3.2之間
- else if(bai<6){KS=1;KEY_NO='C';}//S12按鍵電壓3.428判斷3.2至3.6之間
- else {KS=1;KEY_NO='E';}//S13按鍵電壓3.734判斷3.6至4.0之間
- }
- else if(qian==4)
- {
- if(bai<2){KS=1;KEY_NO='0';}//S14按鍵電壓4.057判斷4.0至4.2之間
- else if(bai<5){KS=1;KEY_NO='K';}//S15按鍵電壓4.375判斷4.2至4.5之間
- else if(bai<9){KS=1;KEY_NO='D';}//S16按鍵電壓4.691判斷4.5至4.8之間
- else KS=0;//無按鍵按下
- }
- delay(200);//延時等待
- if(KEY_NO==KEY_NO1)
- {
- KS=0;
- }
- if(KS==1)//判斷是否有按鍵按下
- {
- if(KEY_NO=='A')//控制屏幕背景燈
- {
- K4=!K4;
- }
- if(flag_DIS==1)//只有在正常工作界面是這些案件操作功能有效
- {
- if(KEY_NO=='B')//時間設置界面
- {
- LCD1602_DIS(3);
- }
- if(KEY_NO=='C')//溫度控制參數設置界面
- {
- LCD1602_DIS(2);
- }
- if(KEY_NO=='D')//風機允許運行時間參數設置界面
- {
- LCD1602_DIS(4);
- }
- }
- if(flag_DIS==3)//時間設置參數輸入
- {
- switch(flag_save)
- {
- case 0://年數據輸入
- if(KEY_NO=='K')
- {
- LCD1602_DIS_CHAR_S(2,1,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt=mt<<4;
- if(KEY_NO!='B')
- {
- LCD1602_DIS_CHAR(2,0,KEY_NO);
- LCD1602_DIS_CHAR_S(2,0,1);//在設定地址顯示光標閃爍
- }
- break;
- case 1:
- if(KEY_NO=='K')
- {
- year=mt+lt;
- LCD1602_DIS_CHAR_S(2,2,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- lt=KEY_NO;
- lt&=0x0f;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,1,KEY_NO);
- LCD1602_DIS_CHAR_S(2,1,1);//在設定地址顯示光標閃爍
- }
- break;
- case 2://月數據輸入
- if(KEY_NO=='K')
- {
- LCD1602_DIS_CHAR_S(2,3,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt=mt<<4;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,2,KEY_NO);
- LCD1602_DIS_CHAR_S(2,2,1);//在設定地址顯示光標閃爍
- }
- break;
- case 3:
- if(KEY_NO=='K')
- {
- month=mt+lt;
- LCD1602_DIS_CHAR_S(2,4,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- lt=KEY_NO;
- lt&=0x0f;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,3,KEY_NO);
- LCD1602_DIS_CHAR_S(2,3,1);//在設定地址顯示光標閃爍
- }
- break;
- case 4://日數據輸入
- if(KEY_NO=='K')
- {
- LCD1602_DIS_CHAR_S(2,5,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt=mt<<4;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,4,KEY_NO);
- LCD1602_DIS_CHAR_S(2,4,1);//在設定地址顯示光標閃爍
- }
- break;
- case 5:
- if(KEY_NO=='K')
- {
- day=mt+lt;
- LCD1602_DIS_CHAR_S(2,7,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- lt=KEY_NO;
- lt&=0x0f;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,5,KEY_NO);
- LCD1602_DIS_CHAR_S(2,5,1);//在設定地址顯示光標閃爍
- }
- break;
- case 6://星期數據輸入
- if(KEY_NO=='K')
- {
- week=mt;
- LCD1602_DIS_CHAR_S(2,9,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt&=0x0f;;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,7,KEY_NO);
- LCD1602_DIS_CHAR_S(2,7,1);//在設定地址顯示光標閃爍
- }
- break;
- case 7://小時數據輸入
- if(KEY_NO=='K')
- {
- LCD1602_DIS_CHAR_S(2,10,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt=mt<<4;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,9,KEY_NO);
- LCD1602_DIS_CHAR_S(2,9,1);//在設定地址顯示光標閃爍
- }
- break;
- case 8:
- if(KEY_NO=='K')
- {
- hour=mt+lt;
- LCD1602_DIS_CHAR_S(2,11,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- lt=KEY_NO;
- lt&=0x0f;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,10,KEY_NO);
- LCD1602_DIS_CHAR_S(2,10,1);//在設定地址顯示光標閃爍
- }
- break;
- case 9://分數據輸入
- if(KEY_NO=='K')
- {
- LCD1602_DIS_CHAR_S(2,12,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt=mt<<4;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,11,KEY_NO);
- LCD1602_DIS_CHAR_S(2,11,1);//在設定地址顯示光標閃爍
- }
- break;
- case 10:
- if(KEY_NO=='K')
- {
- branch=mt+lt;
- LCD1602_DIS_CHAR_S(2,13,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- lt=KEY_NO;
- lt&=0x0f;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,12,KEY_NO);
- LCD1602_DIS_CHAR_S(2,12,1);//在設定地址顯示光標閃爍
- }
- break;
- case 11://秒數據輸入
- if(KEY_NO=='K')
- {
- LCD1602_DIS_CHAR_S(2,14,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt=mt<<4;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,13,KEY_NO);
- LCD1602_DIS_CHAR_S(2,13,1);//在設定地址顯示光標閃爍
- }
- break;
- case 12:
- if(KEY_NO=='K')
- {
- second=mt+lt;
- LCD1602_DIS_CHAR_S(2,15,1);//在設定地址顯示光標閃爍
- DS3231_WriteByte(0x00,second);//秒
- DS3231_WriteByte(0x01,branch);//分
- DS3231_WriteByte(0x02,hour);//小時
-
- DS3231_WriteByte(0x03,week);//星期
-
- DS3231_WriteByte(0x04,day);//天
- DS3231_WriteByte(0x05,month);//月
- DS3231_WriteByte(0x06,year);//年
- KEY_NO='E';//模擬取消按鍵,進入正常工作界面
- break;
- }
- lt=KEY_NO;
- lt&=0x0f;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,14,KEY_NO);
- LCD1602_DIS_CHAR_S(2,14,1);//在設定地址顯示光標閃爍
- }
- break;
- default:
- break;
- }
- if(KEY_NO=='E')
- {
- flag_time=0;//第一次讀全日期時間標志位
- flag_save=0;//參數儲存標志位
- LCD1602_DIS(1);//正常運行界面
- }
- }
- if(flag_DIS==2)//溫度參數設置輸入
- {
- switch(flag_save)
- {
- case 0://低于多少溫度,風機停機
- if(KEY_NO=='K')
- {
- LCD1602_DIS_CHAR_S(1,5,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt=mt<<4;
- if(KEY_NO!='C')
- {
- LCD1602_DIS_CHAR(1,4,KEY_NO);
- LCD1602_DIS_CHAR_S(1,4,1);//在設定地址顯示光標閃爍
- }
- break;
- case 1:
- if(KEY_NO=='K')
- {
- OPT[0]=mt+lt;
- LCD1602_DIS_CHAR_S(1,12,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- lt=KEY_NO;
- lt&=0x0f;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(1,5,KEY_NO);
- LCD1602_DIS_CHAR_S(1,5,1);//在設定地址顯示光標閃爍
- }
- break;
- case 2://大于多少溫度風機高速運行
- if(KEY_NO=='K')
- {
- LCD1602_DIS_CHAR_S(1,13,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt=mt<<4;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(1,12,KEY_NO);
- LCD1602_DIS_CHAR_S(1,12,1);//在設定地址顯示光標閃爍
- }
- break;
- case 3:
- if(KEY_NO=='K')
- {
- OPT[1]=mt+lt;
- LCD1602_DIS_CHAR_S(2,2,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- lt=KEY_NO;
- lt&=0x0f;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(1,13,KEY_NO);
- LCD1602_DIS_CHAR_S(1,13,1);//在設定地址顯示光標閃爍
- }
- break;
- case 4://小于多少溫度風機中速運行
- if(KEY_NO=='K')
- {
- LCD1602_DIS_CHAR_S(2,3,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt=mt<<4;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,2,KEY_NO);
- LCD1602_DIS_CHAR_S(2,2,1);//在設定地址顯示光標閃爍
- }
- break;
- case 5:
- if(KEY_NO=='K')
- {
- OPT[2]=mt+lt;
- LCD1602_DIS_CHAR_S(2,7,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- lt=KEY_NO;
- lt&=0x0f;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,3,KEY_NO);
- LCD1602_DIS_CHAR_S(2,3,1);//在設定地址顯示光標閃爍
- }
- break;
- case 6://大于多少溫度風機中速運行
- if(KEY_NO=='K')
- {
- LCD1602_DIS_CHAR_S(2,8,1);//在設定地址顯示光標閃爍
- flag_save++;
- break;
- }
- mt=KEY_NO;
- mt=mt<<4;
- if(KEY_NO!='K')
- {
- LCD1602_DIS_CHAR(2,7,KEY_NO);
- LCD1602_DIS_CHAR_S(2,7,1);//在設定地址顯示光標閃爍
- }
- break;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
附件里包含源代碼(IAR)和控制器的詳細說明書
0.png (45.49 KB, 下載次數: 70)
下載附件
2018-8-16 15:39 上傳
全部資料51hei下載地址:
散熱風機控制.zip
(5.76 MB, 下載次數: 49)
2018-8-16 14:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|