新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Atmega16單片機實用程序

        Atmega16單片機實用程序

        作者: 時間:2016-12-01 來源:網絡 收藏
        /************************************************************
        名稱:六位密碼輸入比對程序
        功能:輸入六位數並與存儲密碼比對,0K返回1,按錯或者順序錯返回0;
        原始密碼654321
        **************************************************************/
        uchar securtcom() //6位密碼輸入比對程序0K;
        {
        uchar keycount=0;
        while(key_press()==1);
        delayms(3);
        do{
        while(key_press()==1);
        delayms(1);
        while(key_press()==0);
        show(8,keycount);
        securbuf[keycount++]=keyscan();
        }while(keycount<6);
        if(securbuf[0]==6) //初始比對,密碼654321;
        {
        if(securbuf[1]==5)
        {
        if(securbuf[2]==4)
        {
        if(securbuf[3]==3)
        {
        if(securbuf[4]==2)
        {
        if(securbuf[5]==1);
        }
        }
        }
        }
        return 1; //密碼正確,返回1;
        }
        else
        return 0; //密碼錯誤,返回0;
        }
        uchar serset() //密碼設定子程序;
        {
        }
        uchar speci_keypress(uchar presstimes) //特殊按鍵F按下某一設定次數OK;
        {
        }
        uchar key_longpress(uchar prst) //按鍵長按子程序
        {
        }
        /**************************************************
        名稱: 直流蜂鳴器控制
        功能: 控制蜂鳴器鳴響時間
        硬件連接:PD5輸出控制信號
        **************************************************/
        void dcbeep(uchar beeptime) //直流蜂鳴器,調試OK;
        {uchar beep;
        DDRD|=BIT(5);
        PORTD&=~BIT(5);
        PORTD|=BIT(5);
        delayus(beeptime);
        PORTD&=~BIT(5);
        delayus(100-beeptime);
        }
        /**********************************************************
        名稱:直流電機全橋控制
        功能:fbw=1.正轉;fbw=0,反轉;
        硬件連接:PD6與PD7口組合輸出控制信號;
        **********************************************************/
        void moto(uchar fbw) //直流電機正反轉程序,驅動全橋;
        {
        DDRD|=BIT(6);
        DDRD|=BIT(7);
        PORTD&=~BIT(6);
        PORTD&=~BIT(7);
        delayms(5);
        if(fbw==1)
        {
        PORTD|=BIT(6);
        delayms(500);
        PORTD&=~BIT(6);
        delayms(20);
        }
        else
        {
        }
        if(fbw==0)
        {
        PORTD|=BIT(7);
        delayms(500);
        PORTD&=~BIT(7);
        delayms(20);
        }
        }
        /*********************************************************
        名稱: AD單次轉換子程序;
        功能: 採樣AD通路0的電壓,該函數輸出為AD 轉換後的數據,
        查詢工作方式
        *********************************************************/
        void ad_init()
        {
        ADMUX=0XC0; //設置AD輸入通道為0通道,內部2.56V參考電壓;
        ADCSRA=0X80; //使能ADC,清中斷標誌ADIF,查詢方式;
        DDRA&=~BIT(0); //設置PA0口為輸入;
        PORTA&=~BIT(0); //PA0口清零;
        }
        int ad_conv() //單次轉換子程序,OK;
        {
        int addata;
        ADCSRA|=BIT(ADSC); //啟動一次轉換;
        while(!(ADCSRA&(BIT(ADIF)))); //查詢等待轉換結束標誌置位;
        ADCSRA&=~BIT(ADIF);
        addata=ADCL;
        addata=addata+ADCH*256;
        return addata;
        }
        int ad_aver() //轉換8次,做平均值濾波
        {
        int adaver,count;
        for(count=7;count>0;count--)
        {
        adaver=ad_conv();
        adaver+=adaver;
        delayms(1);
        }
        adaver=adaver/8;
        delayms(1);
        return adaver;
        }
        /*********************************************************
        名稱:AD採樣
        功能:採樣AD0的電壓,內部2.56V參考電壓,中斷工作方式
        **********************************************************/
        void ad0_init()
        {
        ADMUX=0xc0;
        adchannel=0;
        ADCSRA=0x98;
        DDRA&=~BIT(0);
        PORTA&=~BIT(0);
        SEI();
        }
        #pragma interrupt_handler process:15 //interrupt process program
        void process()
        {
        int adcode=0;
        ADCSRA&=~BIT(ADIE);
        adcode=ADCL;
        adcode=(ADCH<<8)+adcode; //get adc value
        /************************
        中斷處理函數
        *************************/
        ADCSRA|=BIT(ADIE);
        }
        /********************************************************
        名稱:DAC0832 DA轉換
        輸入:有效分度0~255
        輸出:無
        功能:對8為數字信號進行DA轉換,實際應用需調試
        ********************************************************/
        #define cs_low PORTD&=~BIT(0)
        #define cs_high PORTD|=BIT(0)
        #define wr1_low PORTD&=~BIT(1)
        #define wr1_high PORTD|=BIT(1)
        #define ile_high PORTD|=BIT(2)
        #define ile_low PORTD&=~BIT(2)
        #define wr2_low PORTD&=~BIT(3)
        #define wr2_high PORTD|=BIT(3)
        #define xfer_low PORTD&=~BIT(5)
        #define xfer_high PORTD|=BIT(5)
        void dac(int dadata)
        {
        Gpioinit1();
        DDRD=0xff;
        DDRC=0xff;
        ile_high;
        //delayus(1);
        cs_low;
        wr1_low;
        //delayus(1);
        PORTC=dadata;
        //delayus(1);
        wr1_high;
        cs_high;
        // delayus(1);
        wr2_low;
        xfer_low;
        // delayus(1);
        xfer_high;
        }
        /*****************************************************
        名稱: 數據拆分顯示函數
        功能: 將四位數據分別顯示到對應的數碼管。
        *****************************************************/
        void addisplay(int addat) //轉換數據顯示,運算OK;
        {
        int a;
        a=addat;
        show(a/1000,3);
        delayms(2);
        show((a/100)%10,2);
        delayms(2);
        show(((a/10)%10)/10,1);
        delayms(2);
        show(a%10,0);
        delayms(2);
        }
        /**********************************************************
        名稱:SPI通信
        功能:應用mega16自身SPI通信模塊與外設進行通信.查詢方式;
        ***********************************************************/
        void SPI_masterinit()
        {
        DDRB|=BIT(5)|BIT(7); //設置MOSI與SCK為輸出
        DDRB&=~(BIT(4)&BIT(6)); //設置MISO與SS為輸入
        SPCR|=BIT(4)|BIT(3)|BIT(1)|BIT(0); //數據高位先發送,主機模式,空閒時鐘極性
        //為高,SCK起始沿採樣數據,128分頻
        SPCR|=BIT(6); //使能SPI
        delayms(1);
        }
        void SPI_mastertransdata(uchar data)
        {
        SPDR=data;
        while(!(SPSR&BIT(7)));
        }
        void SPI_slaveinit()
        {
        }
        void SPI_slaverecive()
        {
        }
        /*********************************************************
        名稱:比較匹配模式,,中斷方式,調試OK
        功能:AVR比較匹配模式應用,當AIN大於AIN1時,上升沿產生中斷
        **********************************************************/
        void com_inti()
        {
        SEI(); //開總中斷;
        DDRB&=((~BIT(2))&(~BIT(3))); //設置PB2/3口為輸入;
        SFIOR&=~BIT(3); //設置AIN1為模擬比較器反向輸入端;
        ACSR&=~BIT(7); //使能模擬比較器,注意此處為低電平有效;
        ACSR&=~BIT(6); //設置AIN0為正極輸入端;
        ACSR|=BIT(3); //使能模擬比較器中斷;
        ACSR|=(BIT(1)|BIT(0)); //比較器上升沿觸發中斷;
        }
        #pragma interrupt_handler comp:17 //注意函數名後不加();
        void comp() //模擬比較器中斷服務程序;
        {
        ACSR&=~BIT(3);
        /*************
        此處加中斷處理函數
        **************/
        ACSR|=BIT(3);
        }
        /**********************************************************
        名稱:外部中斷INT0 調試OK
        功能:低電平觸發INT0端口引起中斷,並響應相關中斷服務程序
        **********************************************************/
        void int0_init()
        {
        DDRD&=~BIT(2); //PD2/INT0端口配置為輸入;
        MCUCR&=((~BIT(0))&(~BIT(0))); //INT0觸發方式為低電平;
        GICR|=BIT(6); //使能外部中斷0;
        SEI(); //開總中斷;
        }
        #pragma interrupt_handler int0:2
        void int0() //INT0中斷服務函數;
        {
        GICR&=~BIT(6); //關閉外部INT0;
        /************************
        此處加INT0中斷處理函數
        ************************/
        GICR|=BIT(6); //開啟外部INT0;
        }
        /*********************************************************
        名稱:外部中斷INT1,
        功能:邊沿觸發INT0端口引起中斷,並響應相關中斷服務程序
        **********************************************************/
        void int1_init()
        {
        DDRD&=~BIT(3); //將PD3口配置為輸入;
        PORTD&=~BIT(3); //pd3口初始值為0;
        MCUCR|=(BIT(3)|BIT(2)); //INT1上升沿觸發中斷;
        GICR|=BIT(7); //使能INT1中斷;
        SEI(); //開總中斷;
        }
        #pragma interrupt_handler int1:3
        void int1()
        {
        GICR&=~BIT(7); //關閉INT1中斷;
        /*******************************
        此處加INT1中斷服務函數;
        *******************************/
        GICR|=BIT(7); //開啟INT1中斷;
        }
        /**********************************************************
        /**********************************************************
        名稱:12864(ks0108)顯示應用
        功能:圖形液晶使用
        **********************************************************/
        #define EN_CLR PORTD&=~BIT(0) //使能12864
        #define EN_SET PORTD|=BIT(0) //關閉12864
        #define RW_READ PORTD|=BIT(1) //讀操作
        #define RW_WRITE PORTD&=~BIT(1) //寫操作
        #define RS_COMM PORTD&=~BIT(2) //命令操作
        #define RS_DATA PORTD|=BIT(2) //數據操作
        #define RESET PORTD&=~BIT(3) //12864液晶複位
        #define RESET_OVER PORTD|=BIT(3) //12864液晶結束複位;
        #define CS1_EN PORTD&=~BIT(4) //使能CS1,選擇左半屏幕;
        #define CS1_DIS PORTD|=BIT(4) //禁止CS1
        #define CS2_EN PORTD&=~BIT(5) //使能CS2,選擇右半屏幕;
        #define CS2_DIS PORTD|=BIT(5) //禁止CS2
        #define basic_com 0x30 //一次送8BIT數據,基本指令集;
        #define explo_com 0xc4 //擴展指令集
        #define show_stitude 0x0f //顯示狀態,整體顯示,游標開,游標位置開
        #define cleanscreen 0x01 //顯示清零,AC歸零
        #define cursor 0x07 //寫入/讀取時,游標右移,畫面左移
        #define AC_0 0x03 //AC歸0,不改變DDRAM內容
        const int char_0816[]={
        0xe0,0x18,0x04,0x04,0x04,0x18,0xe0,0x00,
        0x07,0x18,0x20,0x20,0x20,0x18,0x07,0x00
        };
        /************************************************************
        名稱:MCU端口初始化
        功能:設置MCU端口初始方向以及狀態
        *************************************************************/
        void GPIO_INIT()
        {
        DDRA=0XFF;
        PORTA=0X00;
        DDRB=0XFF;
        PORTA=0X00;
        DDRC=0XFF;
        PORTA=0X00;
        DDRD=0XFF;
        PORTA=0X00;
        }
        /****************************************************************
        名稱:輸入數據
        功能:MCU將數據送到總線
        *****************************************************************/
        void SET_DATA(uchar data)
        {
        delayus(3);
        PORTC=data;
        delayus(3);
        }
        /****************************************************************
        名稱:開關顯示控制
        功能:開啟與關閉顯示操作,1為開顯示,0為關閉顯示
        *****************************************************************/
        void LCD_Command_Displayonoff(uchar onoff)
        {
        RW_WRITE;
        RS_COMM;
        EN_CLR;
        SET_DATA(0x3e + onoff); //onoff為1開顯示,為0關顯示;
        EN_SET;
        delayus(2);
        EN_CLR;
        }
        /***************************************************************
        名稱: LCD顯示起始行設定
        功能:設置LCD顯示起始行位置,startline範圍0~63
        ***************************************************************/
        void LCD_Command_setstartline(uchar startline)
        {
        RW_WRITE;
        RS_COMM;
        EN_CLR;
        SET_DATA(0Xc0 + startline); //12864行地址為0~63之間設定;
        EN_SET;
        delayus(2);
        EN_CLR;
        }
        /***************************************************************
        名稱:設置顯示行頁地址
        功能:設置顯示行頁地址,12864為0~7
        ****************************************************************/
        void LCD_Command_set_x(uchar x)
        {
        RW_WRITE;
        RS_COMM;
        EN_CLR;
        SET_DATA(0xB8+x); //設置12864行頁地址 x範圍0~7;
        EN_SET;
        delayus(2);
        EN_CLR;

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 灵宝市| 河西区| 克什克腾旗| 沈阳市| 新建县| 沿河| 普洱| 泗洪县| 西畴县| 五台县| 遂平县| 庆阳市| 莲花县| 望谟县| 天津市| 顺平县| 德州市| 吉安县| 台江县| 阳东县| 大渡口区| 肥乡县| 金秀| 黄平县| 中方县| 安塞县| 茂名市| 兴化市| 武乡县| 昆明市| 上栗县| 沙河市| 巴塘县| 镶黄旗| 拉萨市| 三门县| 巴南区| 葵青区| 方城县| 定安县| 昭苏县|