目录
4.5 8255并行I/O扩展及交通信号灯控制实验
1、画出实验的流程图
2、编写源程序并进行注释
3、记录实验过程
4、记录程序运行结果截图
本实验利用 8255 实现可编程的并行 IO 扩展功能,并利用其完成交通灯控制。实验要求红灯常亮 30S,绿灯常亮 25S 后闪烁 5S。使用静态数码管显示绿灯常亮倒计时。实验原理图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”仿真器。
图2:设置晶振频率
图3:选择仿真器
5. 构造(Build)工程PIO8255_trafic_c.uV2。如果编程有误进行修改,直至构造正确为止。
6. 运行程序,交通灯状态切换以及倒计时器的显示是否符合程序要求,若不符合,分析出错原因,继续重复第4、5 步的步骤,直至结果正确。
图4:实验流程图
实验分析:本实验中的东西方向信号灯同步控制,南北方向信号灯同步控制,即:东西方向上同种颜色的灯同时亮或灭,南北方向上同种颜色的灯同时亮或灭。程序中的延时1 秒钟,可以利用纯软件延时实现,也可以结合定时器硬件中断加软件计数方式实现。图中的CD4511 是BCD 码到LED 数码管的显示码转换芯片,因此要显示某个数字,只需要在相应的端口送出该数字的BCD 码即可,不用进行软件译码。首先将模式设置成模式0,开始时将数组bcd[]对应的BCD码移位送到sbuf中。接着通过RXD采用串行的方式送到数码管芯片,直接将该BCD码显示出来。同时,TXD输出一个同步移位时钟,从而驱动数码管的正常运行。
- #include<reg51.h> // 头文件
- #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); //延时以达到闪烁
- }
- }
- }
初学单片机,可能存在错误之处,还请各位不吝赐教。