<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 一個簡單的單片機直流可調穩(wěn)壓電源設計

          一個簡單的單片機直流可調穩(wěn)壓電源設計

          作者: 時間: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 }; //各個數(shù)碼管對應的位選數(shù)據(jù)

          sbit DIO = P1^0; //數(shù)據(jù)線
          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; //用于顯示數(shù)碼管的 千,百,十,個 等四位的顯示
          uint val,num; //val 是用于輸入DA 的數(shù)據(jù),num是用于判斷是不是長按的
          uint cp; //計數(shù)的變量
          uchar key_stat;
          ucharadd_stat,sub_stat;
          uchar st_flag,pre_flag;

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

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

          /**********************************************
          函數(shù)名稱:TL549_AD()
          函數(shù)作用:返回AD的返回值
          函數(shù)參數(shù):無
          函數(shù)返回值: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++) //讀取采集數(shù)據(jù),讀取的是上一次采集數(shù)據(jù)
          {
          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);
          }

          /**********************************************
          函數(shù)名稱:TLC5615_DA(uint da)
          函數(shù)作用:TLC5615_DA 將da轉換后模擬輸出
          函數(shù)參數(shù):da
          函數(shù)返回值:無
          **********************************************/
          void TLC5615_DA(uint da) // TLC5615 的DA 轉換函數(shù)
          {
          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++);
          }

          /**********************************************
          函數(shù)名稱:key_scan()
          函數(shù)作用:處理那些獨立鍵盤
          函數(shù)參數(shù):無
          函數(shù)返回值:無
          **********************************************/
          void key_scan()
          {
          if (ADD == 0) // ADD 按鍵的鍵盤處理函數(shù)
          {
          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 按鍵的鍵盤處理函數(shù)
          {
          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) //預讀數(shù)據(jù)的 鍵盤處理函數(shù)
          {
          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 中讀出預存儲的數(shù)據(jù)
          }
          }

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

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

          P0=0xff; //與j對應,P2輸出數(shù)碼管的位選信號
          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 下一頁

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();