基于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--); }
正在阅读:
基于MCU89C51、ADC0809、6位数码管的多功能数字电压表程序10-27
最新人教版小学数学三年级上册优质导学案06-18
最新Java程序设计期末试卷(附答案)06-04
三峡大学电力系统分析12-06
动物学期末名词解释12-23
物理选修3-2 楞次定律 课时跟踪同步训练题(含答案)07-19
从5方面介绍画册设计03-07
婚姻家庭继承法练习试题07-03
公司战略决策委员会议事规则10-28
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 电压表
- 位数
- 多功能
- MCU89C51
- 基于
- ADC0809
- 数字
- 程序
- 管的