单片机开发基础与经典设计实例
11.2 设计要求
更新于2009-02-27 09:46:42

11.2.1  方案论证与比较
        单片机控制模块包括键盘、LED显示、C52芯片等,它以C52芯片为核心,将其中两个口用于键盘和LED显示。下面介绍两种方案:
1 方案一
        以C52芯片为核心,直接用单片机的I/O口作为键盘扫描和显示驱动口。该方案占用了单片机的两个口线,其中一个口线作为4×4的键盘扫面,另一个口线作为4个数码管的动态显示。利用单片机的P1口作为键盘扫描,其中低4位横向扫描,高4位纵向扫描。当检测到有按键按下时,通过查询P1口上各个引脚的电平高低得出按键对应的数据。利用单片机的P0图11-2键盘扫描部分的按键口作为动态显示输出口,其中低4位是显示数据输出,通过74LS247译码连接到LED,并提高驱动;高4位是动态显示选择位,通过74LS245双向数据收发器接到LED的COM端。依次给4个COM脉冲点亮数码管实现动态显示。该方案占用了较多的单片机资源,但是在外围硬件电路简单,成功率高,其硬件连接电路如图11-2所示。

                                                                                                                      图11-2
在设计中,键盘的驱动程序如下所示:
void scankey()
{
uchar i=4;
P1=0xef;
while(--i)
{
if((P1&0x0f)!=0x0f)
{
delay(1000);if((P1&0x0f)!=0x0f)
switch(P1)
 {
case 0xee:key1();while(P1==0xee);break;
/*这里的while起到等待键被释放的作用!*/
case 0xed:key2();while(P1==0xed);break;
case 0xeb:key3();while(P1==0xeb);break;
case 0xe7:key4();while(P1==0xe7);break;
case 0xde:key5();while(P1==0xde);break;
case 0xdd:key6();while(P1==0xdd);break;
case 0xdb:key7();while(P1==0xdb);break;
case 0xd7:key8();while(P1==0xd7);break;
case 0xbe:key9();while(P1==0xbe);break;
case 0xbd:key0();while(P1==0xbd);break;
case 0xbb:key11();while(P1==0xbb);break;
case 0xb7:key12();while(P1==0xb7);break;
case 0x7e:key13();while(P1==0x7e);break;
case 0x7d:key14();while(P1==0x7d);break;
case 0x7b:key15();while(P1==0x7b);break;
case 0x77:key16();while(P1==0x77);break;
}/*end of switch*/
}/*end of if()*/
P1=(P1<<1)|0x0f;
}/*end of while(i--)*/
}/*end of scankey()*/
其中,key1()~key16()为键盘的相应程序。设计的数码管动态显示程序如下所示:
showspeed()//数码管的动态显示,调用一次本函数进行动态循环显示一位
{
unsigned char speed;//要显示的数值
static unsigned char j;
speed=liquidspeed;
 if(j==0)
{
P0=speed/100;p04=1;p05=0;p06=0;
}
else if  (j==1)
{
P0=(speed-speed/100*100)/10;
p04=0;
p05=1;
p06=0;
}
else
{
P0=speed-speed/10*10;
p04=0;
p05=0;
p06=1;
}
j++;
if(j>2)j=0;
}
 

2 方案二
        采用C52芯片为核心,BC7281作为驱动数码管和扫描键盘的芯片。利用C52芯片的P3口的3个口线作为BC7281的接口,再利用BC7281进行显示和键盘扫描分配。BC7281可以提供的显示位为16位,连接的键盘个数为64个。对键盘的扫描采用中断方式。单片机的外部中断口连接7281的key口,当有按键按下时,在key口线上产生中断脉冲,触发单片机中断,单片机判断所按下的按键,并执行相应的按键操作。该最小系统通过移位寄存器实现数码管的动态显示,单片机把要显示的数值写进7281的寄存器即可。这种方案所需的单片机的口线较少,能够在一定程度上节省单片机资源,但它所需要的外部接口电路较为复杂,其设计电路如图11-3所示。


图11-3  7281控制动态显示电路

        图11-3中,键盘扫描和数据的显示都是通过7281芯片去控制的,单片机只要检测key口的中断信号即可,无需用扫描程序去扫描键盘。而且,数据的显示只要C52芯片向7281芯片的寄存器的数据即可完成,无需单片机通过程序语句去实现动态显示。因而使得C52能从繁琐的键盘扫描和数码管的动态显示的工作中解放出来,处理别的事情,大大节省了内部资源,减轻了主单片机的负担,使得系统运作起来更加稳定可靠。鉴于本系统中单片机要执行的控制任务比较多,工作负担繁重,考虑到尽量节省单片机资源,故采用此方案。
        8个数码管的前4个用来显示输入的数值,即显示对应的键盘按键的值;后面4个数码管用来显示重物在运动过程中的当前位置。键盘采用4×4的16个按键矩阵,各个按键为0~9、确认、清除、寻点、曲线、画圆和寻迹。(具体的程序代码请看程序清单)
本系统通过红外传感器与单片机的外部中断口相连,通过中断的方式与外界取得联系,获取外部环境的信息,另用几个发光二极管显示当前单片机的工作状态。当运行过程中出现不允许的紧急情况时,采用蜂鸣器发声报警,以及早采取措施。
        另外,为了提高系统运行的可靠程度,防止单片机跑飞,设计中增加了看门狗电路,采用MAX813芯片。其中,用单片机的一个口线“喂狗”,其“喂狗”子程序如下所示:
feeding()//“喂狗”函数,在P17上产生一个正脉冲
{
feed=0;
feed=1;
delay(1000);
feed=0;
}
其中,delay()为延时程序,1000为延时参数。
 

  <<         >>

 

网友留言