?? adc0809模數(shù)轉換程序.c
字號:
//MCU:AT89S51
//晶振:12M
//采用查詢方式讀AD轉換后的值
#include "AT89X51.H"
#include "math.h"
#include "intrins.h"
unsigned char code numcode[]={ 0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0xC1,0XB7,0xFF
};//數(shù)字0~9及"U="”“共陽數(shù)碼管代碼
unsigned char code dot_numcode[]={0X40,0X79,0X24,0X30,0X19,
0X12,0X02,0X78,0X00,0X10
};//帶數(shù)點的0~9共陽數(shù)碼管代碼
unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}; //數(shù)碼管位選代碼
unsigned char dispbuff[8]={0,0,0,11,10,12,12,12};
unsigned char disp_count;
unsigned char flag=1;
unsigned char flag_count;
unsigned long int getdata;
sbit START=P3^0;
sbit EOC=P3^2;
sbit OE=P3^1;
sbit AD_ALE=P3^3;
void main(void)
{
TMOD=0x01; //選擇定時器T0,方式為1(16位定時器)
TH0=(65536-3000)/256; //定時3MS初值
TL0=(65536-3000)%256;
TR0=1;
ET0=1;
EA=1;
AD_ALE=0;
START=0;
OE=0;
while(1)
{
if(flag==1) //每隔40ms啟動一次AD采樣
{
flag=0;
AD_ALE=1; //鎖存輸入通道
START=0; //驅動AD轉換
START=1;
AD_ALE=0;
START=0; //保持低電平
while(EOC==0); //等待AD轉換結束
TR0=0; //AD轉換結束時先停止T0
P0=0XFF; //關閉數(shù)碼管顯示,呵呵,其實人眼是感覺不到數(shù)碼管熄滅的
P1=0XFF; // 這個很重要
OE=1; //轉換結束,允許AD值輸出
getdata=P1; //讀出AD值,如果硬件連接上改成P2口來讀AD值,這句就改成"getdata=P2;"
OE=0; //禁止輸出
getdata=(unsigned long int)((unsigned long int)(getdata*500)/255);//轉換成電壓
dispbuff[2]=getdata/100;
dispbuff[1]=(getdata%100)/10;
dispbuff[0]=getdata%10;
TR0=1; //重新啟動T0
}
}
}
void t0(void) interrupt 1
{
TH0=(65536-3000)/256;
TL0=(65536-3000)%256;
if(disp_count==2)
P0=dot_numcode[dispbuff[disp_count]];
else
P0=numcode[dispbuff[disp_count]];
P1=bitcode[disp_count];
disp_count++;
flag_count++;
if(disp_count==8)
{
disp_count=0;
}
if(flag_count==100)
{
flag=1;
flag_count=0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -