源碼加電路圖
單片機源程序如下:
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數碼管顯示0-9的電平碼
- uint volt,vtime; //電壓值測定值
- uchar addr;//測量地址位
- sbit LW1=P2^3; //對應第4個數碼管
- sbit LW2=P2^2; //對應第3個數碼管
- sbit LW3=P2^1; //對應第2個數碼管
- sbit LW4=P2^0; //對應第1個數碼管
- sbit LW5=P1^4;//指示當前顯示的是第幾個轉換值
- sbit CLK=P2^4; //時鐘信號
- sbit START=P2^5; //轉換啟動開關
- sbit EOC=P2^6; //轉換結束標志
- sbit OE=P2^7;//定義ADC0809各腳
- /**********************************************************/
- //函數名:delay(uint x)
- //功能:延時程序 改變測量地址
- //調用函數:
- //輸入參數:x
- //輸出參數:
- //說明:程序的延時時間為x乘以0.5ms 每5s改變測量地址位
- /**********************************************************/
- void delay(uint x)
- {
- uchar y,z;
- for(y=x;y>0;y--)
- for(z=250;z>0;z--);//該步運行時間約為0.5ms
- vtime++;
- if(vtime==1000)
- {
- vtime=0;
- addr++;
- if(addr==3) //本例子一共有3個測量輸入值,輪流讀取這3個值并轉換顯示
- addr=0;//以上語句實現測量地址位的改變
- }
- }
- /**********************************************************/
- //函數名:ADC()
- //功能:數模轉換程序
- //調用函數:
- //輸入參數:
- //輸出參數:
- //說明:將轉換好的測定值保存在變量volt中
- /**********************************************************/
- void ADC()
- {
- EA=1;//開中斷
- //確保進入正常AD轉換狀態?
- START=0;
- START=1;
- START=0;//ad開始轉換
- while(EOC==0); //等待轉換結束
- OE=1; //輸出數據標志為真
-
- EA=0;//關中斷
- volt=P3;//獲取轉換值保存到volt中,(P3為轉換后數據)
- volt=volt*196;//轉換值處理 (例子的滿量程為5V,轉換分辯率為8位即最大值是255,5/255=196mV,即1代表196mV)
-
- OE=0;//輸出轉換結束 (要在獲取轉換值之后)
- }
- /**********************************************************/
- //函數名:display()
- //功能:4位數碼管顯示
- //調用函數:delay(uint x)
- //輸入參數:
- //輸出參數:
- //說明:將處理后的電壓值顯示在4位數碼管上
- /**********************************************************/
- void display()
- {
- P0=0xff;//消隱 (相當于全部滅燈,清除上次顯示效果)
- LW1=0;
- P0=~led[volt/10000]&0x7f;//帶小數點1伏顯示位
- delay(2);
- P0=0xff;
- LW1=1;
- LW2=0;
- P0=~led[(volt/1000)%10];//100毫伏顯示位
- delay(2);
- P0=0xff;
- LW2=1;
- LW3=0;
- P0=~led[(volt/100)%10];//10毫伏顯示位
- delay(2);
- P0=0xff;
- LW3=1;
- LW4=0;
- P0=~led[(volt/10)%10];//1毫伏顯示位
- delay(2);
- P0=0xff;
- LW4=1;
- LW5=0;
- P0=~led[addr+1];//顯示電壓測量位
- delay(2);
- LW5=1;//指示當前顯示的是第幾個轉換值
- }
- /**********************************************************/
- //主程序
- /**********************************************************/
- void main()
- {
- EA=1;//開總中斷
- TMOD=0x01;//設定定時計數工作方式
- //為定時器初賦值
- TH0=0XFF;
- TL0=0XB4;
- ET0=1;//開定時器0中斷
- TR0=1;//開啟定時器0
- while(1)
- {
- P1=addr;//裝入測量地址
- LW5=1;
- ADC();//調用模數轉換程序
- display();//調用顯示程序
- }
- }
- /**********************************************************/
- //函數名:timer() interrupt 1
- //功能:定時中斷0響應程序
- //調用函數:
- //輸入參數:
- //輸出參數:
- //說明:為ADC提供時鐘信號
- /**********************************************************/
- void timer() interrupt 1
- {
- //初值重置
- TH0=0XFF;
- TL0=0XF0;
- CLK=~CLK;//取反 產生時鐘信號
- }
復制代碼
仿真代碼51hei提供下載:
數字電壓表(ADC0809)-2.rar
(47.83 KB, 下載次數: 70)
2020-12-22 08:16 上傳
點擊文件名下載附件
數字電壓表
|