//------------------------------51單片機頭文件
#include
//各數字的數碼管段碼(共陰)
unsigned char code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數碼管顯示數組{0,1,2,3,4,5,6,7,8,9}
sbit CLK=P3^3;? ? //時鐘信號
sbit ST=P3^6;? ???//啟動信號,由低電平到高電平時間段復位 ,高電平到低電平時間段開始轉換
sbit EOC=P3^5;? ? //轉換結束信號,當轉換結束時會自動變成高電平
sbit OE=P3^4;? ???//輸出使能 ,當OE為高電平時開啟輸出端,OE為低電平時禁止輸出
sbit W1=P2^4;? ???//定義W1表示P2.4位,第一位數碼管控制端, 為0時亮,為1時滅
sbit W2=P2^3;? ? ? ?? ?//定義W2表示P2.3位,第二位數碼管控制端, 為0時亮,為1時滅
sbit W3=P2^2;? ? ? ?? ?//定義W3表示P2.2位,第三位數碼管控制端, 為0時亮,為1時滅
sbit key=P3^7;? ? ? ?? ?//定義按鍵控制key為P3.7
//----------------------------1ms延時函數
void Delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
for(i=0;i<120;i++);
}
//---------------------------顯示轉換結果(動態掃描模式)
void Display(unsigned int d)
{
d=d*1.0/256*5*40;??//將數字量轉換成模擬量的公式為5V*(d/256),采樣電壓值為電流值*100歐姆,所以要獲得實際電流值,即為采樣電壓值*40倍 (n1:n2=4000:1)
W1=0;? ?//第一個數碼管亮
P0=DSY_CODE[d%10];??//顯示第一個數碼管的值 為P1的值除以10取余
Delayms(6);? ? ? ? ? ? ? ? ? ? ? ? //延時5ms
W1=1;? ?//第一個數碼管滅
W2=0;
P0=DSY_CODE[d%100/10];? ? ? ? //顯示第二個數碼管的值 為P1的值除以100取余 再除以10取整
Delayms(6);
W2=1;
W3=0;
P0=DSY_CODE[d/100];? ? ? ?? ? //顯示第三個數碼管的值 為P1的值除以100取整
Delayms(6);
W3=1;
}
//-------------------------------------------------主程序
void main()
{
TMOD=0x02; //16位定時器0工作模式設置為2
TH0=0x14;??//設置定時器高8位初值為0x14
TL0=0x00;??//設置定時器低8位初值為0x00
TR0=1;? ? ? ?? ? //開啟定時器0開關
ET0=1;? ? ? ?? ? //開啟定時器0中斷開關
EA=1;? ? ? ?? ? //開啟中斷總開關
//---------------啟動 A/D 轉換
//---------開始按鍵-----
A:? ? ? ? while(key==1);? ???//等待按鍵按下
Delayms(1);? ? ? ?? ?? ???//延時1ms
if(key==0)? ?? ?? ?//延時1ms后按鍵還是按下了,說明按鍵確實按下了(按鍵消抖功能)
while(key==0);? ? ? ?? ? //當按鍵松開時,循環轉換和顯示
while(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0);? ?//等待轉換完成
OE=1; ? ? ? ? ? ? ? ? ? ? ? ???//開啟輸出端
Display(P1);? ???//將輸出到單片機P1端口上的數字信號在LED顯示出來
OE=0;? ?? ?? ?? ?//關閉輸出端
//------停止按鍵---------
if(key==0)
{
Delayms(1);
if(key==0)? ?? ?? ?//延時1ms后按鍵還是按下了,說明按鍵確實按下了(按鍵消抖功能)
while(key==0);? ? ? ?? ? //當按鍵松開時
…………限于本文篇幅 余下代碼請從51黑下載附件…………