西安航空职业技术学院
毕业设计论文
4 软件设计
量程自动切换数字电压表的软件设计采用单片机常用的汇编语言,主要包括三个部分,即主程序部分、档位切换部分和LED数码显示器的显示部分。其软件设计流程图如图4-1、4-2、4-3所示。
图4-1 主程序
图4-2 显示子程序图
9
西安航空职业技术学院
毕业设计论文
图4-3 量程自动化切换程
4.1主程序
主程序设计的软件流程图如图4-1(a)所示,在A/D模块启动子程序中,主要根据A/D转换模块的时序图设置单片机的各引脚电平来启动ADC0809。判断部分主要是通过A/D转换模块采集到的电压值与档位值进行比较来选择数字电压表的档位,再通过档位处理子程序对A/D转换模块转换后的电压值进行处理,然后在数码显示器上显示出来。
4.2 LED送显子程序
LED数码管采用软件译码动态扫描方式。在显示子程序中包含多路循环显示和单路显示程序。多路循环显示把8个存储单元的数值依次取出送到4位数码管上显示,每一路显示1秒。单路显示程序只对当前选中的一路数据进行显示。每路数据显示需经过转换变成十进制BCD码,放于4个数码管的显示缓冲区中。单路显示或多路循环显示通过标志位00H控制。在显示控制程序中加入了对单路或多路循环按键和通道选择按键的判断。
10
西安航空职业技术学院
毕业设计论文
图4-4 LED送显子程序
C语言源程序清单
#include
#include
uchar number=0x00; //存放单通道显示时的当前通道数 sbit ALE=P2^3;
//0809地址锁存信号
sbit START=P2^4; //启动信号 sbit OE=P2^5; //输出允许通道
sbit KEY1=P3^5; //循环或单路选择按键 sbit KEY2=P3^6; //通道选择按键
11
西安航空职业技术学院
毕业设计论文
sbit EOC=P3^7; //转换结束信号
sbit DISX=disdata^7;//小数点位
sbit FLAG=PSW^0; //循环或单路显示标志位 Uchar code
dis_7[11]={0x3F,0x06,0x5B,0X4F,0x66,0x6D,0x7D,0x07,0x7E,0x6F,0x00};
//数码管的字段码
uchar code scan_con[4]={0xF1,0xF2,0xF4,0xF8};//4个LED数码管的位选
Uchar data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//0809的8个通道转换数据缓冲区
uchar data dis[5]={0x00,0x00,0x00,0x00,0x00};//显示缓冲区 /*主函数*/
main() {
P0=0xff; //初始化端口 P2=0x00; P1=0xff; P3=0xff; while(1)
{test(); //测量转换数据
scan();//显示数据 } }
delay1ms(uint t) {uint i,j; for (i=0;i /*检测按键子程序*/ keytest() { if (KEY1==0) //检测循环或单路选择按键是否按下 {FLAG=!FLAG; //标志位取反,循环,单路显示却换 while(KEY1==0); } 12 /*1秒延时*/ 西安航空职业技术学院 毕业设计论文 if(FLAG==1) //单路循环时,检测通道选择按键是否按下 {if(KEY2==0) {number++; if(number==8) {number=0; } while(KEY2==0); } } } /*显示扫描子程序*/ scan() { uchar k,n; int h; if(FLAG==0) //循环显示子程序 { dis[3]=0x00; //通道值清零 for(n=0;n<8;n++) //循环8次 { dis[2]=ad_data[n]/51; //转换为BCD码 dis[4]=ad_data[n]Q; dis[4]=dis[4]*10; dis[1]=dis[4]/51; dis[4]=dis[4]Q; dis[4]=dis[4]*10; dis[0]=dis[4]/51; for(h=0;h<500;h++) //每个通道显示时间控制为1s { for(k=0;k<4;k++) //4位LED循环显示 { disdata=dis_7[dis[k]]; if(k==2) {DISX=0;} P3=scan_con[k]; delay1ms(1); P3=0xff; 13