<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        海爾單片機數字IO口測量模擬量的方法與實例

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年05月18日   【字體:

         通過數字IO口對電容充放電,讀取高低電平變化的時間來判斷模擬量的值。硬件成本有要求,精度不是很高的情況下可以參考一下。C代碼。

         
        /*
        項目:數字IO口取ADC值
        芯片:HR6P59P2S2HL 內部4M
        功能:
        熱敏電阻與電容(224)并聯,再串聯100歐電阻到59 PA0
        采樣一次花時25ms左右
        */
         
        #include <hic.h>
         
        #define uint8 unsigned char
        #define uint16 unsigned int
        #define bool sbit
         
        static volatile section0 sbit        CHG_PIN                @ (unsigned) &PA * 8 + 0 ;
         
        volatile uint8 t8_ms;
        volatile uint8 adcs_ms;
        volatile uint8 adcs_value;
         
        volatile uint16 delay;
        volatile bool adcs_en;
         
        void Clr_Ram_Asm()
        {
                __asm{
                LCALL        0X3FF
                MOVA        CALR
           
                BCC                PSW,RP0
                MOVI        0X10
                MOVA        IAA
        CLR_BANK0
                CLR                IAD                        ;清除存儲組0的RAM數據
                INC                IAA
                JBS                IAA,5
                JUMP        CLR_BANK0
                MOVI        0X30
                MOVA        IAA
        CLR_BANK1
                CLR                IAD                        ;清除存儲組1的RAM數據
                INC                IAA
                JBS                IAA,6
                JUMP        CLR_BANK1
                MOVI        0X50
                MOVA        IAA
        CLR_BANK2
                CLR                IAD                        ;清除存儲組2的RAM數據
                INC                IAA
                JBS                IAA,5
                JUMP        CLR_BANK2
                MOVI        0X70
                MOVA        IAA
        CLR_BANK3
                CLR                IAD                        ;清除存儲組3的RAM數據
                INC                IAA
                JBS                IAA,7
                JUMP        CLR_BANK3
         
                CLR                IAA
            };
        }
         
        void Init_Config()
        {
                __asm{
                        MOVI        0XFF
                        MOVA        T8
                        MOVI        B'00000000'
                        OPTION
                       
                        MOVI        B'11110001'
                        TRIS        PA
                        MOVI        B'00000000'
                        TRIS        PB
                };
                PA = 0B00000000;
                PB = 0B11111111;
               
                INTC0 = 0;
                T8IF = 0;
                T8IE = 1;
                GIE = 1;
        }
         
        void io_charge_cap()
        {
                t8_ms++;
                if(t8_ms == 240)
                {
                        __asm{
                        MOVI        B'11110000'
                        TRIS        PA
                        }
                        CHG_PIN = 1;
                }
                else if(t8_ms == 255)
                {
                        t8_ms = 0;
                        __asm{
                        MOVI        B'11110001'
                        TRIS        PA
                        }
                        adcs_en = 1;
                }
        }
         
        void cap_discharge_timer()
        {
                if(adcs_en == 1)
                {
                        adcs_ms++;                        //最大時間25ms
                        if(adcs_ms >= 255)
                                adcs_ms = 254;
                        if(CHG_PIN == 0)                //電壓為1V時認為是低電平
                        {
                                adcs_value = adcs_ms;
                                adcs_en = 0;
                        }
                }
                else
                {
                        adcs_ms = 0;
                }
        }
         
         
        void isr(void) interrupt
        {
                if(T8IE&T8IF)
                {
                        T8IF = 0;
                        T8 += 209;                //4M 100us
                       
                        //        PA2 = PA2^1;
                        io_charge_cap();
                        cap_discharge_timer();
                }
                else
                {
                        T8IF = 0;
                }
        }
         
        void main()
        {
                Clr_Ram_Asm();
                Init_Config();
               
                while(1)
                {
                        __Asm CWDT;
                        delay++;
                        if(delay==10000)
                        {
                                delay = 0;
                                PB = adcs_value;
                        }
                }
        }
         
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮