基于MCU89C51、ADC0809、6位数码管的多功能数字电压表程序

更新时间:2023-10-27 16:55:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于MCU89C51、ADC0809、6位数码管的多功能数字电压表程序

# include # include

# define uchar unsigned char # define uint unsigned int # define IN0 XBYTE[0x8ff8]

uchar keyscan(); //键盘扫描函数 void delay(uint z); //延时函数

unsigned char TestKey(); //按键检测函数 void key(); //按键函数 void display(int t);

uchar i,h=3,zf,wxm,num,temp; uint l,m,n;

/************数码管真值表***********/

uchar code table[28]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,//0,1,2,3,4,5 ,6 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,//7,8,9,A,b ,C ,d 0x79,0x71,0x80,0x00,0xbf,0x86,0xdb,//E,F,点,灭,0.,1., 2. 0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//3.,4.,5.,6.,7.,8., 9. sbit ad_busy=P3^3; uchar idata ad[10];

/***********AD采样函数************/ void adc0809(uchar idata *x) {

uchar xdata *ad_adr; ad_adr=&IN0;

*ad_adr=0;//启动转换

while(ad_busy==1);//等待EOC信号变为低电平

while(ad_busy==0);//等待EOC信号变为高电平,即转换结束 x[0]=*ad_adr;//读取转换结果并保存 }

/**********延时100us函数*************/ void delayms() {

int x,y;

for(x=0;x<9;x++) {

for(y=0;y<10;y++); } }

/***********主函数************/ void main()

{ P0=0; while(1) {

key();//先进行键盘扫描

adc0809(ad);//再进行AD采样 display(ad[0]);//再进行数据显示 } }

/**********数码管显示函数*************/ void display(uint t) {

float a=t*500.0/256.0;//将AD采样值转化成电压值,注意浮点型数据运算格式 int b=(int)a;//强制类型转换 int c,d,e,f,g,k=0; c=b/10/10; //取百位 d=b/10; //取十位 e=b; //取个位

l=DBYTE[0x30]; //将按键输入的值赋给l、m、n,以便下一步与限定值比较 m=DBYTE[0x31]; n=DBYTE[0x32]; DBYTE[0X33]=e; DBYTE[0X34]=d; DBYTE[0X35]=c;

if(c>=n&d>=m)//与限定值进行比较,超过限定值报警 { P0=1; }

else P0=0; wxm=0x01;

for(f=0;f<6;f++) {

XBYTE[0x9002]=0;//清屏,从而消除颤抖 g=DBYTE[0X30+f];

if(wxm==0x04)//在第3位、第6位需要添加小数点,故判断位选码的值 {

XBYTE[0x9004]=table[g+18]; }

else if(wxm==0x20) {

XBYTE[0x9004]=table[g+18]; }

else XBYTE[0x9004]=table; XBYTE[0x9002]=wxm;

for(i=0;i<1;i++) {

delayms(); }

wxm=wxm<<1;

if(wxm==0x40)//位选码左移超出数码管个数,故重新从右向左扫描 {

wxm=0x01; } } }

/***********按键检测存储函数************/ void key() {

if (TestKey()) //测试是否有键按下 {

DBYTE[0x30+h-1]=keyscan();//将按键按下的值赋给30至32单元赋初值 h--; if(h==0) { h=3; }

} //执行键盘扫描,获取键值,并存入显存 delay(1); }

/***********按键检测函数************/ unsigned char TestKey() {

XBYTE[0x9002] = 0; // 输出线置为0

return (~XBYTE[0x9001] & 0x0f); // 读入键状态(高四位不用) }

/***********键盘扫描函数************/ uchar keyscan() {

XBYTE[0x9002]=0xfb; //第4列输出0

temp=XBYTE[0x9001]; //读行线返回的值赋给变量 switch(temp) //查询哪一行有键按下 {

case 0x07:num=10;break; case 0x0b:num=11;break; case 0x0d:num=12;break; case 0x0e:num=13;break; }

XBYTE[0x9002]=0xf7;//第3列输出0

temp=XBYTE[0x9001]; //读行线返回的值赋给变量 switch(temp) //查询哪一行有键按下 {

case 0x07:num=9;break; case 0x0b:num=6;break; case 0x0d:num=3;break; case 0x0e:num=14;break; }

XBYTE[0x9002]=0xef; //第2列输出0

temp=XBYTE[0x9001]; //读行线返回的值赋给变量 switch(temp) //查询哪一行有键按下 {

case 0x07:num=8;break; case 0x0b:num=5;break; case 0x0d:num=2;break; case 0x0e:num=15;break; }

XBYTE[0x9002]=0xdf; //第1列输出0

temp=XBYTE[0x9001]; //读行线返回的值赋给变量 switch(temp) //查询哪一行有键按下 {

case 0x07:num=7;break; case 0x0b:num=4;break; case 0x0d:num=1;break; case 0x0e:num=0;break; }

XBYTE[0x9002] = 0;

do delay(1); while (TestKey()); // 等键释放 return num; //返回被按下的值 }

/************设定值延时函数(*110)***********/ void delay(uint z) {

uint x,y;

for(x=z;x>0;x--) for(y=110;y>0;y--); }

本文来源:https://www.bwwdw.com/article/hal2.html

Top