单片机、红外遥控接收电路、状态指示电路、控制电路以及单片机的一些外围电
路组成单片机红外遥控接收器。
使用单片机中的 T0来做红外脉冲计数器,T1来做计数时间控制器。接收管收到收 个红外脉冲后,就触发外部中断1,计数器 T0、定时器 T1就开始工作。当定时溢出时, 计数器 T0被中断程序随之关闭,通过判定所读入的计数数值,来定下将操作的对象(遥 控按键)对它进行相对的操作,控制电路来控制负载的状态。下图3-7为红外遥控接收 器设计原理框图。
3.4 交通灯电路图
3.4.1 交通灯电路图
交通灯电路如图 3-8 所示。
图 3-8 交通灯电路图
图中大部分连线采用总线形式。共四个二位阴极数码管,这四个数码管分别用
来显示四个路口的倒计时,数码管的阳极都接到 STC89C52 的 P0 口,阴极接到 P2 口; 共 12 个发光二极管,其中 4 个绿色发光二极管,4个红色发光二极管,4 个黄色发光 二极管,四个路口每个路口各有一个红(禁行)、一个黄(警告)发光二极管,一个绿 色发光二极管(通行),四个人行道,每个人行道两边各有一红、黄、绿发光二极管, 另外一个按键按钮用于繁忙模式和夜间模式的转换,其中四个路口的二极管接到 P1 口, 人行道的发光二极管接到 P3 口,繁忙模式和特殊模式的指示灯接 P2 口。
3.4.2 电源电路设计
该电路为一个输出+5V 直流电压的稳压电源电路。IC 采用集成稳压器 7805,C1、C
3 分别为输入端和输出端滤波电容,RL 为负载电阻。当输出电较大时,7805 应配上散 热板。电源电路图如图 3-9 所示。
图 3-9 电源电路图
如图所示,220V 的交流电压经过一个变压器生成一个 9V 的交流电压,通过转换电 路进入集成稳压器 7805,最终输出一个+5V 的直流电压,可以提供稳定的电源。
3.4.3 按键电路设计
按键电路如图 3-10 所示。
本设计设置了有 3 个按键——S1:S 键接 P3.6,S2:J 键接 P3.0,S3:F 键接 P3.7。 每个按键一端接地,另一端接上拉电阻。低电平有效,当按键按下端口接地,单片机捕获 到低电平,从而知道相应的输入信息。
按键功能如下:S 键是用来启动正常模式,J 键是用来启动上下班高峰的繁忙模式,F 键是用来启动深夜特殊模式。
3.5 本章小结
本章内容前面一部分主要从理论上介绍了硬件设计的内容,后半部分结合电路图 把理论与实物相结合,介绍了系统的工作原理以及设计原理。当然我设计的简易交通 灯还是有很多不足的地方,需要以后再根据实际情况不断加强功能。
第 4 章 软件设计
4.1 程序主体设计流程
全部控制程序实际上分为若干模块:键盘设置处理程序,状态灯控制程序,LED 显 示程序,消抖动延时程序,中断服务子程序等。交通灯的总流程图如图 4-1 所示。
图 4-1 主程序流程图
电路系统上电,设置初始红灯等待时间 90 秒,即 S1 状态为正常模式状态,即在 非上下班高峰时段,此时交通灯正常运行,红灯等待时间为 90 秒;S2 为上下班高峰繁 忙模式,此时通过红外遥控或者按键来转换交通灯的运行模式,红灯等待时间为 40 秒; S3 为深夜特殊模式,此时通过红外遥控或者按键可以控制,无需红灯等待时间。
4.2 按键设计
首先程序不断扫描模式设置键,分别记为:S 键,J 键,F 键对应IO端口的P
3.6,P3.0,P3.7,低电平有效,按键顺序是指定的,若直接按 S 键,则为正常模式,然后进入 下一程序;若再按 J 键,则为繁忙模式,然后进入下一程序;若按下 F 键,则为特殊模式, 并进入下一程序。
程序的开始要判断是否有键按下,可以不断将 J 键值和 F 键值相或,或值为 0 则表示 没有键按下,即交通灯正常运行,为 1 则表示有键按下,交通灯启动了上下班高峰模式或者深夜特殊模式。
接下来要判断具体是那个键,若为 J 键,则表示启动的是上下班高峰模式,进入下一 程序,否则为 F 键,则表示启动的是深夜特殊模式,用 R0 存值,同时还需判断此时 S 键 是否按下,若按下,则表示恢复正常模式,进入下一程序。
在这个过程中,S,J 键的计数是循环的,从 S 键按下设置的初值 90 开始,减到 J 键 按下设置的值 40 则循环回到初值 90。
4.3 定时器的参数设计
定时器工作的时候需要给计数器传送计数器的初值,该值要传送到 TL 和 TH 中。 定时器是运用加法记数,可以从全 1 到全 0 的时候自动的产生一个溢出中断请求。这 样我们就可以把计数器它记满为 0 所需要的计数值设为 C,把计数初值设为 TC,计算
通式如下:
很明显一秒钟超过了计数器所能表示的最大时间,因而我们就必须采用软件和定 时器相结合的方法去解决这个难题。
软件延时部分:MCS-51 的工作频率为 12MHZ。机器周期与主频有关,机器周期是 主频的 12 倍,所以一个机器周期的时间为 12*(1/12M)=1us。我们可以知道具体每条 指令的周期数,这样我们就可以通过指令的执行条数来确定 1 秒的时间。由于单片机 运行的速度非常快,所以其他的一些指令的执行耗时可以不用考虑。
设定一个初值是 40 的软件计数器让 T0 定时为 50 毫秒。这样的话每次 T0 到了 50 毫秒的时候处理器就响应溢出的中端请求,并且进入中断服务的子程序。在中断服务 的子程序里,CPU 先让软件的计数器减少 1,再去判断其是否是零。如果是零的话表示 一秒就到了。定时器要设为 50 毫秒,T0 工作方式必须在 1 上,初值计算如下:
TC=M-T*T0=216-50ms=15536=3CBOH 定时器 0 中断流程如图 4-2 所示:
图 4-2 定时器 0 中断流程图
/**********************T0 中断服务程序*******************/
void timer0(void)interrupt 1 using 1
{
static uchar count; TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++;
if(count==10)
{
if(Flag_SN_Yellow==1) //测试南北黄灯标志位
{SN_Yellow=~SN_Yellow;}
洛阳理工学院电气工程与自动化学院项目设计说明书
if(Flag_EW_Yellow==1) //测试东西黄灯标志位
{EW_Yellow=~EW_Yellow;}
}
if(count==20)
{
Time_EW--; Time_SN--;
if(Flag_SN_Yellow==1) //测试南北黄灯标志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1) //测试东西黄灯标志位
{EW_Yellow=~EW_Yellow;}
count=0;
}
}
4.4 中断原理
本系统主要使用了外部中断,中断信号有两个引脚 INT0、INT1 进行输入,低电平 时有效,CPU 每个时钟周期都会检测 INT0 和 INT1 上的信号,STC89C52 允许外部中断 以电平方式或负边沿方式两种中断方式输入中断请求信号,可由用户通过设置 TCON 中 IT0 和 IT1 位的状态来实现。以 IT0 为例,IT0=0,为电平触发的方式,IT0=1,是负边 沿触发的方式,本设计采用电平方式,IE0 为其中断标志位,有中断信号则置位,中断 服务子程序响应后,IE0 自动清零。IE 中的 EA 为允许中断的总控制位,为 1 开启,EX0 为外部中断允许控制位,为 1 开启。在优先级的允许下,一旦有外部中断信号产生, 单片机 CPU 首先保护断点,PC 值进栈,然后执行相应的中断服务子程序,执行完后, 用 RETI 指令返回,此时 CPU 会从堆栈中取保存的断点地址,送回 PC,程序再正常执行,ED 倒计时显示。
外部中断流程图如图 4-3 所示。
子程序如下:
图 4-3 外部中断 0 中断流程图
/**********************外部 0 中断服务程序******************/
void INT0_srv(void)interrupt 0 using 1
{
EX0=0; //关中断
if(Nomor_Button==0) //测试按键是否按下,按下来为正常状态
{
EW1=90; SN1= 40; EWL1=19; SNL1=19;
Busy_LED=0; //关繁忙信号灯
Special_LED =0; //关特殊信号灯
洛阳理工学院电气工程与自动化学院项目设计说明书
}
if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态
{
EW1=45; SN1=30; EWL1=14; SNL1=14;
Special_LED=0; //关特殊信号灯
Busy_LED=1; //开繁忙信号灯
}
if(Special_Btton==0)//测试按键是否按下,按下为特殊状态
{
EW1=75; SN1=55; EWL1=19; SNL1=19;
Busy_LED=0; //关繁忙信号灯
Special_LED =1;//开特殊信号灯
}
EX0=1; //开中断
}
4.5 状态灯显示及判断
在本设计中,实际控制的灯只有 6 个,即:东西红灯,东西绿灯,东西黄灯,南 北红灯,南北绿灯,南北黄灯。IO 端口均是低电平有效。共有 4 种状态:东西红灯亮, 南北绿灯亮(11011101);东西红灯亮,南北黄灯亮(10111101);东西绿灯亮,南北 红灯亮(11101101);东西黄灯亮,南北红灯亮(11100111)。
在用于显示发光二极管时,直接由 MOV 指令将十六进制码送入 P2 口。
刚才的 4 个状态是依次变换的,这就要涉及到状态的判断和衔接了。先把 P2 端口 的值与所有的 4 个状态码比较,若相同则判断成功当前状态,再把下一状态的状态码 送显 P2 即可。状态灯定义如下:(见附件)
计时每 1 秒都要刷新 1 次,那么计时满 1 秒时就要将存储时间的工作寄存器 R4 减 1,然后送入显示程序中显示。下面要将时间数据 R4 的十位,个位分开送显 P1, P0 端口,首先将 R4 除以 10,整数即十位放在 A 中,余数即个位放在 B 中,设置 7 段 显示数据的数据表,用数据指针寄存器 DPTR 指向数据表的首地址,再加上 A 中的偏 移量,就可以指向十位数字,然后送显即可,个位显示同理。设计中得延时程序都是 用软件完成,通过程序执行一条指令的时间,再加上了两次累减嵌套来实现。
在按键计数的过程里,存在机械抖动和软件方面的冲突,比如程序检测到了有按键 按下,就计数一次,而事实上,按键闭合后在微观上还会弹起然后闭合,一直达到稳定状态, 所以后面的弹落会没有效果,为了使程序不要出现这一现象,我们特别添加了上面所说 的延时消抖程序,可以在第一次检测到闭合时,调用了一定时间的延时程序。
下面是显示北向的时间程序,其他方向依此类推:
1 SMG_XS=Data[bei/10]; //显示北的十位
1 SMG_KZ=0xfd; //允许北十位显示
1 delay(t); //小延时一下,使数码管显示更清楚
1 SMG_KZ=0xff; //关闭数码管显示(消隐)
1 SMG_XS=Data[bei%10]; //显示北的个位
1 SMG_KZ=0xfe; //允许北个位显示
1 delay(t); //小延时一下,使数码管显示更清楚
1 SMG_KZ=0xff; //关闭数码管显示(消隐)
4.7 本章小结
本章是软件设计部分,给出了相关运算过程还有一部分重要的程序段,对定时原 理还有中断原理给出了很多相关知识,这些都是单片机运行的关键,所以做了比较充 分的介绍。
PROTEUS 仿真图如图 5-1 所示。
图 5-1 PROTEUS 仿真图
本设计完全用仿真软件在电脑上对目标电路原理图和程序进行检测和调试。调试 过程中单片机相应输入端由通用键盘和鼠标设定,运行状态、各寄存器状态、端口状 态等都可以在指定的窗口区域显示出来,以确定程序运行有无错误。
目标程序纠错:该阶段工作通常在目标程序编辑时就完成。一般来说,仿真软件 能为用户输入的程序指令纠错,包括书写格式、标号未定义或多重定义、转移地址溢 出等错误。
整体程序调试:即把各子程序整体连起来进入到综合电路调试,看是否能实现预计的功能显示。在这阶段若发生故障,可以考虑各子程序在运行时是否破坏现场,数
据缓冲单元是否发生冲突,标志位的建立和清除在设计上是否失误,堆栈是否溢出, 输入输出状态是否正常等。
5.2 硬件实物演示图片及简单介绍
图 5-2 实物正面图
如图 5-2 所示,这是一个简易的交通灯,主要有四个按键开关,一个作为控制器 的 STC89C52 芯片,四个双位阴极数码管显示时间,十二个发光二极管表示通行状态。
运行中的实物图展示:
图 5-3 初始上电画面
图 5-3 为初始上电画面,所有灯闪烁数次然后开始正常运行,通过此时的状态能 观察出 LED 灯的运行情况,如有损坏,则上电时灯不会闪烁。
图 5-4 运行中交通灯效果展示
图 5-4 所示状态为南北为绿灯,东西为红灯,即表示南北车辆通行,东西方向车 辆禁止通行。
图 5-5 特殊深夜模式
图 5-5 为深夜特殊模式图,当特殊深夜模式开启时,四个方向上黄灯都开始闪烁, 红绿灯都停止燃亮,方便了深夜少数车辆的通行。当深夜结束时,可以通过按键来转 换工作模式。
5.3 本章小结
这部分主要展示了仿真与实物运行的效果图,并且加以说明。从效果上来看设计 还是比较成功的,由于时间紧迫,红外遥控的设计部分还未加到实物中,但是特殊的 深夜模式还是成功地在实物中得以体现。总得来说,设计上还是有不足的地方,但是 一些基本的功能都能实现。
电路总图: