- /*10位就是10位二進制數的意思,即0000000000-1111111111等于10進制的0-1023*/
- /*ADC轉換結果右對齊: ADC_RES (高2位寄存器),ADC_RESL (低8位寄存器)*/
- //ADC被轉換通道的輸入電壓Vin=MCU工作電壓或參考源電壓*10位ADC轉換結果/1024
- //分壓前最高輸入電壓=MCU工作電壓或參考源電壓/[對地電阻阻值/(對地電阻阻值+串接電阻阻值)]
- //分壓倍率=分壓前最高輸入電壓/MCU工作電壓 分壓前輸入電壓(方法一)=ADC管腳輸入電壓*分壓倍率(精確到小數點)
- //分壓前輸入電壓(方法二,會有很多位小數)=ADC管腳輸入電壓/[對地電阻阻值/(對地電阻阻值+串接電阻阻值)]
- #include "STC8G.h"
- #include "intrins.h"
- unsigned char q,b,s,g;/*位選*/
- unsigned char code dm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*共陰段碼*/
- void delayms(unsigned int i){while(i--);}/*延時函數*/
- void display()/*數碼管掃描*/
- {
- unsigned char i;
- for(i=0;i<4;i++)
- {
- switch(i)/*選擇顯示位置*/
- {
- case(0):P34=0;P35=1;P36=1;P37=1;break;/*千位*/
- case(1):P34=1;P35=0;P36=1;P37=1;break;/*百位*/
- case(2):P34=1;P35=1;P36=0;P37=1;break;/*十位*/
- case(3):P34=1;P35=1;P36=1;P37=0;break;/*個位*/
- }
- if(i==0){P1=dm[q];} /*千位*/
- if(i==1){P1=dm[b];} /*百位*/ //用作ADC十位
- if(i==2){P1=dm[s]+0x80;}/*十位*/ //用作ADC個位固定小數點
- if(i==3){P1=dm[g];} /*個位*/ //用作ADC小數點后一位
- delayms(50); /*間隔一段時間掃描*/
- P1=0x00; /*消隱*/
- }
- }
- void main()
- {
- unsigned int dy;unsigned char i;
- P1M0=0xff; P1M1=0;
- P3M0=0; P3M1=0x01; /*設置P3.0為ADC口*/
- P5M0=0; P5M1=0;
- P_SW2 |= 0x80;
- ADCTIM = 0x3f; /*設置ADC內部時序*/
- P_SW2 &= 0x7f;ADCCFG = 0x0f; /*設置ADC時鐘為系統時鐘/2/16*/
- ADC_CONTR = 0x88; /*使能ADC模塊 設置P30ADC8*/
- q=b=s=g=0;
- while (1)
- {
- dy=0;
- for(i=0;i<8;i++) //讀取8次數據
- {
- ADC_CONTR |= 0x40; /*啟動AD轉換*/
- _nop_();
- _nop_();
- while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
- ADC_CONTR &= ~0x20; //清完成標志
- ADCCFG = 0x20; //設置結果右對齊
- dy+=ADC_RES<<8|ADC_RESL;
- }
- dy>>=3; //取平均值
- //g=dy%10;s=dy/10%10;b=dy/100%10;q=dy/1000%10;/*ADC轉換結果0-1023*/
- dy=5000*(long)dy/1024;/*強制轉換數據類型(32位)運算,得到管腳電壓毫伏(mV)*/
- dy=dy*7.06;/*分壓倍率*/
- //dy=dy/(3.3/(3.3+20));/*方法二*/
- g=dy/100%10;
- s=dy/1000%10;
- b=dy/10000%10;
- q=0;
- display();/*數碼管掃描*/
- }
- }
復制代碼
|