第一次接觸模數轉換,做了這么一個小仿真,測量0~25V的輸入電壓,以4位數(兩位小數)的形式顯示在一個四位共陽數碼管上,測量誤差不大于0.1V。
ADC0832只是一個對0~5V電壓進行模擬轉數字的器件,分辨率8位,即有從0到255個擋位,每一檔約為(5/255)V,即0.02V,為了實現0~25V的轉換,先將待測電壓通過電位器(滑動電阻)縮小5倍,保證其始終處于0~5V內再輸入ADC0832(ADC0832實際轉換的模擬量在0~5V之內),然后再將ADC0832轉換后的數值*5,即可獲知待測電壓的實際值。
但這種取巧的方式雖然能在不換器件的前提下實現量程的擴充,但缺陷是誤差值也隨之放大(因為先把電壓通過電位器幾乎零誤差的縮小1/5,然后再把ADC0832的轉換結果放大5倍),ADC0832的誤差值大約0.02V,電壓表實際測量的誤差值大約0.1V
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
Snipaste_2021-09-19_12-25-31.png (67.06 KB, 下載次數: 93)
下載附件
2021-9-19 12:26 上傳
源碼:
- #include<reg51.h>
- #include<intrins.h>
- sbit CS=P3^5;
- sbit CLK=P3^3;
- sbit DI=P3^4;
- sbit DO=P3^4;
- sbit dot=P0^5; //小數點
- unsigned char dat=0x00;
- unsigned char nums[]={0x00,0x00,0x00,0x00};
- unsigned char channel; //轉換通道
- unsigned char LEDS[]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xB8,0x20,0x28}; //共陽4位數碼管段碼,字符顯示從'0'到'9'
- unsigned char ADC0832(unsigned char channel) //模數轉換
- {
- unsigned char i;
- unsigned char x=0x00;
- unsigned char y=0x00;
- CLK=0; //初始化
- DI=1;
- _nop_();
- CS=0;
- _nop_();
- CLK=1;
- _nop_();
- if(channel==0x00) //通道選擇
- { //通道0
- CLK=0;
- DI=1;
- _nop_();
- CLK=1;
- _nop_();
- CLK=0;
- DI=0;
- _nop_();
- CLK=1;
- _nop_();
- }
- else //通道1
- {
- CLK=0;
- DI=1;
- _nop_();
- CLK=1;
- _nop_();
- CLK=0;
- DI=1;
- _nop_();
- CLK=1;
- _nop_();
- }
- CLK=0;
- DI=1;
- for(i=0;i<8;i++) //讀取ADC0832輸出的前8位數據
- {
- x<<=1;
- _nop_();
- CLK=1;
- _nop_();
- CLK=0;
- if(DO==1)
- {
- x|=0x01;
- }
- else
- {
- x|=0x00;
- }
- }
- for(i=0;i<8;i++) //讀取ADC0832輸出的后8位數據
- {
- y>>=1;
- if(DO==1)
- {
- y|=0x80;
- }
- else
- {
- y|=0x00;
- }
- _nop_();
- CLK=1;
- _nop_();
- CLK=0;
- }
- if(x==y) //校驗,比較前8位與后8位的值
- {
- dat=x;
- }
- _nop_();
- CS=1; //釋放ADC0832
- DO=1;
- CLK=1;
- return dat;
- }
- void Convert(unsigned char dat0) //數據處理
- {
- unsigned int x;
- x=dat0*0.0196*100*5;
- nums[0]=x/1000;
- nums[1]=x%1000/100;
- nums[2]=x%1000%100/10;
- nums[3]=x%1000%100%10;
- }
- void Delay() //數碼管顯示
- {
- unsigned char i,j;
- for(i=0;i<1;i++)
- {
- for(j=0;j<121;j++);
- }
- }
- void Display()
- {
- P0=LEDS[nums[0]];
- P2=0xFE;
- Delay();
- P2=0xFF;
- P0=LEDS[nums[1]];
- dot=0;
- P2=0xFD;
- Delay();
- P2=0xFF;
- P0=LEDS[nums[2]];
- P2=0xFB;
- Delay();
- P2=0xFF;
- P0=LEDS[nums[3]];
- P2=0xF7;
- Delay();
- P2=0xFF;
- }
- void main()
- {
- while(1)
- {
- dat=ADC0832(channel);
- Convert(dat);
- Display();
- }
- }
復制代碼
51hei.png (6.57 KB, 下載次數: 82)
下載附件
2021-9-19 15:58 上傳
上圖仿真工程文件和.c文件51hei附件下載:
ADC0832數字電壓表(0~25V).zip
(43.82 KB, 下載次數: 177)
2021-9-19 12:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|