开始 调用初始化子程序 液晶显示欢迎语 否 判断是否有床位报警 是 报警器打开,液晶显示对应床位号 判断应答按键是否按下 否 是
关闭报警器 液晶显示知晓
图4.1主程序流程图
结束 4.3 初始化程序设计
初始化程序包括液晶初始化显示、定时器中断系统初始化。 (一)、液晶初始化
根据液晶使用手册,在液晶使用之前,要对其设置显示模式,光标设置,然后进行清屏操作。方便之后使用。
(二)、定时器中断系统初始化
19
STC89C51有两个定时/计数器,都有定时和计数两种工作模式,四种工作方式(方式0、方式1、方式2、方式3),属于增一计数器。特殊功能寄存器TMOD用于选择定时器/计数器T0、T1的工作模式和工作方式。但无论是工作在定时器模式还是计数器模式,实质都是对脉冲信号进行计数,只是计数的来源不同,计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚的外部脉冲进行计数,而定时器模式是对单片机的时钟振荡器信号经片内12分频后的内部脉冲信号计数。
3、 工作方式控制寄存器TMOD,不能位寻址,其格式如表4.1所示。
表4.1 寄存器TMOD的格式
(1) GATE :门控位。 (2) M0、M1:工作方式选择位。
(3) C/T:计数器和定时器模式选择位。C/T=0,为定时器模式;C/T=1为计数器模式。 M0、M1共有4种编码,对应于4种工作方式的选择,见表4.2。
表4.2 M1、M0工作方式选择
M1 M0 0 0 0 1 工作方式 方式0,为13位定时器/计数器 方式1,为16位定时器/计数器 1 0 方式2,8位的常数自动重装的定时器/计数器 1 1
方式3,仅用于T0,此时T0分为两个8位计数器,T1停止计数 定时器的工作方式设置好以后就要给定时器装入初值,工作方式不同初值也不同。 1、下面介绍一下单片机的时钟周期、机器周期和指令周期。
(1) 时钟周期是单片机时钟控制信号的基本时间单位。若时钟晶体的震荡频率为f0sc ,则时钟周期Tosc=1/fosc 。
(2) 机器周期是CPU完成一个基本操作所需要的时间。AT89C51单片机的每12个时钟周期为一个机器周期,即TCY=12/fOSC 。
(3) 指令周期是执行一条指令所需的时间。AT89C51单片机中指令按字节来分,可分为单字节、双字节和三字节指令,单字节和双字节指令一般为单机器周期和双机器周期,三字节指令都是双机器周期,只有乘、除指令占4个机器周期。
本设计中,时钟晶体的频率为11.0592MHZ,所以时钟周期为1/12M。T0作为定时器使用,工作方
16
式为方式1,作为16位计数器。设计数个数为N,计数初值为X,那么X=2-N, 定时时间=N×12/
20
晶振频率,所以,定时时间=(2-X)×12/晶振频率。
本设计设置每隔50ms中断一次,那么得出初值X=0x4BFF,定时器T0的高8 位TH0赋值0x4B,低8位TL0赋值0xFF。
2、定时器/计数器控制寄存器TCON,可位寻址,其格式见表4.3。
表4.3特殊寄存器TCON的格式
D7 D6 D5 D4 D3 D2 D1 D0 16
TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 位地址
8FH __ 8DH __ 8BH 8AH 89H 88H ① TR0:定时器启动位。TR0=0,关闭定时器0;TR0=1,开启定时器0.
② IT0:选择外部中断0为跳沿触发方式还是电平触发方式。IT0=0,为电平触发方式;IT0=1,为跳沿触发方式。 4、单片机对各中断源的开放或屏蔽是由片内的中断允许寄存器IE控制的,可位寻址,其格式见表4.4。
表4.4中断允许寄存器IE的格式
IE 位地址
D7 EA AFH D6 __ __ D5 __ __ D4 ES ACH D3 ET1 ANH D2 EX1 AAH D1 ET0 A9H D0 EX0 A8H (1) EA:中断允许总开关控制位。EA=0,所有的中断请求被屏蔽;EA=1,所有的中断请求被开放。 (2) ES:串行口中断允许位。ES=0,禁止串行口中断;ES=1,允许串行口中断。
(3) ET0:定时器/计数器T0的溢出中断允许位。ETO=0,禁止T0溢出中断;ETO=1,允许T0溢出中断。
(4) EX0:外部中断0中断允许位。EX=0,禁止外部中断0中断;ES=1,允许外部中断0中断。STC89C51复位后,IE被清零,所有的中断请求被禁止。所以在初始化时,要令EA=1,EX0=1,ET0=1,开放总中断、允许T0中断。初始化程序如下:
21
void init() { }
E=0;
com_1602(0x38); com_1602(0x0c); com_1602(0x06); com_1602(0x80); com_1602(0x01); bg_1602=0; TMOD=0x01; TL0=0x4b; TH0=0xff; EA=1; ET0=1; TR0=1;
4.4延时子程序设定
延时子程序作为方便其他程序调用,避免程序繁琐重复。我将延时子程序定为有参函数,延时1ms,程序如下:
void delay(ui x) { ui i,j;
for(i=0;i 4.5液晶显示子程序 void display() { if(num_D0||num_D1||num_D2||num_D3) { if(num_D0==1) { } 22 dis_1602(1,0,2,0,1); dis_1602(1,0,3,0,10); } else dis_1602(15,0,0,3,0); if(num_D1==2) { } if(num_D2==3) { } if(num_D3==4) { } dis_1602(10,1,5,1,0); dis_1602(1,0,8,0,4); dis_1602(1,0,9,0,10); dis_1602(1,0,6,0,3); dis_1602(1,0,7,0,10); dis_1602(1,0,4,0,2); dis_1602(1,0,5,0,10); 通过以上的源代码将病床呼叫系统各个模块的功能实现,通过lcd对呼叫病床号的显示以及控制室对呼叫的应答的显示,使这次的设计很成功。 5 电路的仿真及调试 5.1软件仿真 启动电源,显示屏无显示,在按下B按钮(对应2号床位)时,界面部分显示2,有指示灯显示,按下复位键后复位。该设计充分反应了控制电路的可行性。综上所述,本系统实现了:显示病床号,有指示灯显示,病床呼叫与值班人员应答的功能。通过Protues软件仿真,能达到上述结论,满足题目目的,达到要求。 23