中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

51單片機課程設計:光照強度預警器(AD轉換)

發布時間:2020-07-11 07:31:09 來源:網絡 閱讀:1087 作者:世界都一樣 欄目:開發技術

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();
        }
    }
}


附件:http://down.51cto.com/data/2368531
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沾益县| 灵寿县| 辽宁省| 桦甸市| 呼和浩特市| 应城市| 黑水县| 竹溪县| 苏州市| 磴口县| 碌曲县| 区。| 罗源县| 延边| 南汇区| 轮台县| 兰考县| 疏附县| 桐城市| 澄迈县| 东辽县| 海南省| 嵩明县| 乌拉特后旗| 安阳市| 封开县| 平舆县| 竹溪县| 福建省| 德清县| 呼和浩特市| 绥棱县| 南皮县| 清水县| 铜梁县| 霞浦县| 阿坝| 宾川县| 永福县| 阿克苏市| 来安县|