一、实验目的与任务
实验目的:
1. 学习模拟交通灯控制的实现方法;
2. 掌握Proteus硬件仿真与调试。
任务:
1.根据要求编写程序,并写出原理性注释;
2. 将检查程序运行的结果,分析一下是否正确;
3. 完成所建工程的仿真及调试。
二、实验内容
按照电路要求在Protues中设计电路图。编程实现如下功能:
用单片机端口作输出口,控制四个方向共12个发光二极管亮灭,模拟交通灯管理。功能描述如下:初始态为四个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程。
三、实验内容
(1)软件实现:
实验步骤:
1.运行Keil uVision5 开发环境,按照“模块化单片机教学实验平台配套的实验指导书1.2.3 节”介绍的方法建立程esimlab4. uvproj,CPU 为AT89S51,包含启动文件STARTUP.A51。
2. 输入源程序,在Keil uVision5 开发环境中,建立源程序esimlab8.c,将上述程序加入该程序文件。并将该文件加入工程esimlab4.uvproj。
3.设置工程esimlab8 uvproj 属性,将其晶振频率设置为11.0592MHz,选择输出可执行文件(HEX 文件),仿真方式为“Use Simulator”。
4. 构造(Build)工程esimlab8.uvproj。如果输入有误进行修改,直至构造正确,生成可执行程序 esimlab8.hex 为止。
程序流程图如图1:
图1 交通灯控制流程图
(2)Proteus仿真:
实验步骤:
1.运行Proteus 开发环境,建立工程,新建原理图设计文件esimlab8. pdsprj。
2.设置单片机属性,将其晶振频率设置为11.0592MHz,载入KEIL生成的文件esimlab8.hex。
3.运行仿真并观察结果。
(3)开发板实验验证:
实验步骤:
1.关掉实验箱电源。将CPU 板插接在JK1、JK2 上,注意CPU 板的插接方向。按照实验四说明书连接关系表将硬件连接好。
图1 实验板连接线表
2.将AT89S52 芯片插在CPU 板的CPU 插座上(注意不要插反)。母板上电。
3.通过PROGISP 烧写软件,利用ISP 下载线(见“模块化单片机教学实验平台配套的实验指导书1.3 节”)把HEX (esimlab8.hex)文件下载到单片机中。
4.下载成功后,通过按键,观察母板上的交通灯工作情况。
四、实验报告
main.c
#include <reg52.h>
#include <absacc.h>
#define PA XBYTE[0x7FFC] //PA端口地址
#define PB XBYTE[0x7FFD]
#define PC XBYTE[0x7FFE]
#define COM XBYTE[0x7FFF]
char code dx516[3] _at_ 0x003b;
unsigned char Second[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
unsigned char count = 0, total = 0;
/**************8255初始化******************************/
void init_8255(void)
{
COM = 0x80; // 方式0,C = out B=out A = out
PA = 0xFF;
PB = 0xFF;
}
/**************定时器1初始化******************************/
void init_T1(void)
{
TMOD &= 0x0F;//设置定时器模式
TMOD |= 0x10;//设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0x4C; //设置定时初值
TF1 = 0;//清除TF1标志
ET1 = 1; //允许定时器中断1
EA = 1; //开总中断
TR1 = 0;//定时器1先不工作
}
//-------------------
// 函数名称: void delay_s(unsigned t)
// 函数功能: 利用定时器延时t*0.5秒子程序
//-------------------
void delay_s(unsigned char t)
{
TR1 = 1;//启动定时器1
total = t * 10;
count = 0;
while(1)
{
if(count == total)//定时时间到
{
count = 0;
total = 0;
TR1 = 0;
return;
}
}
}
void timer1() interrupt 3 //定时器1
{
TR1 = 0;
TL1 = 0x00; //设置定时初值
TH1 = 0x4C; //设置定时初值
count++;
TR1 = 1;
}
void main(void)
{
unsigned char i = 0;
init_8255();//初始化8255
init_T1();//初始化定时器1
while(1)
{
//东西方向->南北方向
for(i = 10;i > 0;i--)
{
PC = Second[i];
if(i < 4)//东西方向绿灯/南北方向红灯闪烁3秒
{
PA = 0xFF;
PB = 0xFF;
delay_s(1);
PA =0xF6;
PB =0xDB;
delay_s(1);
}
else
{
PA = 0xF6; //东西绿灯亮
PB = 0xDB; //南北红灯亮
delay_s(2);
}
}
for(i = 3;i > 0; i--)
{
PC = Second[i];
PA = 0xED;//东西黄灯亮
PB = 0xED;//南北黄灯亮
delay_s(1);
PA = 0xFF;
PB = 0xFF;
delay_s(1);
}
//南北方向->东西方向
for(i = 10;i > 0;i--)
{
PC = Second[i];
if(i < 4)//南北方向绿灯/东西方向红灯闪烁3秒
{
PA = 0xFF;
PB = 0xFF;
delay_s(1);
PA = 0xDB; //东西红灯亮
PB = 0xF6; //南北绿灯亮
delay_s(1);
}
else
{
PA = 0xDB; //东西红灯亮
PB = 0xF6; //南北绿灯亮
delay_s(2);
}
}
for(i = 3;i > 0;i--)
{
PC = Second[i];
PA = 0xED;//东西黄灯亮
PB = 0xED;//南北黄灯亮
delay_s(1);
PA = 0xFF;
PB = 0xFF;
delay_s(1);
}
}
}
在实验过程中,由于刚开始计算红绿灯对应的十六进制数据时没看清哪个对应的红黄绿,导致第一次运行仿真时信号灯颜色乱闪。在后续使用时应认真仔细分析题目。文章来源:https://www.toymoban.com/news/detail-776104.html
通过本次实验深入理解了模块化编程,熟悉了8255芯片的工作方式和中断的使用。在本次实验过程中掌握了8255 芯片的硬件连接方法、内部结构、工作原理和工作方式,熟悉了8255片的初始化编程,再一次编写中断程序,使我更熟悉了中断的原理和过程,能更熟练地编写中断服务程序。同时在实验中将一些外设的启动初始化抽取到相应的初始化函数中,通过调用初始化函数启动,这样不仅增加了代码的可阅读性,而且减少了代码堆积,便于修改。实验中结合定时器进行延迟,减小了延迟函数对主程序的影响,提高了软件资源的利用率。文章来源地址https://www.toymoban.com/news/detail-776104.html
到了这里,关于实验(八):交通灯控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!