新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機可控0-30V可調電源

        單片機可控0-30V可調電源

        作者: 時間:2016-11-30 來源:網絡 收藏
        /******************************************************************************/
        //延時函數
        void delay_1us(void) // 1us延時函數
        {
        asm("nop");
        }
        void delay_nus(uchar n) // N us延時函數
        {
        for(;n>0;n--)
        {
        delay_1us();
        }
        }
        // 內部晶振頻率為8MHz
        void delay_1ms(void) // 1ms延時函數
        {
        uint i;
        for(i=1142;i>0;i--); // 8*143-2
        }
        void delay_nms(uchar n) // N ms延時函數
        {
        for(;n>0;n--)
        {
        asm("wdr"); // 喂狗
        delay_1ms();
        }
        }
        /*******************************************************************************
        函數名:mcu_init()
        作用:I/O初始化,PWM初始化
        輸入:無
        返回值:無
        *******************************************************************************/
        void mcu_init(void)
        {
        SREG |= 0x80; // 全局中斷使能
        DDRB = 0x0f; // PB口全部為輸出
        PORTB = 0x04; // 初始化PB口
        DDRA = 0xc7; // PA3,PA4,PA5為輸入
        PORTA = 0xc7; // 初始化PA口
        CLKPR = 0x80; // CLKPCE=1 修改系統時鐘分頻使能
        CLKPR = 0x00; // 1分頻
        TCCR1B = 0x00; // TIMER1停止計數
        TCNT1H = 0x40; // 初值高8位
        TCNT1L = 0x00; // 初值低8位
        TIMSK1_Bit0 = 1; // TIMER1使能
        D1_OFF;
        D2_OFF;
        D3_OFF;
        D4_OFF;
        D5_OFF;
        D6_OFF;
        TCCR1B = 0x01; // TIMER1開始計數,1分頻
        }
        /*******************************************************************************
        函數名:adc_init()
        作用:adc初始化
        輸入:無
        返回值:無
        *******************************************************************************/
        void adc_init(void)
        {
        ADCSRA = 0x00; // 設置前,先關閉ADC
        ADMUX = 0x00; // 選擇外部VCC為基準,ADC0通道
        ADCSRB = 0x00; // AD轉換結果左對齊,(10位)
        // 使能ADC,啟動ADC單次轉換,8分頻
        ADCSRA = 0xc3;
        }
        /*******************************************************************************
        函數名:wdt_init()
        作用:看門狗初始化
        輸入:無
        返回值:無
        *******************************************************************************/
        void wdt_init(void)
        {
        asm("wdr"); // clr wdt
        WDTCSR=0x1f;
        WDTCSR=0x0f; // enable wdt,clk = 256,2S
        }
        /*******************************************************************************
        函數名:adc_get(uchar adc_ch)
        作用:啟動AD轉換,并返回轉換值
        輸入:adc_ch (AD轉換通道)
        返回值:adddata
        *******************************************************************************/
        uint adc_get(uchar adc_ch)
        {
        uint addata=0; // AD轉化初始數據為0
        uchar i;
        asm("wdr"); // 喂狗
        ADMUX = adc_ch; // adc_ch為ADC通道選擇
        for(i=10;i>0;i--)
        {
        ADCSRA_Bit6 = 1; // 啟動ADC轉換
        while((ADCSRA & 0x10) == 0); // 等待轉換結束,ADIF=1
        }
        addata=ADCL; // 讀取低8位數據
        addata+=ADCH*256; // 讀取高2位數據
        return addata; // 返回8位數據
        }
        /*******************************************************************************
        函數名: Vout_adc_get()
        作用:電池電壓檢測,檢測20次求平均值
        輸入:無
        返回值:無
        *******************************************************************************/
        void Vout_adc_get(void)
        {
        uchar n=0;
        ad_Vout_result=0;
        asm("wdr"); // 喂狗
        for(n=0;n<10;n++)
        {
        asm("wdr"); // 喂狗
        ad_Vout_result += adc_get(ad_Vout_flag);
        }
        ad_Vout_result = ad_Vout_result/10;
        }
        /*******************************************************************************
        函數名: Temp_adc_get()
        作用:電池溫度檢測,檢測20次求平均值
        輸入:無
        返回值:無
        *******************************************************************************/
        void Temp_adc_get(void)
        {
        uchar n=0;
        ad_Temp_result=0;
        asm("wdr"); // 喂狗
        for(n=0;n<10;n++)
        {
        asm("wdr"); // 喂狗
        ad_Temp_result += adc_get(ad_Temp_flag);
        }
        ad_Temp_result = ad_Temp_result/10;
        }
        /*******************************************************************************
        函數名: Iout_adc_get()
        作用:電流檢測,檢測20次求平均值
        輸入:無
        返回值:無
        *******************************************************************************/
        void Iout_adc_get(void)
        {
        uchar n=0;
        ad_Iout_result=0;
        asm("wdr"); // 喂狗
        for(n=0;n<10;n++)
        {
        asm("wdr"); // 喂狗
        ad_Iout_result += adc_get(ad_Iout_flag);
        }
        ad_Iout_result = ad_Iout_result/10;
        }
        /*******************************************************************************
        函數名:Send_164_data()
        作用:送164數據
        輸入:disp_data
        返回值:無
        *******************************************************************************/
        void Send_164_data(uchar disp_data)
        {
        uchar i;
        asm("wdr"); // 喂狗
        CLK164_OFF;
        for(i=0;i<8;i++)
        {
        asm("wdr"); // 喂狗
        if(disp_data&0x80)
        {
        DATA164_ON;
        }
        else
        {
        DATA164_OFF;
        }
        CLK164_ON;
        disp_data<<=1;
        CLK164_OFF;
        }
        }
        /*******************************************************************************
        函數名:disp_data_adc()
        作用:顯示數據處理
        輸入:無
        返回值:無
        *******************************************************************************/
        void disp_data_adc(void)
        {
        Vout_adc_get();
        Vout_disp = ad_Vout_result * 50;
        Vout_disp = Vout_disp / 128;
        Iout_adc_get();
        Iout_disp = ad_Iout_result * 50;
        Iout_disp = Iout_disp / 102;
        Iout_adj = (Vout_disp * 10) / 75;
        if((Iout_disp - Iout_adj) < 0x0fff)
        {
        Iout_disp = Iout_disp - Iout_adj;
        }
        else
        {
        Iout_disp = 0;
        }
        }
        /*******************************************************************************
        函數名:delay()
        作用:延時。。
        輸入:無
        返回值:無
        *******************************************************************************/
        void delay(void)
        {
        if(adc_get_flag == 0)
        {
        disp_data_adc();
        adc_get_flag=1;
        }
        else
        {
        delay_nms(20);
        }
        }
        /*******************************************************************************
        函數名:display_led()
        作用:數碼管顯示
        輸入:無
        返回值:無
        *******************************************************************************/
        void display_led(void)
        {
        asm("wdr"); // 喂狗
        Send_164_data(disp_led[Vout_disp / 100]);
        D1_ON;
        delay();
        D1_OFF;
        Send_164_data(disp_led[(Vout_disp % 100) / 10] - 0x08);
        D2_ON;
        delay();
        D2_OFF;
        Send_164_data(disp_led[(Vout_disp % 100) % 10]);
        D3_ON;
        delay();
        D3_OFF;
        Send_164_data(disp_led[Iout_disp / 100] - 0x08);
        D4_ON;
        delay();
        D4_OFF;
        Send_164_data(disp_led[(Iout_disp % 100) / 10]);
        D5_ON;
        delay();
        D5_OFF;
        Send_164_data(disp_led[(Iout_disp % 100) % 10]);
        D6_ON;
        delay();
        D6_OFF;
        }
        /*******************************************************************************
        函數名: time1_ovf()
        作用:TIMER1定時器中斷服務程序,8M 50ms中斷一次,4M 25ms中斷一次
        輸入:無
        返回值:無
        *******************************************************************************/
        #pragma vector=TIM1_OVF_vect
        __interrupt void time1_ovf(void)
        {
        TCNT1H = 0x40;
        TCNT1L = 0x00;
        asm("wdr"); // 喂狗
        time_cnt1++;
        if(time_cnt1==50) //
        {
        asm("wdr"); // 喂狗
        time_cnt1=0;
        adc_get_flag=0;
        }
        }
        /*******************************************************************************
        主函數
        *******************************************************************************/
        void main(void)
        {
        mcu_init(); // 單片機初始化
        adc_init(); // AD轉換初始化
        wdt_init(); // 看門狗初始化
        while(1)
        {
        display_led();
        }
        }

        MCU型號: AT Tiny24
        功能說明:0-30V 可調電源 顯示電壓及電流
        引腳說明;PA0/ADC0--D1 電壓
        PA1/ADC1--D2 電壓
        PA2/ADC2--D3 電壓
        PA3/ADC3--RT
        PA4/ADC4--Vout
        PA5/ADC5--Iout
        PA6/ADC6--D5 電流
        PA7/ADC7--D6 電流
        PB2/ --D4 電流
        PB3/RESET--FAN
        PB1 --74HC164 DATA
        PB0 --74HC164 SCK
        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 自治县| 乐安县| 离岛区| 齐河县| 于都县| 德州市| 昭觉县| 教育| 迁安市| 永兴县| 育儿| 江永县| 肇庆市| 保靖县| 塔城市| 布尔津县| 海林市| 福州市| 图们市| 漠河县| 明星| 同仁县| 四川省| 龙井市| 道真| 鲁山县| 阳原县| 南宁市| 新竹市| 桂林市| 绥棱县| 宜城市| 通海县| 顺义区| 荆州市| 平南县| 江华| 涿州市| 南和县| 金寨县| 霍邱县|