|
給大家分享一個(gè)用ADC0832模數(shù)轉(zhuǎn)換芯片設(shè)計(jì)的電壓表設(shè)計(jì),內(nèi)含protues電路圖和帶有注釋的keil工程文件
ADC0832電壓表仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (28.57 KB, 下載次數(shù): 142)
下載附件
2018-6-10 00:28 上傳
0.png (54.11 KB, 下載次數(shù): 117)
下載附件
2018-6-10 00:28 上傳
單片機(jī)電壓表源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
-
- sbit CS =P3^4; //片選使能端
- sbit DI =P1^1; //數(shù)據(jù)信號(hào)輸入端,選擇通道控制(SIG/DIF和ODD/EVEN)
- sbit DO =P1^1; //數(shù)據(jù)輸出端
- sbit CLK =P1^0; //時(shí)鐘脈沖
- sbit S_1 = P2^3;
- sbit S_2 = P2^4;
- sbit S_3 = P2^5;
- sbit S_4 = P2^6;
- unsigned char wd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //不帶小數(shù)點(diǎn)的段選碼
- unsigned char yd[]={0x40,0x79,0x024,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//帶小數(shù)點(diǎn)的段選碼
- // ===========延時(shí)子程序=================
- void delay_ms(unsigned int x)
- {
- unsigned int i,j;
- for(i=0;i<x;i++)
- for(j=0;j<123;j++); //延時(shí)1ms
- }
- /*=============讀ADC0832函數(shù)=============*/
- /*=============采集并返回=================*/
- unsigned int Adc0832(unsigned char channel) //AD轉(zhuǎn)換,返回結(jié)果
- {
- uchar i=0;
- uchar j;
- uint dat=0; //正向輸入數(shù)據(jù)
- uchar ndat=0; //反向輸入數(shù)據(jù)
- //****************初始化操作**************
- if(channel==0)channel=2; //10B對(duì)應(yīng)SGL/DIF=1,ODD/EVEN=0
- if(channel==1)channel=3; //11B對(duì)應(yīng)SGL/DIF=1,ODD/EVEN=1
- //****************寫(xiě)操作,將通道數(shù)據(jù)寫(xiě)入ADC0832**************
- DI=1; _nop_();_nop_(); //發(fā)起始位,固定為1(1位)
- CS=0;_nop_();_nop_(); //拉低CS端,讓ADC0832使能
- CLK=1;_nop_();_nop_(); //拉高CLK端,DI端的數(shù)據(jù)移入ADC0832內(nèi)部的多路移位寄存器
- CLK=0;_nop_();_nop_(); //拉低CLK端,形成下降沿1,第一個(gè)周期開(kāi)始
- CLK=1; //拉高CLK端,在第一個(gè)時(shí)鐘周期內(nèi),DI為高電平,表示啟動(dòng)位
- //緊接著輸入兩位配置位進(jìn)行通道選擇
- DI=channel&0x1;_nop_();_nop_(); //假設(shè)選取通道0,則10&01=0,即SGL/DIF=0,為差分輸入(2位)
- CLK=0;_nop_();_nop_(); //拉低CLK端,形成下降沿2,第二個(gè)周期開(kāi)始
- CLK=1; //拉高CLK端
- DI=(channel>>1)&0x1;_nop_();_nop_(); //假設(shè)選取通道0,則01&01=1,ODD/EVEN=1,表示通道0
- CLK=0; //拉低CLK端,形成下降沿3
- DI=1;_nop_();_nop_(); //控制命令結(jié)束
- dat=0;
- //*************讀操作,將AD轉(zhuǎn)換的數(shù)從DO口輸出****************
- for(i=0;i<8;i++) //每一個(gè)CLK下降沿輸出一位數(shù),先輸出高位
- {
- dat|=DO; //收數(shù)據(jù),“|”位或,如果2位中有一位為1,則結(jié)果為1,否則為0
- CLK=1;_nop_();_nop_();
- CLK=0;_nop_();_nop_(); //形成一次時(shí)鐘脈沖
- dat<<=1;
- if(i==7)dat|=DO;
- }
-
- for(i=0;i<8;i++) //每一個(gè)CLK下降沿輸出一位數(shù),先輸出低位
- {
- j=0;
- j=j|DO; //收數(shù)據(jù)
- CLK=1;_nop_();_nop_();
- CLK=0;_nop_();_nop_(); //形成一次時(shí)鐘脈沖
- j=j<<7;
- ndat=ndat|j;
- if(i<7)ndat>>=1;
- }
- //*********************結(jié)束AD轉(zhuǎn)換,并返回轉(zhuǎn)換的數(shù)***********************
- CS=1; //拉低CS端
- CLK=0; //拉低CLK端
- DO=1; //拉高數(shù)據(jù)端,回到初始狀態(tài)
- dat<<=8;
- dat|=ndat;
- return(dat); //返回?cái)?shù)據(jù)
- }
- //============數(shù)碼管顯示函數(shù)==========================
- void display(uchar p) //數(shù)碼管顯示函數(shù)
- {
- uchar S1,S2,S3;
-
- S1=p/51; //個(gè)位
- S2=(p*10/51)%10; //十分位
- S3=(p*100/51)%10; //百分位
-
- //個(gè)位
- S_1 = 1; //第一個(gè)數(shù)碼管
- S_2 = 0;
- S_3 = 0;
- S_4= 0;
- P0=yd[S1]; //選取帶有小數(shù)點(diǎn)的段選碼
- delay_ms(5); //延時(shí)
- S_1 = 0; //消隱
-
- //十分位
- S_1 = 0;
- S_2 = 1; //取第二個(gè)數(shù)碼管
- S_3= 0;
- S_4= 0;
- P0=wd[S2]; //選取不帶有小數(shù)點(diǎn)的段選碼
- delay_ms(5);
- S_2 = 0; //消隱
-
- //百分位
- S_1 = 0;
- S_2 = 0;
- S_3= 1; //取第三個(gè)數(shù)碼管
- S_4= 0;
- P0=wd[S3]; //選取不帶有小數(shù)點(diǎn)的段選碼
- delay_ms(5);
- S_3= 0; //消隱
- }
- //===========主函數(shù)================
- int main(void)
- {
- while(1) //無(wú)限循環(huán)
- display(Adc0832(0));//數(shù)碼管顯示
- //Adc0832(0):選擇通道0,單端模式
- //調(diào)用Adc0832(0),SIG/DIF=0,ODD/EVEN=1,表示工作在差分輸入方式,且CH0為-,CH1為+
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼 Keil代碼與Proteus8.8仿真下載:
基于ADC0832簡(jiǎn)易數(shù)字電壓表.zip
(64.85 KB, 下載次數(shù): 1077)
2018-6-9 23:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|