www.sfmcu.com www.sf-edu.cn 盛方单片机整理 作者:未知
图3.1单片机模块方框图
3.1主控程序
1.DAC0832程序控制介绍
ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降
沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC
变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当
OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。
6
www.sfmcu.com www.sf-edu.cn 盛方单片机整理 作者:未知 ad0809是根据逐位逼近的方法产生数据的。。
参考电压为0-5V的话。以0809八位255的转换精度每一位的电压值为(5-0)/255≈0.0196V 设输入电压为X则:
X-27*0.0196>=0则AD7=1否则AD7=0。 X-26*0.0196>=0则AD6=1否则AD6=0。
2.主控程序首先进行系统初始化,然后读入预置电压值,输出相应的电压控制字,等待键盘输入。根据键盘的不同输入,用散转方式转入相应的应用程序,执行后,若用户又输入“清除显示”,则输出电压控制字0,返回初始状态,等待下一次按键。键盘扫描函数:
进中断 2.2矩阵键盘扫描
把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,经过比对之后就可知道是哪个键被按下。
比如说扫描码送入01111111,前面的0111是代表此时扫描第一行P1.0列,而后面的1111是让读取的4行接脚先设為VDD,若此时第一行的第三列按键被按下,那读取的结果就会变成01111101(注意1111变成1101),其中LSB的第三个bit会由1
7
www.sfmcu.com www.sf-edu.cn 盛方单片机整理 作者:未知 变成0,这是因為这个按键被按下之后,会被垂直的扫描码电位short,而把读取的LSB的bit电位拉到0,此即為扫描原理。
由於这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,為了避免让8051误判為多次输入同一按键, 我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,就可以让键盘的输入稳定 2.3数码管动态扫描
动态显示驱动
② 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划\的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,
8
www.sfmcu.com www.sf-edu.cn 盛方单片机整理 作者:未知 不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
2.4 总程序一览
#include
#define uchar unsigned char #define uint unsigned int sbit key1=P1^0; sbit key2=P1^1;
void delay(uint z);
uchar keyscan()//盘扫描 {
uchar temp,num; num=17; P1=0xfe; temp=P1;
temp=temp&0xf0; while(temp!=0xf0) { delay(20); temp=P1;
temp=temp&0xf0; if(temp!=0xf0) { // delay(10); P1=P1&0xf0;
while(P1!=0xf0); switch(temp) {
case 0xe0:num=7;break; case 0xd0:num=8;break; case 0xb0:num=9;break; case 0x70:num=15;break; default:break; } }
else break; }
P1=0xfd;
9
www.sfmcu.com www.sf-edu.cn 盛方单片机整理 作者:未知 temp=P1;
temp=temp&0xf0; while(temp!=0xf0) { delay(20); temp=P1;
temp=temp&0xf0; if(temp!=0xf0) { //delay(10); P1=P1&0xf0; while(P1!=0xf0); switch(temp) {
case 0xe0:num=4;break; case 0xd0:num=5;break; case 0xb0:num=6;break; case 0x70:num=14;break; default:break; } }
else break; }
P1=0xfb; temp=P1;
temp=temp&0xf0; while(temp!=0xf0) {
delay(20); temp=P1;
temp=temp&0xf0; if(temp!=0xf0) {
//delay(10); P1=P1&0xf0;
while(P1!=0xf0); switch(temp) {
case 0xe0:num=1;break; case 0xd0:num=2;break; case 0xb0:num=3;break; case 0x70:num=13;break; default:break;
10