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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 使用STC12C5204AD單片機的數(shù)字電壓表

          使用STC12C5204AD單片機的數(shù)字電壓表

          作者: 時間:2016-11-30 來源:網(wǎng)絡(luò) 收藏

          這是一塊使用STC12C5204AD數(shù)字電壓表的制作程序,P0.0-P0.3 共陰數(shù)碼管位驅(qū)動端,P2口為共陰數(shù)碼管段a-g及dp的段驅(qū)動端口,P0、P2口設(shè)置為推挽輸出方式,段輸出加470歐限流電阻,AD為8位,轉(zhuǎn)換電壓分度5/256=0.0195312V,分流電阻為實測阻值,AD值*0.0195312v/對地分流電阻,算出分流電流,然后用分流電流*分流電阻與限流電阻之和即為要顯示的輸入電壓值。業(yè)余使用,精度已經(jīng)夠用了,比那個小的指針的要準確多了。其中涉及到端口設(shè)置的地方大家對照芯片手冊更正。
          #include //STC12C5204AD頭文件 (6 K) 下載次數(shù):15
          #include //_nop_();
          #define uchar unsigned char
          #define uint unsigned int
          //sfr ADC_CONTR=0XBC;//adc使能位.ADC電源控制位
          sfr ADC_RES=0XBD;//adc數(shù)據(jù)高八位,即ADC值
          sfr P1ASF=0X9D;//P1各端口ADC使能端
          uchar led_bcd[]={0x3F,/*0*/ //共陰數(shù)碼管
          0x06,/*1*/
          0x5B,/*2*/
          0x4F,/*3*/
          0x66,/*4*/
          0x6D,/*5*/
          0x7D,/*6*/
          0x07,/*7*/
          0x7F,/*8*/
          0x6F,/*9*/
          0x00,/* */
          0x7c /*b*/
          }
          ,ad_data
          ;
          uint data dis[5]={0x00,0x00,0x00,0x00,0x00},ZZ; //定義四個顯示數(shù)據(jù)單元和一個數(shù)據(jù)存儲單元
          //dis[4,3,2,1,5] 顯示:12.34 5為存儲單元

          本文引用地址:http://www.ex-cimer.com/article/201611/324016.htm

          /*******************************************************************/
          /* 延時子程序 */
          /* */
          /* */
          /*******************************************************************/
          void delay(uint z) //延時子函數(shù)
          {
          uchar de1,de2;
          for(de1=z;de1>0;de1--)
          for(de2=100;de2>0;de2--);
          }
          /*******************************************************/
          //顯示子函數(shù) display(h1,h2,h3,h4)
          //h1,h2,h3,h4 為四位LED數(shù)碼管顯示變量
          //
          //
          //
          /*******************************************************/
          void display(uchar h1,uchar h2,uchar s1,uchar s2) ////LED顯示函數(shù)(參數(shù):LED1,LED2,LED3,LED4)
          {

          // 第一個數(shù)碼管顯示數(shù)據(jù)
          if(h1==0x3f) h1=0x00; //0消隱語句
          P2=h1;
          //delay(2);
          P00=0;
          delay(2); //參數(shù)2-10 數(shù)值大LED亮度高但閃爍感強,數(shù)值小LED亮度低,但閃爍感小.
          P2=0X00;
          P00=1;
          /*******************************************************/
          // 第二個數(shù)碼管顯示數(shù)據(jù)
          P2=h2|0x80;
          //delay(2);
          P01=0;
          delay(2); //參數(shù)2-10 數(shù)值大LED亮度高但閃爍感強,數(shù)值小LED亮度低,但閃爍感小.
          P2=0X00;
          P01=1;
          //delay(5);
          /*******************************************************/
          // 第三個數(shù)碼管顯示數(shù)據(jù)

          P2=s1;
          //delay(2);
          P02=0;
          delay(2); //參數(shù)2-10 數(shù)值大LED亮度高但閃爍感強,數(shù)值小LED亮度低,但閃爍感小.
          P2=0X00;
          P02=1;
          // delay(5);
          /*******************************************************/
          // 第四個數(shù)碼管顯示數(shù)據(jù)
          P2=s2;
          //delay(2);
          P03=0;
          delay(2); //參數(shù)2-10 數(shù)值大LED亮度高但閃爍感強,數(shù)值小LED亮度低,但閃爍感小.
          P2=0X00;
          P03=1;

          //delay(5);

          }
          void init()//系統(tǒng)初始化函數(shù)
          {
          P2M1=0Xff; //強推挽 推動a-g dp
          P2M0=0X00; //強推挽 推動a-g dp
          P0M1=0X0f; //強推挽 推動位
          P0M0=0X00; //強推挽 推動位
          P0=0XFF; //初始化
          P2=0; //初始化
          /***定時器0初始化設(shè)置*****/
          TMOD = 0x01;
          TH0 = 0xFC; //初值1ms
          TL0 = 0x18; //初值1ms
          EA = 1; //開總中斷
          ET0 = 1; //定時器0中斷打開
          TR0 = 1; //打開定時器 開始計時
          /*************************/
          ZZ=0;
          }
          void initADC() //AD初始化
          {
          P1ASF=0x01;//只使用P1.0端口做為ADC輸入端.
          ADC_RES=0;//ADC數(shù)據(jù)寄存器清零
          ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //打開ADC開關(guān)并設(shè)置 轉(zhuǎn)換速率詳見STC12C52.H
          delay(2); //打開ADC并延時.
          }
          uchar readADC() //讀AD
          {
          ADC_CONTR=ADC_POWER|ADC_SPEEDLL|0|ADC_START;
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          while(!(ADC_CONTR&ADC_FLAG));//等待轉(zhuǎn)換完成標志
          ADC_CONTR&=~ADC_FLAG;//close ADC
          return ADC_RES;//返回ADC值.
          }
          void main()
          {
          init();
          initADC();//初始化ADC
          ad_data=readADC();//開機轉(zhuǎn)換
          while(1)
          {
          float j;
          uchar ad_data;
          while(ZZ>=500) //500毫秒讀一次ADC
          {
          ad_data=readADC();//讀入ADC數(shù)據(jù)
          ZZ=0;
          }
          j=ad_data*19.5312;//由AD數(shù)據(jù)*19.5312(放大1000倍)=分流后的電壓
          j=j/9890; //j(電壓)/接地電阻(實測)9890歐
          j=j*60190;//j(電流)*(輸入限流電阻(實測)60190歐+接地電阻(實測)9890歐) 計算出實際輸入電壓如果使用高精度電阻,則直接輸入電阻值
          dis[4]=j/1000;
          dis[3]=dis[4]/10;
          dis[2]=dis[4]%10;
          //h=(h-(dis[3]*10+dis[2]))*100;
          dis[4]=j/10-dis[4]*100;
          //dis[4]=j%100;//小數(shù)位第一位
          dis[1]=dis[4]/10;
          dis[0]=dis[4]%10;//小數(shù)位第二位
          //delay(10000);
          }
          }
          void Timer0Interrupt(void) interrupt 1
          {
          ZZ++; //AD讀取間隔時間控制
          TH0 = 0xFC;
          TL0 = 0x18;
          display(led_bcd[dis[3]],led_bcd[dis[2]],led_bcd[dis[1]],led_bcd[dis[0]]);
          }



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁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); })();