您好,登錄后才能下訂單哦!
51單片機課程設計:光照強度預警器(AD轉換)
本程序與MQ-3酒精濃度報警器一樣,都是將對應的模擬信號轉換為數字信號,然后通過單片機監控預警,程序也基本相同,接線方法也一樣,AD轉換器型號為AD0804。相關工程文件、開發板電路圖以及模塊資料在最下方附件下載。
關于粘貼復制亂碼的問題:如果程序復制到Keil編譯器上出現注釋亂碼,可以先建一個.c文件,也就是說不在keil里面編輯,然后用記事本打開.c文件,將源碼復制進去,再在keil中添加文件即可。
/*************************************說明*********************************** 此程序只采集模塊信號的大小 需要轉換為對應的值 還需要轉換公式 連接方式見下方定義 關于接線 光照強度報警器連接電源 然后AO接學校板子上A/D 模擬信號輸入端 在程序剛運行,會要求你設置光照預警值 (適用于吉農51開發板) 2016-12-29-----------------------SWorld ****************************************************************************/ #include <reg52.h> //頭文件 #include <intrins.h> #define uchar unsigned char //宏定義無符號字符型 #define uint unsigned int //宏定義無符號整型 #define GPIO_DIG P0//位選以及段選數據輸出端口定義 unsigned char code DIG_CODE[10]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; //顯示段碼 數碼管字跟 unsigned char DisplayData[8]; //用來存放要顯示的8位數的值 sbit cs=P3^5;//分別接學校單片機的ADCS ADRD ADWR sbit rd=P3^6;// sbit wr=P3^7;// sbit CLK=P3^3; //時鐘脈沖 sbit DUC=P2^2;// DUC段選信號 sbit WEC=P2^3;//WEC 位選信號 sbit bell=P3^4; sbit setwarn=P2^7; //確定 sbit add=P2^6;//數值增加 sbit sub=P2^5;//數值減少 uint z,x,c,v,AD0809,date,ok;//定義數據類型 uint num; //默認報警值 /******************************************************************************* * 函 數 名 : Delay10ms * 函數功能 : 延時函數,延時10ms * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Delay10ms(unsigned int c) //誤差 0us { unsigned char a, b; //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--// for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } /*-----------------------------鍵盤掃描 ------------------------------------------------------*/ unsigned char Key_Scan() { unsigned char keyValue = 0 , i; //保存鍵值 //--檢測按鍵1--// if (setwarn != 1)//檢測按鍵K1是否按下 { Delay10ms(1);//消除抖動 if (setwarn != 1)//再次檢測按鍵是否按下 { keyValue = 3; i = 0; while ((i<50) && (setwarn != 1)) //檢測按鍵是否松開 { Delay10ms(1); i++; } } } //--檢測按鍵1--// if (add != 1)//檢測按鍵K1是否按下 { Delay10ms(1);//消除抖動 if (add!= 1)//再次檢測按鍵是否按下 { keyValue = 1; i = 0; while ((i<50) && (add != 1)) //檢測按鍵是否松開 { Delay10ms(1); i++; } } } //--檢測按鍵1--// if (sub != 1)//檢測按鍵K1是否按下 { Delay10ms(1);//消除抖動 if (sub!= 1)//再次檢測按鍵是否按下 { keyValue = 2; i = 0; while ((i<50) && (sub != 1)) //檢測按鍵是否松開 { Delay10ms(1); i++; } } } return keyValue; //將讀取到鍵值的值返回 } /******************************************************************************* * 函 數 名 : DigDisplay * 函數功能 : 使用數碼管顯示 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void DigDisplay() { unsigned char i; unsigned int j; for(i=0;i<8;i++) { WEC=1;DUC=0; switch(i) //位選,選擇點亮的數碼管, { case(0): GPIO_DIG=0x7F; break;//顯示第0位 case(1): GPIO_DIG=0xBF; break;//顯示第1位 case(2): GPIO_DIG=0xDF; break;//顯示第2位 case(3): GPIO_DIG=0xEF; break;//顯示第3位 case(4): GPIO_DIG=0xF7; break;//顯示第4位 case(5): GPIO_DIG=0xFB; break;//顯示第5位 case(6): GPIO_DIG=0xFD; break;//顯示第6位 case(7): GPIO_DIG=0xFE; break;//顯示第7位 } WEC=0;DUC=1; GPIO_DIG=DisplayData[i];//發送段碼 j=15; //掃描間隔時間設定 while(j--); GPIO_DIG=0x00;//消隱 } } /********************************************************************** 數碼管動態掃描 *********************************************************************/ void xianshi() //顯示函數 { if(AD0809>250) AD0809=250; //找到對應公式替換掉,就可以實現光照檢測 date=250-AD0809; date*=5; if(date>num) { bell=0; } else { bell=1; } //uint z,x,c,v; z=date/1000; //求千位 x=date%1000/100; //求百位 c=date%100/10; //求十位 v=date%10; //求個位 DisplayData[6]=DIG_CODE[z]; DisplayData[5]=DIG_CODE[x]; DisplayData[4]=DIG_CODE[c]; DisplayData[3]=DIG_CODE[v]; DigDisplay(); } /************************************************************************* CLK振蕩信號 **************************************************************************/ void timer0( ) interrupt 1 //定時器0工作方式1 { TH0=(65536-2)/256; //重裝計數初值 TL0=(65536-2)%256; //重裝計數初值 CLK=!CLK; //取反 } /************************************************************************* 主函數 **************************************************************************/ void main() { uint xx=0; num=100; TMOD=0X01; //定時器中斷0 bell=1; CLK=0; //脈沖信號初始值為0 TH0=(65536-2)/256; //定時時間高八位初值 TL0=(65536-2)%256; //定時時間低八位初值 EA=1; //開CPU中斷 ET0=1; //開T/C0中斷 TR0=1; cs=0;ok=0; while(1) { if(ok==1) //無限循環 { if(xx==20) { wr=0; _nop_(); wr=1; _nop_(); _nop_(); rd=0; _nop_(); AD0809=P1; //讀取數據 rd=1; xx=0; } else { xx++; } xianshi();//數碼管顯示函數 } else//以下為設置報警值代碼 { switch(Key_Scan()) { case 3: ok=1; break; case 1: num-=2; break; case 2: num+=2; break; } z=num/1000; //求千位 x=num%1000/100; //求百位 c=num%100/10; //求十位 v=num%10; //求個位 DisplayData[6]=DIG_CODE[z]; DisplayData[5]=DIG_CODE[x]; DisplayData[4]=DIG_CODE[c]; DisplayData[3]=DIG_CODE[v]; DigDisplay(); } } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。