① 接收中断请求。② 应答中断。③ 执行中断服务程序(ISR)。 (3)中断标志寄存器(IFR)
中断标志寄存器是一个存储映射的CPU寄存器,可以识别和清除有效的中断。当一个中断出现时,IFR中的相应的中断标志位置1,直到CPU识别该中断为止。
该设计在软件编程中需用到单片机的中断系统和中断指令,具体指令和程序见下章。
2.4 光线报警电路
该电路分为光敏电阻控制电路和光线发声报警电路。其功能是完成由光敏电阻控制的电路在条件满足时发出脉冲,该脉冲作用于89c52单片机的P1.0口,通过检测p1.0口是否为高电平,由中断控制利用P1.1口给出满足发声电路需要的脉冲,再由发声电路发出声音提醒学生光线太暗了,需要调节光的亮度,进而达到保护学生视力的目的。
[7]
2.4.1 光敏电阻控制电路
图2-3 光敏控制电路
图2-3是光敏控制电路原理图。当光敏电阻受到较强的光照照射时,光敏电阻阻值变低,输出端输出高电平,为模拟信号,经1/4LM339(四电压比较器,用其中的一个即可)转换成数字信号然后经反相器传给单片机,此时,传过去的信号为低电平,即光线正常时输出信
8
号为低电平;当光敏电阻受到较弱的光照照射时,光敏电阻阻值为无穷大,输出电压为Vce=0.7v,为低电平,经比较器输出为零,再经反相器作用后输出为1,即光线较暗淡时,总的输出电压为高电平即1。反馈到单片机上,触发蜂鸣器报警。
[8]
图2-4 LM339的结构图
图2-4为LM339的结构图。其中LM339集成块内部装有四个独立的电压比较器,该电压比较器的特点是:(1)失调电压小,典型值为2mV;(2)电源电压范围宽,单电源为2-36V,双电源电压为±1V-±18V;(3)对比较信号源的内阻限制较宽;(4)共模范围很大,为0~(Ucc-1.5V)Vo;(5)差动输入电压范围较大,大到可以等于电源电压;(6)输出端电位可灵活方便地选用。
LM339集成块采用C-14型封装,图2-5.1为LM339原理图的外型及管脚排列。由于LM339使用灵活,应用广泛,所以世界上各大IC生产厂、公司竟相推出自己的四相比较器,如IR2339、ANI339、SF339等,它们的参数基本一致,可互换使用。
2.5 定时报警电路
报警电路分为单片机控制电路和报警发声电路。它主要通过单片机的定时计数功能完成定时45分钟并使报警电路发出报警声,用以提醒学生休息!
89c52单片机内有两个可编程的定时器/计数器,满足诸如对外部脉冲进行记数,产生精确的定时时间,作串行口的波特发生器等功能的需要。它们具有两种工作模式(计数器模式和定时器模式)及4种工作方式(方式0,方式1,方式2,方式3)。其控制字均在相应的特殊功能寄存器中,通过对它的特殊功能寄存器的编制,可以方便的选择适当的工作模式和
9
工作方式。
当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计数满溢出为止。显然,定时器的定时时间与系统的振荡频率有关。因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。如果晶振为12MHz,则计数周期为:
T=1/(12×106)Hz×1/12=1μs
这是最短的定时周期。若要延长定时时间,则需要改变定时器的初值,并要适当选择定时器的长度(如8位、13位、16位等)。
当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电平。若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的计数值装入计数器。所以检测一个由1至0的跳变需要两个机器周期,故外部事年的最高计数频率为振荡频率的1/24。例如,如果选用12MHz晶振,则最高计数频率为0.5MHz。虽然对外部输入信号的占空比无特殊要求,但为了确保某给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。
工作方式控制寄存器TMOD用于控制定时器/计数器的工作模式及工作方式,它的字节地址为89H。定时器/计数器的两个作用是用来精确的模拟一段时间间隔(作定时器用)或累计外部输入的脉冲个数(作计数器用)。当作定时器用时,在其输入端输入周期固定的脉冲个数,即可计算出所定时间的长度。当89c52内部的定时器/计数器被选定为定时器工作模式时,记数输入信号是内部时钟脉冲,每个机器周期产生一个脉冲使计数器增1,因此,定时器/计数器的输入脉冲和机器周期一样,为时钟频率的1/12。本设计采用的时钟周期为6MHz,记数速度为500KHz,输入脉冲的时间间隔为0.5秒。
[10]
2.5.1 单片机控制电路
单片机控制电路由89c52单片机的P3.4和P3.5即T0和T1定时/计数器通过单片机的汇编语言来实现!定时时间为50分钟,其计时初值可计算如下:
50*60=3000s=30000*100ms
100ms用T0定时设置T0工作方式1,30000次用T2计数,设T2工作方式为11。 T0的定时初值为:2^16-100ms/2us=15536=C3B0H; T1的计数初值为65536-30000=35536=8AD0H
其中T0为定时器,T1为计数器,定时器T0定时100ms后,计数器T1计数一次,此时,
10
定时器T0进行中断服务程序ZDT0进行定时器T0循环定时进入下一个定时周期,当满足又一次定时满100ms时,再由计数器T1计数一次,如此循环下去,直到满足计数器T1计数30000次,计数器T1进入中断服务程序ZDT1,其功能是使单片机的P3.0引脚发送一个脉冲触发定时报警发声电路,由定时报警发声电路发出报警信号,使学生意识到已经学习了45分钟了,需要休息一下,进而达到保护学生视力的目的。此时,学生应关闭视力保护器电源,休息后在开启电源以进行节能。开启电源后,定时器T0和计数器T1进行到下一循环,对定时器进行赋值,T0定时,T计数,再进行报警。
定时用的c语言程序见附录。
2.5.2蜂鸣器报警发声电路
图2-5 蜂鸣器报警发声电路
如图2-5所示,三极管主要是做驱动用的。因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,利用单片机的定时功能通过P3.3产生一个振荡脉冲方波,输出高电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。
3 开发系统软件设计
由于简单的程序可以用汇编明显提高执行速度,但在大型程序开发时,需要考虑多方面因素,工程开发周期等需要合理选择编程语言,所以本文主要采用单片机c语言来完成软件设计和程序代码的编写,程序简单易懂,可执行性强。
3.1 系统软件设计
软件采用Keil Software,使用单片机汇编语言。因为汇编可以完成有些C语言完成不
11
了的操作。程序中对时间要求苛刻的部分可以用内嵌汇编来重写,以促进速度上的显著提高。但是,开发和测试汇编代码是一件辛苦的工作,它将花费更长的时间,因而要慎重选择要用汇编的部分。一个合格的程序员应该是写出高质量标准化程序。
主程序的流程采用模块的方法设计,先规划出各功能子模块,然后各个击破,这也是软件开发的方式,可以由简入难,比较符合人的思维习惯。
图3-2使定时器T0的中断程序流程图,图3-3使计数器T1终端服务流程图,其程序设计原理如下:
单片机控制电路由89c52单片机的P3.4和P3.5即T0和T1定时/计数器通过单片机的汇编语言来实现!定时时间为45分钟,其计时初值可计算如下:
50*60=3000s=30000*100ms
100ms用T0定时设置T0工作方式1,30000次用T2计数,设T2工作方式为11。 T0的定时初值为:2^16-100ms/2us=15536=C3B0H; T1的计数初值为65536-30000=35536=8AD0H
其中T0为定时器,T1为计数器,定时器T0定时100ms后,计数器T1计数一次,此时,定时器T0进行中断服务程序ZDT0进行定时器T0循环定时进入下一个定时周期,当满足又一次定时满100ms时,再由计数器T1计数一次,如此循环下去,直到满足计数器T1计数30000次,计数器T1进入中断服务程序ZDT1,其功能是使单片机的P3.0引脚发送一个脉冲触发定时报警发声电路,由定时报警发声电路发出报警信号,使学生意识到已经学习了45分钟了,需要休息一下,进而达到保护学生视力的目的。此时,学生应关闭视力保护器电源,休息后在开启电源以进行节能。开启电源后,定时器T0和计数器T1进行到下一循环,对定时器进行赋值,T0定时,T计数,再进行报警。
12