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


    目录

    一、实验题目

    二、实验要求

    三、实验过程及结果分析

    四、实验流程图

    五、实验源代码


    一、实验题目

    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输出一个同步移位时钟,从而驱动数码管的正常运行。

    五、实验源代码

    1. #include<reg51.h> // 头文件
    2. #define uint unsigned int
    3. #define uchar unsigned char
    4. uchar xdata led _at_ 0x7ffc; //外部寻址为8255的A口的地址
    5. uchar xdata COM _at_ 0x7fff; /外部寻址为8255的控制寄存器的地址
    6. sbit RX=P3^0; // 设置P3.0为端口RXD
    7. sbit TX=P3^1; // 设置P3.1为端口TXD
    8. //定义数字0~25的BCD码
    9. uint code bcd[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,
    10. 0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25};
    11. void delayms(uint ms) //定义延迟子程序
    12. {
    13. uchar t;
    14. while(ms--) for(t=0;t<120;t++); //共延时1毫秒
    15. }
    16. void num(uint bcddata) //定义显示子程序
    17. {
    18. SCON=0x00; //工作模式0
    19. SBUF=bcddata; //将数据存入SBUF
    20. while(!TI);
    21. TI=0; //清零
    22. }
    23. //主函数
    24. void main()
    25. {
    26. COM=0x80;
    27. EA=1; //允许中断
    28. ET0=1; //允许T0中断
    29. TF0=0; //T0溢出的请求中断标志位
    30. while(1) //一直循环
    31. {
    32. char i=0; //设置循环控制变量
    33. led=0x69; //低电平时,东西绿灯亮,南北红灯亮
    34. for(i=25;i>=0;i--) //数码管从25倒计时到0
    35. {
    36. num(bcd[i]); //调用数码管显示子程序
    37. delayms(1000); //调用延时子程序
    38. }
    39. for(i=0;i<5;i++) // 循环并发出五次闪烁
    40. {
    41. led=0xeb; //东西绿灯灭,南北红灯灭
    42. delayms(500); //延时
    43. led=0x69; //东西绿灯亮
    44. delayms(500); //延时以达到闪烁
    45. }
    46. led=0x96; //南北绿灯亮
    47. for(i=25;i>=0;i--)//数码管从25倒计时到0
    48. {
    49. num(bcd[i]); //调用数码管显示子程序
    50. delayms(1000); //延时
    51. }
    52. for(i=0;i<5;i++) // 循环并发出五次闪烁
    53. {
    54. led=0xbe; //南北绿灯灭
    55. delayms(500); //延时
    56. led=0x96 //南北绿灯亮
    57. delayms(500); //延时以达到闪烁
    58. }
    59. }
    60. }

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

  • 相关阅读:
    做好有限空间管理的五个原则
    MySQL8 设置自动创建时间和自动更新时间
    【面试题】前端面试真题 年前端面试
    5-爬虫-打码平台、打码平台自动登录打码平台、selenium爬取京东商品信息、scrapy介绍安装、scrapy目录结构
    MVVM 与 MVC区别和应用场景?
    Markdown
    【分享】获取微信通讯录python代码形式实现
    如何设计一份问卷?
    Linux网络流量监控iftop
    物联网整体框架有哪些层面?
  • 原文地址:https://blog.csdn.net/m0_52316372/article/details/125635757