信息工程学院课程设计(论文)
执行键盘扫描子程序,并识别键号。
3.6 系统软件的设计
该系统软件主要完成以AT89C51为核心的数据的采集、处理和有线传输。采用模块化程序设计方法,将系统软件的设计主要分为显示模块,输入模块,输出模块。单片机扫描发射键,如果扫描到有发射键按下,系统便扫描拨码开关的状态以确定地址码,通过P0口和P2口开始地址码传送当服务台接收到呼叫信号后,护士值班室内的呼叫系统板上显示该患者的床位号,并振铃。当护士按下“响应”键时,结束当前呼叫。
3.6.1 主程序流程图
单片机扫描发射键,如果扫描到有发射键按下,系统便扫描拨码开关的状态以确定地址码,再进行中断初始化,去除键的延时抖动,分辨行、列值,进入死循环,这时病房指示灯点亮,服务台显示出床号并响铃,病房等待服务台的回应,如果没有扫描到信号输入,则单片机始终处于初始状态。如图3-5所示。
开始初始化系统N有键按下?Y病房指示灯亮,服务台显示床号,并响铃服务台回应N停止?Y结束
图3-5 主程序流程图
- 11 -
信息工程学院课程设计(论文)
3.6.2 子程序流程图
子程序如图3-6是一个中段式键盘的流程图,当单片机收到信号后,中断入口开始初始化,去除键的延时抖动。而一般的削抖方式有软件和硬件两种,硬件削抖虽能够解决键抖动问题,但如果应用系统所需按键较多,硬件削抖电路将变得复杂,成本也比较高,因此本系统采用的是软件削抖,当检测出有键闭合时,先执行一个延时子程序产数毫秒的延时(5S),待接通时的前沿抖动消失后再判别是否有键按下,分辨出行、列值。当按键释放时,也要经过数毫秒延时,待后沿抖动消失后再判别是否有键按下。
中断入口中断初始化有键按下延时去键抖动分辨行、列中断返回 图3-6 子程序流程图
中断程序:
void key(void) 扫描键盘值 {
uchar hang,lie; P0=0x00;P2=0xff; delay(1); if(P2!=0xff) {
delay(5); 延迟(5)后查询行列值 if(P2!=0xff)
- 12 -
信息工程学院课程设计(论文)
{ switch(P2&0xff) 扫描列值 {
case 0xfe:lie=0;break; case 0xfd:lie=1;break; case 0xfb:lie=2;break; case 0xf7:lie=3;break; case 0xef:lie=4;break; case 0xdf:lie=5;break; case 0xbf:lie=6;break; case 0x7f:lie=7;break;
}
P2=0x00;P0=0xff;
switch(P0&0xff) 扫描行值 {
case 0xfe:hang=0;break; case 0xfd:hang=1;break; case 0xfb:hang=2;break; case 0xf7:hang=3;break; case 0xef:hang=4;break; case 0xdf:hang=5;break; case 0xbf:hang=6;break; case 0x7f:hang=7;break;
}
P2=0xff;P0=0x00; while(P2!=0xff);
bed_NO=keytab[hang][lie];TR0=1;
}
else
bed_NO=0;
}
}
void time_init(void) 计数器的初始化 {
- 13 -
行列值赋值给bed_NO 信息工程学院课程设计(论文)
}
TMOD=0x01;
TH0=(65536-8333)/256; 装入初值 TL0=(65536-8333)%6; EA=1; ET0=1;
void time(void) interrupt 1 using 1 定义中断块
3.6.3 源程序代码
源程序代码如下: #include
#define uchar unsigned char #define uint unsigned int sbit B1=P3^6; sbit B2=P3^7; sbit buzzer=P3^5;
sbit clear=P3^4; 定义字符B1,B2,BUZZER,CLEAR
uchar code distab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code keytab[8][8]={{1,2,3,4,5,6,7,8}, 定义键盘值
{9,10,11,12,13,14,15,16}, {17,18,19,20,21,22,23,24}, {25,26,27,28,29,30,31,32}, {33,34,35,36,37,38,39,40}, {41,42,43,44,45,46,47,48}, {49,50,51,52,53,54,55,56}, {57,58,59,60,61,62,63,64}, };
uchar bed_NO; uchar btime;
uchar itime; 定义字符bed_NO,uchar btime,uchar itime void delay(uint x) 定义延迟程序块 { uint i,j;
for(i=0;i - 14 -
相关推荐: