山东大学单片机原理与应用实验 4.5 8255并行I/O扩展及交通信号灯控制实验

目录

一、实验题目

二、实验要求

三、实验过程及结果分析

四、实验流程图

五、实验源代码


一、实验题目

4.5 8255并行I/O扩展及交通信号灯控制实验

二、实验要求

1、画出实验的流程图

2、编写源程序并进行注释

3、记录实验过程

4、记录程序运行结果截图

三、实验过程及结果分析

本实验利用 8255 实现可编程的并行 IO 扩展功能,并利用其完成交通灯控制。实验要求红灯常亮 30S,绿灯常亮 25S 后闪烁 5S。使用静态数码管显示绿灯常亮倒计时。实验原理图1如下:

山东大学单片机原理与应用实验 4.5 8255并行I/O扩展及交通信号灯控制实验_第1张图片

图1:实验原理图

1. 关掉实验箱电源。将MCU 板,PIO 版,KEY&LED 板插接在母板上。按照前面连接关系表将硬件连接好。

2. 在仿真器断电情况下将仿真器的仿真头插在 MCU 板的CPU 插座上。将仿真器与开发PC 机的通信口连接好,打开实验箱及仿真器的电源。

3. 运行 Keil uVision2 开发环境,建立工程PIO8255_trafic_c.uV2,CPU 为AT89S51,包含启动文件STARTUP.A51。

4. 按照实验功能要求创建源程序 PIO8255_trafic.c 并加入到工PIO8255_trafic _c.uV2,并设置工程PIO8255_trafic_c.uV2 属性,将其晶振频率设置为11.0592MHz,选择输出可执行文件,DEBUG 方式选择硬件DEBUG,并选择其中的“WAVE V series MCS51 Driver”仿真器。

山东大学单片机原理与应用实验 4.5 8255并行I/O扩展及交通信号灯控制实验_第2张图片

图2:设置晶振频率

山东大学单片机原理与应用实验 4.5 8255并行I/O扩展及交通信号灯控制实验_第3张图片

图3:选择仿真器

5. 构造(Build)工程PIO8255_trafic_c.uV2。如果编程有误进行修改,直至构造正确为止。

6. 运行程序,交通灯状态切换以及倒计时器的显示是否符合程序要求,若不符合,分析出错原因,继续重复第4、5 步的步骤,直至结果正确。

四、实验流程图

山东大学单片机原理与应用实验 4.5 8255并行I/O扩展及交通信号灯控制实验_第4张图片

图4:实验流程图

实验分析:本实验中的东西方向信号灯同步控制,南北方向信号灯同步控制,即:东西方向上同种颜色的灯同时亮或灭,南北方向上同种颜色的灯同时亮或灭。程序中的延时1 秒钟,可以利用纯软件延时实现,也可以结合定时器硬件中断加软件计数方式实现。图中的CD4511 是BCD 码到LED 数码管的显示码转换芯片,因此要显示某个数字,只需要在相应的端口送出该数字的BCD 码即可,不用进行软件译码。首先将模式设置成模式0,开始时将数组bcd[]对应的BCD码移位送到sbuf中。接着通过RXD采用串行的方式送到数码管芯片,直接将该BCD码显示出来。同时,TXD输出一个同步移位时钟,从而驱动数码管的正常运行。

五、实验源代码

#include         // 头文件
#define uint unsigned int    
#define uchar unsigned char

uchar xdata led _at_ 0x7ffc; //外部寻址为8255的A口的地址
uchar xdata COM _at_ 0x7fff; /外部寻址为8255的控制寄存器的地址
sbit RX=P3^0;        // 设置P3.0为端口RXD
sbit TX=P3^1;     // 设置P3.1为端口TXD 
//定义数字0~25的BCD码
uint code bcd[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,
0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25};       
void delayms(uint ms)     //定义延迟子程序
{
	uchar t;
	while(ms--)	for(t=0;t<120;t++); //共延时1毫秒
}
void num(uint bcddata) //定义显示子程序
{
	SCON=0x00;       //工作模式0
	SBUF=bcddata;       //将数据存入SBUF
	while(!TI);
	TI=0;      //清零
} 
//主函数
void main()
{
	COM=0x80;
	EA=1;       //允许中断
	ET0=1;      //允许T0中断
	TF0=0;      //T0溢出的请求中断标志位
	while(1)      //一直循环
	{
		char i=0;       //设置循环控制变量
		led=0x69;       //低电平时,东西绿灯亮,南北红灯亮 
		for(i=25;i>=0;i--) //数码管从25倒计时到0
		{
			num(bcd[i]);  //调用数码管显示子程序
			delayms(1000);    //调用延时子程序
		}
		for(i=0;i<5;i++)    // 循环并发出五次闪烁
		{
			led=0xeb;      //东西绿灯灭,南北红灯灭
			delayms(500);     //延时
			led=0x69;        //东西绿灯亮
			delayms(500);     //延时以达到闪烁
		}
		
		led=0x96;    //南北绿灯亮 
		for(i=25;i>=0;i--)//数码管从25倒计时到0
		{
			num(bcd[i]);     //调用数码管显示子程序
			delayms(1000);      //延时
		}
		for(i=0;i<5;i++)        // 循环并发出五次闪烁
		{
			led=0xbe;           //南北绿灯灭
			delayms(500);        //延时
			led=0x96            //南北绿灯亮
			delayms(500);        //延时以达到闪烁
		}	
	}
	}

初学单片机,可能存在错误之处,还请各位不吝赐教。

你可能感兴趣的:(MCU-C51,单片机,嵌入式硬件,51单片机,mcu,proteus)