文章目录

  • 1. 准备工作(理论知识的学习+源代码编辑软件keil+仿真软件proteus)
  • 2. 用proteus结合keil的联合电路仿真设置
  • 3. 十字路口交通灯实验题目的分析与构思
  • 4. 各部分代码的实现
  • 5. 代码实现的难点解析

1. 准备工作(理论知识的学习+源代码编辑软件keil+仿真软件proteus)

  • 理论知识的学习(推荐爱课程的张毅刚老师的视频)
    http://www.icourses.cn/sCourse/course_5981.html

    • 源代码编辑软件keil的下载安装及基础教程
      下载:http://www.ddooo.com/softdown/8567.htm#dltab
      简易教程:http://www.51hei.com/mcuteach/189.html
    • 仿真软件proteus的下载安装及基础教程
      下载:http://www.onlinedown.net/soft/578407.htm
      安装:https://jingyan.baidu.com/article/656db918f8590de381249cbf.html
      教程:http://www.elecfans.com/emb/581557.html

2. 用proteus结合keil的联合电路仿真设置

(注意:ISIS是proteus里的电路仿真软件,ARES是PCB制版软件)




3. 十字路口交通灯实验题目的分析与构思

题目:假设一个十字路口为东西南北走向。开始为四个路口的红灯全部亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后(20秒),东西路口的绿灯,闪烁若干次后(3秒),东西路口的绿灯熄灭,同时东西路口的黄灯亮,延时一段时间后(2秒),东西路口的红灯亮,南北路口的绿灯亮,南北路口方向通车,延时一段时间后(20秒),南北路口的绿灯闪烁若干次后(3秒),南北路口的绿灯熄灭,同时南北路口的黄灯亮,延时一段时间后(2秒),再切换到东西路口的绿灯亮,南北路口的红灯亮,之后重复以上过程。
画出示意图:

各个部分的实现构思:
1. 元件选择:大体看来,我们需要89C51单片机和红绿灯两种元件。


* 89C51单片机最小系统的搭建
http://www.51hei.com/bbs/dpj-86330-1.html
https://blog.csdn.net/mini92/article/details/71191718
* 红绿灯的驱动原理
https://zhidao.baidu.com/question/514751848.html
2. 初始状态:主程序main初始化时实现(设置相应引脚的电位)
3. 起始开关:可用本例中51单片机用不到的某个P口的某个引脚(本例中用P2.0)
4. 红绿灯状态:
* 用P1.0-P1.2三个引脚连接和控制东西路口红绿灯
* 用P1.3-P1.5三个引脚连接和控制南北路口红绿灯
5. 两组红绿灯状态的判断与转移:
一共四种状态,我们用PSW寄存器中留给用户的标志位PSW.1(F0)与PSW.4(F1)来标记两组红绿灯的当前状态。每次延时结束时进行循环:检查上一个状态–>跳转到下一状态–>根据已经跳转的状态选择对应的处理程序。
红绿灯状态转移关系表:

交通灯状态转移实现逻辑:
* 当F0F1=11时,F0’=0,F1’=0
* 当F0F1=其他值时,F0’=F0 U F1,F1’=F1*(F1求反)
6. 延时5s实现:用计时器T0方式2计数 + 寄存器保存的初值自减(子程序DELAY5)
7. 延时2s实现:用计时器T0方式2计数 + 寄存器保存的初值自减(子程序DELAY2)
8. 状态1到状态2的闪烁:用计时器T1计数 + 寄存器保存的初值自减 + P2.1按条件取反(子程序BLINK1)
9. 状态3到状态4的闪烁:用计时器T1计数 + 寄存器保存的初值自减 + P2.1按条件取反(子程序BLINK2)

4. 各部分代码的实现

  1. main的初始化与起始开关:

     F1 BIT PSW.1ORG 0000HLJMP MAINORG 000BHLJMP T0PORG 001BHLJMP T1PORG 0100HMAIN:MOV P1,#09H     ;装入初值,使两路口等同时为红CLICK:JB P2.0,CLICK   ;交通灯开始工作开关(不停查询开关状态)
    
  2. 状态判断与状态转移:

     CLRFLAG:               ;清零标志位F0F1CLR F0CLR F1JNB F0,OneTwo ;判断F0F1并跳到指定状态的处理程序JB F1,FourLJMP Three;以上是第一次及当F0F1为11时的状态转移与程序选择处理;下面的LOOP是当F0F1为其他值时的处理LOOP:             MOV C,F0ANL C,F1JC CLRFLAG      ;当F0F1为11时,跳到CLRFLAG清零并处理MOV C,F0        ;当F0F1为其他情况时,各灯的处理ORL C,F1           ;按照F0’=F0UF1、F1’=F1*进行位操作MOV F0,C     CPL F1JNB F0,OneTwo ;判断F0F1并跳到指定状态的处理程序JB F1,FourLJMP Three
    
  3. 四个点亮灯并延时/闪烁的子程序One、Two、Three、Four

     OneTwo:            JB F1,TwoLJMP OneOne:               ;状态1的处理程序MOV P1,#0CH        ;装状态1值并点亮对应灯ACALL DELAY5    ;调用延时5S的子程序ACALL BLINK1 ;调用闪烁3S的子程序1LJMP LOOP       ;跳回LOOP进行状态转移Two:               ;状态2的处理程序MOV P1,#0AH        ;装状态2值并点亮对应灯ACALL DELAY2        ;调用延时2S的子程序LJMP LOOP        ;跳回LOOP进行状态转移Three:         ;状态3的处理程序MOV P1,#21H        ;装状态3值并点亮对应灯ACALL DELAY5    ;调用延时5S的子程序ACALL BLINK2 ;调用闪烁3S的子程序2LJMP LOOP       ;跳回LOOP进行状态转移Four:          ;状态4的处理程序MOV P1,#11H        ;装状态4值并点亮对应灯ACALL DELAY2        ;调用延时2S的子程序LJMP LOOP        ;跳回LOOP进行状态转移
    
  4. 5s延时子程序DELAY5

     DELAY5:  ;延时5秒程序MOV R0,#05H     ;秒数计数初值ACALL T0ORIGIN   ;定时器T0初始化LOOP5:CJNE R0,#0H,LOOP5  ;不断查询R0值是否在中断子程序中被减为0,非零则循环CLR EA           ;减为0,则关中断CLR ET0RET
    
  5. 2s延时子程序DELAY2

     DELAY2:  ;延时2秒程序(同5秒延时程序)MOV R0,#02H     ACALL T0ORIGINLOOP2:CJNE R0,#0H,LOOP2CLR EACLR ET0RET
    
  6. 闪烁子程序BLINK1

     BLINK1:  ;闪烁程序1MOV R0,#06H     ;延时3秒(定时器计时0.5秒)ACALL T1ORIGIN   ;T1初始化LOOPB1: MOV C,P2.1   ;不断将P2.1位的值赋给P1.1位,引起闪烁MOV P1.1,CCJNE R0,#0H,LOOPB1  ;不断查询中断子程序是否将R0的值减为0,非0则循环CLR EA           ;减为0,则关中断CLR ET1RET
    
  7. 闪烁子程序BLINK2

     BLINK2:  ;闪烁程序2(同闪烁程序1,但是将P2.1的值赋给P1.4)MOV R0,#06HACALL T1ORIGINLOOPB2:MOV C,P2.1MOV P1.4,CCJNE R0,#0H,LOOPB2CLR EACLR ET1RET
    
  8. 计时器T0初始化程序

     T0ORIGIN:  ;T0初始化程序MOV TMOD,#02H  ;方式2SETB EA  ;开中断SETB ET0MOV TH0,#9CH    ;初值156DMOV TL0,#9CHMOV R1,#27H  ;中断次数计数器(10000D)MOV R2,#10HSETB TR0  ;开始计时RET
    
  9. 计时器T0中断服务子程序

     T0P:    ;T0中断服务子程序CLR CMOV A,R2   ;每次中断,中断计数器减1SUBB A,#01HMOV R2,AMOV A,R1SUBB A,#00HMOV R1,AJC RST0    ;判断中断计数器是否减为0RETIRST0:   ;减为0,则R0自减1,中断次数计数器重装初值(10000D)DEC R0MOV R1,#27HMOV R2,#10HRETI
    
  10. 计时器T1初始化子程序

    T1ORIGIN:  ;T1初始化程序
    MOV TMOD,#20H   ;方式2
    SETB EA  ;开中断
    SETB ET1
    MOV TH1,#9CH    ;初值156D
    MOV TL1,#9CHMOV R3,#13H  ;中断次数计数器(5000D)
    MOV R4,#88HSETB TR1   ;开始计时
    RET
    
  11. 计时器T1中断服务子程序

    T1P:    ;T1中断服务子程序
    CLR C
    MOV A,R4   ;每次中断,中断计数器减1
    SUBB A,#01H
    MOV R4,AMOV A,R3
    SUBB A,#00H
    MOV R3,AJC RST1    ;判断中断计数器是否减为0
    RETIRST1:   ;减为0,则R0自减1,中断次数计数器重装初值(5000D)DEC R0CPL P2.1MOV R3,#13HMOV R4,#88H
    RETI
    
  12. 仿真电路图搭建

5. 代码实现的难点解析

  1. 计时器T0与T1中断服务子程序中的带借位的16位2进制数的减法

    • 计数原理:因为单片机晶振为11.0592MHZ/12MHZ,即使16位全用上,初值0值也不能计时1s钟,所以先用T0/T1方式2进行第一级的计时,再用通用寄存器组中的R1R2与R3R4,这两个16位二进制数来进行第二级的计数(就是看T0/T1中断了多少次)来完成计时1s的任务。流程图如下(计数初值均为156–计数100次晶振脉冲):

    • 带借位的二进制减法SUBB是否可靠地完成了任务的测试
      (以T0为例)

        CLR CMOV A,R2   ;每次中断,中断计数器减1SUBB A,#01HMOV R2,AMOV A,R1SUBB A,#00HMOV R1,A
      

    要想我们的代码设计可靠,必须满足以下条件:
    1. 若R2>=1时,对R2的SUBB结束后–>Cy=0,R2=R2-1
    2. 若R2=0时,对R2的SUBB结束后–>Cy=1,R2=255(#FFH)
    3. 若R1>=1时,对R1的SUBB结束后–>Cy=0,R1=R1-Cy
    4. 若R1=0时,对R1的SUBB结束后–>R1=R1-Cy,Cy与R2的SUBB结束后的值保持一致
    接下来我们用keil测试代码+ISIS仿真的89C51最小系统来测试上述条件是否满足:
    当R2=#01H时

            ORG 0000HLJMP MAINORG 0100HMAIN:CLR CMOV R2,#01HMOV A,R2SUBB A,#01HMOV R2,AMOV P3.0,C ;cy位的值在P3.0引脚显示MOV P2,R2  ;R2的值在P2口显示HERE:SJMP HEREEND
    

联合proteus的调试结果:(R2=0#,C=0,满足条件)

当R2=#0H时,结果为R2=255,Cy=1,满足:

当Cy=0,R1=1时:

         ORG 0000HLJMP MAINORG 0100HMAIN:CLR CMOV R1,#01HMOV A,R1SUBB A,#00HMOV R1,AMOV P3.0,C ;cy位的值在P3.0引脚显示MOV P2,R1  ;R1的值在P2口显示HERE:SJMP HEREEND

仿真结果:

当Cy=1,R1=1时:

当Cy=0,R1=0时:

当Cy=1,R1=0时:

综上所述:我们设计的16位二进制数的自减代码完全可靠

  1. T1的中断服务子程序中的P2.1取反的理解

     T1P:    ;T1中断服务子程序CLR CMOV A,R4   ;每次中断,中断计数器减1SUBB A,#01HMOV R4,AMOV A,R3SUBB A,#00HMOV R3,AJC RST1    ;判断中断计数器是否减为0RETIRST1:   ;减为0,则R0自减1,中断次数计数器重装初值(5000D)DEC R0CPL P2.1MOV R3,#13HMOV R4,#88HRETI
    

当16位二进制数自减为0后,用RST1代码块进行返回,其中会对P2.1取反。这是因为,T1中断服务子程序是服务于两个闪烁子程序BLINK1、BLINK2的,要闪烁(电平变化)的引脚有两个(P1.1、P1.4),而T1的中断服务程序只能有一个,所以不能在中断服务子程序内直接对这两个引脚取反。只能对某个我们用不到的引脚P2.1取反,然后在BLINK1内,将P2.1赋给P1.1;在BLINK2内,将P2.1赋给P1.4。

本文为原创内容,如需转载请注明出处。

从零开始--单片机十字路口交通灯控制实验相关推荐

  1. S7-1200PLC—实验四 十字路口交通灯控制

    实验四 十字路口交通灯控制 一.任务目标 知识目标: 1.掌握编程计时器控制应用. 2.掌握十字路孔交通灯的控制编写. 技能目标: 1.熟练编程技巧,掌握比较指令的程序调试方法,设置具有特殊功能的内部 ...

  2. PLC实验四十字路口交通灯控制的模拟

    PLC实验四十字路口交通灯控制的模拟

  3. PLC实验:十字路口交通灯控制

    实验项目名称: 十字路口交通灯控制 一.面板图 二.实验控制要求 二.端口分配 四.实验程序梯形图 <PLC原理及应用>各实验梯形图和控制程序

  4. 计算机原理实验红绿灯转换,微机原理实验交通灯控制实验.doc

    . . 课 程 设 计 课程设计名称: 交通灯控制实验 专 业 班 级 : 学 生 姓 名 : 学 号 : 指 导 教 师 : 课程设计时间: 2014.12.22---2015.1.2 微机原理 专 ...

  5. c语言交通灯控制设计和原理图,十字路口交通灯控制设计(附电路图及源代码).doc...

    十字路口交通灯控制设计(附电路图及源代码) <计算机控制技术> 课程设计报告 课题名称 交通灯控制设计 专 业 班 级 学生姓名 学 号 指导教师 201*年 6 月 8日 目录 TOC ...

  6. 8255控制交通灯实验 c语言 main,交通灯控制实验

    交通灯控制实验 一)实验目的 通过并行接口8255实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用和中断的使用. 二)交通灯变化规律 十字路口交通灯的变化规律要求 1) 北路口的绿灯.东西路口的 ...

  7. 基于51单片机十字路口交通灯_5s黄灯闪烁

    基于51单片机十字路口交通灯_5s黄灯闪烁 目录标题 基于51单片机十字路口交通灯_5s黄灯闪烁 功能要求 仿真图 程序 主要程序代码 程序讲解 倒计时的产生 红黄绿灯状态处理 倒计时显示处理 资料清 ...

  8. 基于51单片机十字路口交通灯_只显示绿灯时间+黄灯5s

    基于51单片机十字路口交通灯_只显示绿灯时间+黄灯5s (程序+仿真+参考报告) 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号J011 目录标题 基于5 ...

  9. 交通灯控制系统c语言编程,基于单片机的交通灯控制系统设计(本科)毕业论文设计.doc...

    基于单片机的交通灯控制系统设计 摘 要 当你路过一个十字路口时,你是否注意到各个方向车辆和行人有有条不紊的通过十字路口.这样井然有序的情境靠什么来实现的呢?靠的是交通灯控制系统.在论文中我使用单片机S ...

最新文章

  1. 孪生网络图像相似度_生成对抗网络的进步多大,请看此文
  2. 用python自动化做ecshop测试_Python-自动化测试面试
  3. mysql innodb 数据复制_五千万的数据 复制到另张表 是先复制数据再加索引还是先建好索引再复制数据 表引擎Innodb...
  4. php excel文件导出之二 图像导出
  5. 发生生成错误是否继续并运行上次的成功生成_JavaScript 是如何运行的?
  6. 7种可能会导致内存泄漏的场景!
  7. 全方位解析阿里云核心技术竞争力,CSDN 独家在线峰会来了!
  8. Abseil之Prefer Factory Functions to Initializer Methods
  9. kali没有arpspoof命令_windows环境下使用python3命令
  10. WEB三大攻击之—SQL注入攻击与防护
  11. JS前端生成二维码的几种方式
  12. ubuntu18.04截图快捷键
  13. 6.ring3-ImportREC重建输入表
  14. 微信小程序 | 微信公众平台SpringBoot开发实例 │ 开发一个简易的个人微信公众号
  15. word复制某些公式无响应处理方法
  16. 【Go】dep使用介绍
  17. 第九讲:工业网络——搭建单环冗余网络
  18. 深入探讨PageRank(四):PageRank的危机及搜索引擎的未来
  19. 大学计算机基础 贾学明,关于组织本、专科学生参加计算机应用能力考试的通知...
  20. 模板模式template

热门文章

  1. Vue项目全面解析vuecil3/vuecil4的vue.config.js等常用配置
  2. Mac配置go环境变量
  3. 一篇就够,python 操作 word 文档,使用 python-docx 落地实现,写入篇
  4. MySQL数据库第一课 ---------安装
  5. 解决Vue 前端Long型超过16位精度丢失问题
  6. Jquery的on方法绑定事件
  7. word(2010)宏使用-批量提取word数据
  8. 第二语言习得实践方法
  9. C++课后习题第七章
  10. Overture 5教程之音符讲解