終于把這個模擬給做出來了,體會到了怎么去發現坑,學著去填坑,仿真文件供大家參考,謝謝。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- //利用_nop_()的等待命令
- #define uchar unsigned char
- #define uint unsigned int
- sbit adwr=P3^2;
- sbit adrd=P3^1;
- sbit CS=P3^0;
- sbit INTR=P3^3;
- uchar num;
- uchar code display[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //共陽極數碼管的顯示代碼
- uchar COM[]={0x01,0x02,0x04,0x08};
- //數碼管的位選代碼
- uchar num, num2=0,time[4]={0,0,0,0},val;
- float val2;
- unsigned int val3;
- main()
- {
- //使用定時器0定時對結果掃描顯示
- TMOD=0x01; //定時器的工作方式1
- TH0=(65536-917)/256; //定時定義初值
- TL0=(65536-917)%256;
- EA=1; //總中斷使能打開
- ET0=1; //定時器0中斷
- TR0=1; //定時器0啟動
- CS=0; // 啟動轉換
- while(1)
- //此處循環等待時間到中斷
- {
- adwr=1;
- _nop_();
- adwr=0;
- _nop_();
- adwr=1;
- INTR=0;//intr轉換完成后自動拉低
- //當只有一片AD芯片時,可以將CS一直處在低位即可,連續轉換
- adrd=1;
- _nop_();
- adrd=0;
- _nop_();
- val=P1;
- adrd=1;
- val2=((val*1.0/255)*5.0);//將數字量轉換為數值。
- val3=val2*1000;//將轉化的數值放大后,分別其對應位的值
- time[0]=val3/1000;//個位
- time[1]=val3%1000/100;//個分位
- time[2]=val3%100/10;//十分位
- time[3]=val3%10;//千分位
- }
- }
- void Timer_0() interrupt 1
- {
- TH0=(65536-917)/256; //中斷后計數器重新賦值
- TL0=(65536-917)%256;
- num++;
- if (num==10)
- {num=0;
- P2=COM[num2];//取反后,位選數碼管全部熄滅
- //共陽極數碼管時,高電平選通,低電平關閉
- P0=0xff;//數碼管全部低電平,熄滅
- {
- if(num2==0)
- {P0=display[time[num2]]&0x7F;} //顯示帶小數點的個位數
- else
- {P0=display[time[num2]];}
- }
- num2++;
- if(num2>=4) num2=0;
- }
- }
復制代碼
所有資料51hei提供下載:
02_ADC轉換.zip
(89.66 KB, 下載次數: 41)
2020-11-7 22:39 上傳
點擊文件名下載附件
|