仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (69.5 KB, 下載次數: 96)
下載附件
2021-7-8 17:56 上傳
單片機源程序如下:
- //*********************************************************************************
- //程序:AD0809LED.c
- //功能:AT89C51+ADC0809電壓測量顯示程序(Keil uVision5+Proteus 7.8仿真通過)
- //*********************************************************************************
- #include<reg51.h> /*包含頭文件reg51.h */
- #define uchar unsigned char /*宏定義后方便書寫*/
- #define uint unsigned int /*宏定義后方便書寫*/
- uchar code DigitSTARTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //LED碼表
- uchar DisplayBuffer[4]; //顯示碼數據緩沖區
- uchar AD_Data; //AD0809原始數據
- uint Temp; //處理后的數據
- sbit START=P3^0; //定義P3.0引腳位名稱為START
- sbit OE=P3^1; //定義P3.1引腳位名稱為OE
- sbit EOC=P3^2; //定義P3.2引腳位名稱為EOC
- sbit CLK=P3^3; //定義P3.3引腳位名稱為CLK
- sbit ADDA=P3^4; //定義P3.4引腳位名稱為ADDA
- sbit ADDB=P3^5; //定義P3.5引腳位名稱為ADDB
- sbit ADDC=P3^6; //定義P3.6引腳位名稱為ADDC
- sbit LED0=P2^0; //定義P2.0引腳位名稱為LED0,選擇LED的0位
- sbit LED1=P2^1; //定義P2.1引腳位名稱為LED1,選擇LED的1位
- sbit LED2=P2^2; //定義P2.2引腳位名稱為LED2,選擇LED的2位
- sbit LED3=P2^3; //定義P2.3引腳位名稱為LED3,選擇LED的3位
- sbit LED_DP=P1^7; //定義P1.7引腳位名稱為LED_DP,選擇LED的DP位
- //*********************************************************************************
- //函數名:Delay
- //函數功能:軟件延時函數
- //形式參數:uint i
- //*********************************************************************************
- void Delay(uint i)
- { uint j;
- for(;i>0;i--)
- { for(j=0;j<50;j++)
- ;
- }
- }
- //*********************************************************************************
- //函數名:TimeInitial
- //函數功能:定時器初始化函數 T0方式2,自動重裝初值:10,定時:10us,
- //信號周期T:20us 信號頻率f:f=1/T=1000000/20=50 000HZ=50KHZ
- //*********************************************************************************
- void TimeInitial() //定時器初始化
- { TMOD=0x02; //定時器工作模式
- TH0=246; //定時器初值高8位
- TL0=246; //定時器初值低8位
- EA=1; //開總中斷
- ET0=1; //開定時器中斷
- TR0=1; //啟動定時器
- }
- //*********************************************************************************
- //函數名:Time0
- //函數功能:定時器0中斷服務子程序函數
- //*********************************************************************************
- void Time0(void) interrupt 1 using 0 //定時器中斷服務子程序
- {
- CLK=~CLK; //產生AD0809工作脈沖:50KHZ
- }
-
- //*********************************************************************************
- //函數名:Display
- //函數功能:LED數碼管顯示函數
- //*********************************************************************************
- void Display()
- {
- P1=DigitSTARTable[DisplayBuffer[3]]; //取數據送P1端口顯示(十位)
- LED0=0; // LED0管子開
- Delay(5); // 延時顯示
- LED0=1; // LED0管子關
- P1=DigitSTARTable[DisplayBuffer[2]];//取數據送P1端口顯示(個位)
- LED_DP=1; // 小數點顯示
- LED1=0; // LED1管子開
- Delay(5); // 延時顯示
- LED1=1; // LED1管子關
- P1=DigitSTARTable[DisplayBuffer[1]];//取數據送P1端口顯示 (小數1位)
- LED2=0; // LED2管子開
- Delay(5); // 延時顯示
- LED2=1; // LED2管子關
- P1=DigitSTARTable[DisplayBuffer[0]];//取數據送P1端口顯示(小數2位)
- LED3=0; // LED3管子開
- Delay(5); // 延時顯示
- LED3=1; // LED3管子關
- }
- //*********************************************************************************
- //函數名:main
- //函數功能:主函數
- //*********************************************************************************
- void main()
- {
- TimeInitial(); //啟動定時器初化
- while(1)
- {
- ADDA=0; //ADC0809通道選擇
- ADDB=0;
- ADDC=0;
- OE=0; //輸出關閉
- START=0;
- START=1; //START由低到高跳變(上跳沿),寄存器清零
- START=0; //START由高到低跳變(下跳沿),啟動AD轉換
- while(EOC==0) ; //等待轉換結束
- OE=1; //輸出允許
- AD_Data=P0; //讀ADC0809原始數據
- OE=0; //輸出關閉
- Temp=(AD_Data*1.0/255*5)*100; //數據處理:輸出值=輸入值*5/255 參數5是基準電壓5V
- DisplayBuffer[0]=Temp%10; //取處理后的數據個位,對應顯示溫度值的小數2位
- DisplayBuffer[1]=Temp/10%10; //取處理后的數據十位,對應顯示溫度值的小數1位
- DisplayBuffer[2]=Temp/100%10; //取處理后的數據百位,對應顯示溫度值的個位
- DisplayBuffer[3]=Temp/1000; //取處理后的數據千位,對應顯示溫度值的十位
- Display(); //調用顯示函數
- }
- }
復制代碼
所有資料51hei提供下載:
ad0809.rar
(135.06 KB, 下載次數: 129)
2021-7-8 15:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
這個是用LCD顯示的版本:
AD0809 LCD.rar
(126.38 KB, 下載次數: 91)
2021-7-8 15:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|