新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 一個簡單的單片機直流可調穩壓電源設計

        一個簡單的單片機直流可調穩壓電源設計

        作者: 時間:2016-12-01 來源:網絡 收藏

        main.c 代碼
        #include"reg52.h"
        #include "intrins.h"
        #include "AT24C04.h"

        #define uchar unsigned char
        #define uint unsigned int

        uchar code LED[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
        uchar code Bit_sel[4] = {0x08,0x04,0x02,0x01 }; //各個數碼管對應的位選數據

        sbit DIO = P1^0; //數據線
        sbit CS = P1^1; //片選
        sbit CLK = P1^2; //io口時鐘

        sbit SCS = P1^4;
        sbit SDATA = P1^5;
        sbit SCLK = P1^3;

        sbit ADD = P3^0;
        sbit SUB = P3^1;
        sbit Pre_read = P3^2;
        sbit Store = P3^3;

        uint qian,bai,shi,ge; //用于顯示數碼管的 千,百,十,個 等四位的顯示
        uint val,num; //val 是用于輸入DA 的數據,num是用于判斷是不是長按的
        uint cp; //計數的變量
        uchar key_stat;
        ucharadd_stat,sub_stat;
        uchar st_flag,pre_flag;

        void delay(uint x) //微妙級是延時函數
        {
        while(x--)
        _nop_();
        }

        /**********************************************
        函數名稱:deal
        函數作用:處理AD的返回值
        函數參數:無
        函數返回值:無
        **********************************************/
        void deal(uint num) //顯示程序
        {
        qian=num/1000; //千,百,十,個處理
        bai=num/100%10;
        shi=num/10%10;
        ge=num%10;
        }

        /**********************************************
        函數名稱:TL549_AD()
        函數作用:返回AD的返回值
        函數參數:無
        函數返回值:data_ad
        **********************************************/
        uint TL549_AD() //TLC549處理
        {
        uchar i;
        uint data_ad = 0;
        CS = 1; //初始化,啟動
        CLK = 0;
        CS = 0;
        _nop_();
        for(i = 0;i < 8;i++) //讀取采集數據,讀取的是上一次采集數據
        {
        CLK = 1;
        if(DIO)data_ad |= 0x01;
        CLK = 0;
        data_ad = data_ad << 1;
        }
        CS = 1;
        data_ad = data_ad * (500/ 256);
        return(data_ad);
        }

        /**********************************************
        函數名稱:TLC5615_DA(uint da)
        函數作用:TLC5615_DA 將da轉換后模擬輸出
        函數參數:da
        函數返回值:無
        **********************************************/
        void TLC5615_DA(uint da) // TLC5615 的DA 轉換函數
        {
        uchar i;
        da<<=6;

        SCS=0;
        SCLK=0;

        for (i=0;i<12;i++)
        {
        SDATA=(bit)(da&0x8000);
        SCLK=1;
        da<<=1;
        SCLK=0;
        }

        SCS=1;
        SCLK=0;
        for (i=0;i<12;i++);
        }

        /**********************************************
        函數名稱:key_scan()
        函數作用:處理那些獨立鍵盤
        函數參數:無
        函數返回值:無
        **********************************************/
        void key_scan()
        {
        if (ADD == 0) // ADD 按鍵的鍵盤處理函數
        {
        delay(10);
        if (ADD == 0)
        {
        add_stat = 1;
        num ++;
        }
        else
        {
        add_stat = 0;
        num = 0;
        }
        //此處判斷是不是長按,長按的話 使其步進值 加大
        if (ADD == 0 && add_stat == 1 && num >= 300)
        {
        val += 5;
        num = 0;
        }
        if (ADD == 1 && add_stat == 1)
        {
        val ++;
        num = 0;
        add_stat = 0;
        }
        if (val >= 1024)
        {
        val = 1023;
        }
        }

        if (SUB == 0) //SUB 按鍵的鍵盤處理函數
        {
        delay(10);
        if (SUB == 0)
        {
        sub_stat = 1;
        num ++;
        }
        if (SUB == 0 && sub_stat == 1 && num >= 300)
        {
        val -= 5;
        num = 0;
        }
        if (SUB == 1 && sub_stat == 1)
        {
        val --;
        num = 0;
        sub_stat = 0;
        }
        if (val <= 0)
        val = 0;
        }

        if (Pre_read == 0) //預讀數據的 鍵盤處理函數
        {
        delay(100);
        if (Pre_read == 0)
        {
        pre_flag = 1;
        }
        if (Pre_read == 1 &&pre_flag == 1 )
        {
        pre_flag = 0;
        val = read_24C04(20); //從AT24C04中的地址20 中讀出預存儲的數據
        }
        }

        if (Store == 0) //保存數值 按鍵的鍵盤處理函數
        {
        delay(100);
        if (Store == 0)
        {
        st_flag = 1;
        }
        if (Store == 1 && st_flag == 1)
        {
        st_flag = 0;
        write_24C04(20,val); //向AT24C04中的地址20 寫入存儲的數據
        }
        }
        }
        /**********************************************
        函數名稱:timer0_init (void)
        函數作用:初始化定時器0,并設置
        函數參數:無
        函數返回值:無
        **********************************************/
        void timer0_init (void) // timer0中斷初始化函數
        {
        EA = 0;
        TMOD = 0x01;
        TR0 = 0;
        TL0 = (65536-5000)%256; //設置計數器初值
        TH0 = (65536-5000)/256;
        PT0 = 1;
        ET0 = 1;
        EA = 1;
        TR0 = 1;
        }
        /**********************************************
        函數名稱:main(void)
        函數作用:main主函數入口
        函數參數:無
        函數返回值:無
        **********************************************/
        void main(void) //主程序
        {
        timer0_init(); //初始化定時器0
        init_24C04(); //初始化AT24C04
        while(1)
        {
        key_scan(); //調用鍵盤掃描函數
        TLC5615_DA(val); //處理鍵盤發送過來的值
        }
        }

        /**********************************************
        函數名稱:timer0_isr(void) interrupt 1
        函數作用:定時器0,方式1,的中斷服務子程序
        函數參數:無
        函數返回值:無
        **********************************************/
        void timer0_isr(void) interrupt 1 // timer0中斷服務函數
        {
        //數碼管的位選變量
        TR0 = 0; //停止計數
        TL0 = (65536-5000)%256; //重新載入計數器初值
        TH0 = (65536-5000)/256;
        cp++; //位循環變量加1
        if(cp >= 4)
        cp = 0;
        deal(TL549_AD()); //循環顯示1次,j清零
        TR0 = 1;

        P0=0xff; //與j對應,P2輸出數碼管的位選信號
        switch(cp)
        {
        case 0: P0 = LED[ge]; break;
        case 1: P0 = LED[shi]; break;
        case 2: P0 = LED[bai]&0x7f; break;
        case 3: P0 = LED[qian]; break;
        }
        P2 = Bit_sel[cp];
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 隆德县| 齐齐哈尔市| 临汾市| 公安县| 井冈山市| 林西县| 瑞丽市| 瓦房店市| 林州市| 娄底市| 陆良县| 攀枝花市| 蛟河市| 扎鲁特旗| 兰西县| 库伦旗| 巍山| 汉中市| 岳池县| 沈丘县| 古交市| 治多县| 夏津县| 迁安市| 红安县| 和龙市| 泸西县| 林州市| 弥勒县| 松阳县| 靖西县| 房山区| 临朐县| 铜川市| 文登市| 开平市| 勐海县| 射洪县| 广安市| 自贡市| 惠来县|