初學單片機幾月,這是我最近做的關于ad轉換的電壓采集。
如有錯誤,望請指正,蟹蟹~
希望大家能夠多多與我交流經驗,新人請多多指教。
用proteus畫的仿真圖,文檔中含有源代碼與仿真文件。
AD3.PNG (154.21 KB, 下載次數: 45)
下載附件
2020-6-30 20:31 上傳
仿真實現結果
ad1.PNG (160.05 KB, 下載次數: 29)
下載附件
2020-6-30 20:31 上傳
AD2.PNG (157.91 KB, 下載次數: 39)
下載附件
2020-6-30 20:31 上傳
- #include<reg51.h>
- #include <intrins.h>
- sbit w1=P1^4;
- sbit w2=P1^5;
- sbit w3=P1^6;
- sbit w4=P1^7;
- sbit OE=P1^0;
- sbit EOC=P1^1;
- sbit ST=P1^2;
- sbit CLOCK=P1^3;
- sbit a=P0^0;
- sbit b=P0^1;
- sbit c=P0^2;
- unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12};/*帶小數點的數字0~5*/
- unsigned char code table2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數碼管0~9編碼
- unsigned char vdata;
- void zhongduan()
- {
- a=0;
- b=0;
- c=0;//選擇通道0
- TMOD=0x02;
- TH0=256-50;
- TL0=256-50;
- EA=1;ET0=1;
- TR0=1;
- }
- void delay()
- {unsigned char i,j;
- for(i=0;i<10;i++)
- for(j=0;j<50;j++);}
- void convert(unsigned char vdata)//數碼管的動態顯示
- {
- P2=table1[vdata*196/10000];/*小數點前一位數字顯示 */
- w1=1;
- delay();
- w1=0;
- P2=table2[vdata*196/1000%10]; //小數點后一位
- w2=1;
- delay();
- w2=0;
- P2=table2[vdata*196/100%10];//小數點后兩位
- w3=1;
- delay();
- w3=0;
- P2=table2[vdata*196/10%10]; //小數點后三位
- w4=1;
- delay();
- w4=0;
- }
- void main()
- {
- unsigned char vdata;
- zhongduan();
- while(1)
- {
- ST=0;
- _nop_();
- ST=1;
- _nop_();
- ST=0;
- _nop_(); //構造上升下降沿,啟動AD轉換器
- while(EOC==0); //等待ad轉換結束
- OE=1;//數據送至out口
- _nop_();
- vdata=P3;//將數據值賦給變量vdata
- convert(vdata);//將轉換的數據通過數碼管顯示所得數字
- delay();
- OE=0;
- }}
- void time0_int()interrupt 1 //中斷服務子程序,產生時鐘脈沖,將模擬信號轉換為數字信號
- {
- CLOCK=~CLOCK;
- }
復制代碼
|