/////////////////////////////////////
//
// at89s52 adc0809 數碼管顯示
// 作者:倪建華 QQ:10772919
// 江蘇省南通技師學院
// 2014.5.28
//
////////////////////////////////////
sfr P0=0x80; //數碼管段碼,adc0809數據端
sfr P2=0xa0; //控制腳
//數碼管控制腳定義,wr,cs由0變1有效
sbit cs1=P2^0;//段碼
sbit cs2=P2^1;//位碼
sbit wr=P2^2;//時鐘
//adc0809控制腳定義
sbit adc_eoc=P2^3;//轉換完成=1,未完成=0
sbit adc_cs=P2^4;//可以直接接地=0
sbit adc_rd=P2^5;//oe=~(rd|cs)
sbit adc_wr=P2^6;//start=ale=~(wr|cs)
//變量定義
unsigned long int v;//電壓值
unsigned char v2;//保存adc結果
//延時函數
void ys(unsigned x)
{
unsigned char i;
while(x--)for(i=0;i<120;i++);
}
//adc轉換函數
adc()
{
//准備
adc_eoc=1;//轉換結束標志置位
adc_rd=1;//禁止總線,防止影響數碼管
adc_wr=1;//禁止寫
adc_cs=0;//cs同時控制wr,rd,可以直接接地
//啟動轉換
adc_wr=0;//設置通道號,ale高電平鎖存通道地址,start上升沿復位
adc_wr=1;//start下降沿開始轉換
while(adc_eoc==0);//轉換結束為高電平
adc_rd=0;//oe高電平允許輸出
//讀取結果
P0=0xff;//P0作為輸入端
v2=P0;//讀取轉換結果
adc_rd=1;//禁止總線,防止影響數碼管
}
//8位共陽數碼管顯示函數
xianshi()
{
unsigned char code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//段碼
unsigned char i;
v=(unsigned long int)v2*5000/255;//一定要時行強制類型轉換
//從右掃描到左,從最低位開始掃描
for(i=0;i<8;i++)
{
//位消陷
P0=0xff;//關閉
cs2=0;//位有效
wr=0;wr=1;//時鐘
cs2=1;//位無效
//送段碼
P0=DSY_CODE[v%10];//送段碼
cs1=0;//段有效
wr=0;wr=1;//時鐘
cs1=1;//段無效
//送位碼
P0=~(1<
cs2=0;//位有效
wr=0;wr=1;//時鐘
cs2=1;//位無效
v/=10;//將v縮小10倍,時間較長
ys(1);
}
}
//主函數
main()
{
while(1)
{
adc();//adc轉換
xianshi();//數碼管顯示
}
}
下面是仿真原理圖