51单片机模拟交通信号灯

合集下载

51单片机交通灯(加急救车)

51单片机交通灯(加急救车)

51单片机控制交通灯一、实现功能:1、先南北红灯亮,东西绿灯亮。

南北红灯亮维持25秒,在南北红灯亮的同时东西绿灯也亮,并维持20秒;到20秒时,东西绿灯闪亮,闪亮3秒后熄灭。

在东西绿灯熄灭时,东西黄灯亮,并维持2秒。

到2秒时,东西黄灯熄灭,东西红灯亮,同时,南北红灯熄灭,绿灯亮,东西红灯亮维持30秒。

南北绿灯亮维持25秒,然后闪亮3秒后熄灭。

同时南北黄灯亮,维持2秒后熄灭,这时南北红灯亮,东西绿灯亮。

周而复始。

2、用一个按键模拟急救车到达。

急救车到达路口时,四个方向的红灯全亮,10秒钟后恢复正常显示。

3、一辆急救车正在过路口时(即四个方向全红灯10秒倒计时未结束),又来了一辆急救车,重新从10秒开始倒计时。

4、急救车过去之后(即10秒倒计时结束),路灯状态要继续急救车到达之前的状态往下运行。

5、数码管显示绿灯变红灯、红灯变绿灯以及急救车10秒钟的倒计时。

6、急救车从路口过的时候,蜂鸣器响1s停1s的循环报警。

二、proteus仿真电路图注:此图仅作为仿真使用。

实际焊接电路时,由于单片机的驱动能力较弱,所以数码管的位选、LED的控制最好加上三极管进行电流放大,否则即使能实现功能,但是LED和数码管的发光的亮度也不强。

三、C语言程序程序#include <reg51.h>#define uchar unsigned char#define uint unsigned int#define duan P0#define wei P2code uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; uchar buff[8] = {10,10,10,10,10,10,10,10};uchar weizhi = 0;uchar alarm = 0;uchar bk_TH1 = 0;uchar bk_TL1 = 0;uchar bk_cnt = 0;uchar bk_cnt_time = 0;uchar cnt_time = 0;uchar cnt = 0;uchar cnt_flash = 0;bit cnt_finish = 0;bit LED = 0;bit beef_flag = 1;sbit Er = P1^0; //东西—红灯sbit Eg = P1^1; //东西—绿灯sbit Ey = P1^2; //东西—黄灯sbit Sr = P1^3; //南北—红灯sbit Sg = P1^4; //南北—绿灯sbit Sy = P1^5; //南北—黄灯sbit beef = P1^6; //蜂鸣器void display(void);void main(void){uchar time = 0;TMOD |= 0x11;TH0 = (65536-2000)/256;TL0 = (65536-2000)%256;TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;ET1 = 1;ET0 = 1;INT0 = 1;EX0 = 1;IP |= 0x02;EA = 1;TR0 = 1;TR1 = 1;Sr = 0;Sg = 0;Sy = 0;Er = 0;Eg = 0;Ey = 0;beef = 0;buff[0] = 11;buff[1] = 11;buff[2] = 11;buff[3] = 11;buff[4] = 11;buff[5] = 11;buff[6] = 10;buff[7] = 10;while(1){while((cnt<20)&&(alarm == 0)){Sr = 1;Sg = 0;Sy = 0;Er = 0;Eg = 1;Ey = 0;time = (25-cnt);buff[7] = time%10;buff[6] = time/10;}while((cnt<23)&&(alarm == 0)){Sr = 1;Sg = 0;Sy = 0;Er = 0;Eg = LED;Ey = 0;time = (25-cnt);buff[7] = time%10;buff[6] = time/10;}while((cnt<25)&&(alarm == 0)) {Sr = 1;Sg = 0;Sy = 0;Er = 0;Eg = 0;Ey = 1;time = (25-cnt);buff[7] = time%10;buff[6] = time/10;}while((cnt<50)&&(alarm == 0)) {Sr = 0;Sg = 1;Sy = 0;Er = 1;Eg = 0;Ey = 0;time = (55-cnt);buff[7] = time%10;buff[6] = time/10;}while((cnt<53)&&(alarm == 0)) {Sr = 0;Sg = LED;Sy = 0;Er = 1;Eg = 0;Ey = 0;time = (55-cnt);buff[7] = time%10;buff[6] = time/10;}while((cnt_finish != 1)&&(alarm == 0)){Sr = 0;Sg = 0;Sy = 1;Er = 1;Eg = 0;Ey = 0;time = (55-cnt);buff[7] = time%10;buff[6] = time/10;}cnt_finish = 0;while(alarm == 1){Er = 1;Eg = 0;Ey = 0;Sr = 1;Sg = 0;Sy = 0;time = (10-cnt);buff[7] = time%10;buff[6] = time/10;if(cnt == 10){TR1 = 0;TH1 = bk_TH1;TL1 = bk_TL1;cnt = bk_cnt;cnt_time = bk_cnt_time;TR1 = 1;alarm = 0;}beef = beef_flag;}beef = 0;}}void int0(void) interrupt 0{TR1 = 0;if(alarm == 0){bk_TH1 = TH1;bk_TL1 = TL1;bk_cnt = cnt;bk_cnt_time = cnt_time;}TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;cnt = 0;cnt_time = 0;alarm = 1;TR1 = 1;}void timer0(void) interrupt 1 {TH0 = (65536-2000)/256;TL0 = (65536-2000)%256;display();}void timer1(void) interrupt 3 {TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;if(++cnt_time == 20){cnt_time = 0;cnt++;beef_flag = ~beef_flag;}if(++cnt_flash == 4){cnt_flash = 0;LED = ~LED;}if(cnt == 55){cnt = 0;cnt_finish = 1;}}void display(void){duan = 0xff;wei = (1<<weizhi);duan = tab[buff[weizhi]];if(++weizhi == 8){weizhi = 0;}}。

51单片机交通灯仿真原理

51单片机交通灯仿真原理

51单片机交通灯仿真原理引言:交通灯作为城市交通管理的重要组成部分,起到了引导车辆和行人通行的作用。

在现代社会中,交通灯的灯光变化是由电路控制实现的。

本文将以51单片机为基础,介绍交通灯仿真的原理和实现过程。

一、51单片机简介51单片机是一种常见的微控制器,具有高性能、低功耗、易编程等特点。

它广泛应用于各种电子设备中,包括交通灯控制。

二、交通灯的基本原理交通灯一般由红、黄、绿三个灯组成。

红灯表示停车,黄灯表示准备行驶,绿灯表示可以通行。

交通灯的变化是按照一定的时间间隔来进行的,通常为红灯亮一段时间,然后黄灯亮一段时间,最后绿灯亮一段时间。

这种变化方式可以通过51单片机的定时器和IO口控制来实现。

三、交通灯仿真的实现步骤1. 硬件连接需要准备一块51单片机开发板,以及红、黄、绿三个LED灯。

将LED灯连接到51单片机的IO口上,通过电阻限流,确保电流合适。

2. 程序编写使用C语言编写程序,实现交通灯的仿真。

首先,需要定义红、黄、绿三个灯对应的IO口。

然后,设置定时器,按照一定的时间间隔来改变灯的状态。

例如,红灯亮5秒,黄灯亮2秒,绿灯亮8秒。

通过循环控制,可以实现交通灯的循环变化。

3. 烧录程序将编写好的程序通过烧录器下载到51单片机中。

确保烧录成功后,即可进行交通灯仿真。

4. 仿真测试将51单片机开发板连接到电源,打开电源开关。

此时,红灯应亮起,表示停车;随后黄灯亮起,表示准备行驶;最后绿灯亮起,表示可以通行。

通过不断循环,交通灯的状态会一直变化,实现仿真效果。

四、交通灯仿真的应用价值交通灯仿真是对交通灯控制的一种模拟,可以用于交通管理系统的设计和优化。

通过仿真实验,可以模拟不同情况下交通灯的变化,优化交通流量,提高交通效率。

此外,交通灯仿真还可以用于交通安全教育,让行人和驾驶员更好地理解交通灯的意义和规则。

五、总结本文以51单片机为基础,介绍了交通灯仿真的原理和实现过程。

通过硬件连接、程序编写、烧录和测试等步骤,可以实现交通灯的仿真效果。

基于51单片机的交通信号灯系统工作过程

基于51单片机的交通信号灯系统工作过程

基于51单片机的交通信号灯系统工作过程下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!交通信号灯系统在城市交通中起着至关重要的作用,它能够有效地指挥车辆和行人的通行,保障交通的顺畅和安全。

基于51单片机的交通信号灯模拟控制系统设计整理资料

基于51单片机的交通信号灯模拟控制系统设计整理资料
关键词:AT89C51 单片机 Keil 单片机编译软件 仿真软件 Proteus 6 C
语言 交通灯
XXXXX 学院毕业设计
XXXXX 学院毕业设计(论文)指导记录表
学生姓 名 系 别
指导教 师
课题名 称
XXX
学号
XXXXXXXXXXX
自动化工程工程系
专业班级 xxx 级机电一体化 X 班
XXX
技术职务
基于 51 单片机设计交通信号灯模拟控制系统
第一次 指导情

XXXXX 学院毕业设计
指导教师签字:



第二次 指导情


指导教师签字:


XXXXX 学院毕业设计
注:指导情况须填明学生在毕业设计(论文)撰写过程中存在的问题,指导 教师要求修改的内容或改进措施。指导情况填写不包括下达任务书和开题报 告意见。
XXXXX 学院毕业设计
XXXX 学院 毕业设计(论文)
课题名称 交通信号灯模拟控制系统
学生姓名
XXX
学号
XXXXXXXXXXXXX
系别
自动化工程系
专业班级
机电一体化 X 班
指导教师
XX
技术职务
讲师
XXXXXX 学院教务处制
XXXXX 学院毕业设计
XXXXX 学院毕业设计(论文)任务书
学生姓名
XXX
关 2)有必要的程序流程图与单片机系统设计
要 3)上位机程序的编写或规划 求 4)要求格式正确,模块完整
第五学期 第2周
学生完成设计开题报告
第五学期 学生完成毕业设计初稿,指导教师给予修改
进 第 3-5 周 建议。

基于51单片机的模拟交通灯课程设计报告

基于51单片机的模拟交通灯课程设计报告

模拟交通灯控制系统的设计一、功能要求利用红、绿、黄三种不同颜色的LED显示不同的通行情况,利用2个数码管进行1秒倒计时显示,最大定时时间为90秒;要求LED点亮时间和倒计时时间准确;完成单片机最小系统及其扩展设计,焊接电路板,组成功能完整的样机。

模拟实际交通灯控制系统功能,完成控制软件的编写与调试。

二、方案论证采用标准AT89C51单片机作为控制器;东、西、南、北各方向通行倒计时显示采用2位LED数码管,LED显示采用直接驱动方式;模拟交通信号灯采用直径为ψ5mm的圆形发光二极管;紧急车辆通行采用实时中断完成;通过蜂鸣器实现盲人提示功能。

按以上系统构架设计,单片机端口资源刚好满足要求,该系统设计方便,电路简单。

三、系统硬件电路的设计整套电路系统由控制系统模块、通行灯控制显示模块、时间显示模块、特种车辆通行控制模块和盲人提示电路模块等组成。

1、主控制系统主控制器采用AT89C51单片机的P1.0~P1.5脚用于控制东西及南北方向的通行灯,P1.6脚用于控制盲人提示电路;P0口及P2 口用于4组2位LED计时器的控制;特种车辆通过时使用外部中断0口(P3.2).5、盲人提示电路模块道口控制系统设计中也考虑到了方便盲人过人行道的声音提示电路,采用蜂鸣器作为声括信号灯提示、数码管倒计时显示、盲人提示功能和紧急车辆通行功能等)。

1、初始化程序初始化程序主要包括声明IO口的连接对象、声明7段LED数码管驱动信号数组、声明基本变量、定义无返回函数(延时函数)。

2、主程序主程序主要负责总体程序管理功能,实现信号灯显示与数码管倒计时显示,以及蜂鸣器提示和特种车通行提示。

主程序流程图如下子程序流程图如下状态1状态2状态4 状态5五、调试及性能分析1、硬件部分首先应用Proteus软件对电路原理图进行检查,检查无误后进行焊接,焊接结束后利用万用表检查线路是否为通路。

2、软件部分首先应用keil u4软件对程序进行编译和调试,调试成功后,利用Proteus 软件进行在线仿真,经过对程序多次地修改后,仿真效果达到了预期的要求。

基于51单片机的交通信号灯模拟控制系统

基于51单片机的交通信号灯模拟控制系统

基于51单片机的交通信号灯模拟控制系统一、实验目的和要求1.掌握单片机基本资源使用。

2.掌握单片机电路原理图绘制和仿真。

3.掌握单片机C语言软件开发以及联合仿真。

二、实验内容和原理实验内容:1.根据题目绘制单片机电路原理图。

2.绘制程序流程图并编写C语言程序3.在仿真程序中进行联合仿真,最后提交实验报告三、主要仪器设备keilC,proteus。

四、操作方法与实验步骤4.1 题目要求用单片机设计一个十字路口交通灯模拟控制系统,要求东西、南北两个方向都通行20秒,警告3秒,禁止20秒,同时要考虑到东西、南北两个方向出现异常情况,出现异常情况器该方向通行60秒。

4.2 系统设计思路南北的绿红黄发光二极管与单片机AT89C51单片机的P1.0,P1.1,P1.2相连。

东西的绿红黄发光二极管与单片机AT89C51单片机的P1.4,P1.5,P1.6相连。

改变单片机P1口编码控制交通灯。

控制过程中会出现两种异常情况用外中断0和外中断1处理。

时间单位采用500ms信号,由定时/计数器0定时50ms,循环10次产生,定时/计数器0采用查询方式,主程序中设定定时/计数器0的工作方式:方式1。

4.2 电路图绘制(包含详细的参数选定文字和图像叙述)C1=1nF,C2=1nF,C3=1nF,R1=300,R2=300,R3=300,R4=300,R5=300,R6=300,R7=300,R8=300,R9=300,R10=300,R11=300,R12=300,R13=3004.3 C程序编制(包含详细的文字和程序流程图)4.3 仿真分析(包含文字和图像叙述)东西绿灯,南北红灯东西黄灯,南北红灯南北绿灯,东西红灯南北黄灯,东西红灯东西发生异常时,东西通行,南北禁止,东西方向绿灯闪,南北方向红灯闪南北发生异常时,南北通行,东西禁止,南北方向绿灯闪,东西方向红灯闪五、讨论和心得(不少于100字)通过这次对交通灯信号的模拟,了解了交通灯4种正常状态,2种异常状态,它们分别是:状态1,东西方向绿灯,南北方向红灯20秒。

基于51单片机的交通灯设计

基于51单片机的交通灯设计

基于51单片机的交通灯设计交通信号灯是指示人和交通工具在道路交通中行进方向或行为的一种交通设施。

在设计交通信号灯时,应考虑交通流量、车辆速度、交叉口结构等因素,以确保交通的顺畅和安全。

本文将基于51单片机设计一种交通信号灯系统,并详细介绍其原理和实现方法。

交通信号灯系统的设计目的是通过控制红、黄、绿三种不同颜色的灯,指示车辆和行人在交通路口安全行驶。

在单片机设计中,我们将使用三个LED灯分别代表红、黄、绿三种状态。

通过控制LED的亮灭,来实现交通信号灯的变换。

首先,我们需要选择适当的硬件设备进行交通信号灯的设计。

在51单片机设计中,可以选择STC89C51或者AT89C51等型号的单片机。

此外,还需要准备三个LED灯、电阻、电容、按键等器件。

接下来,我们将进行电路设计。

在设计电路时,首先将三个LED灯连接到单片机的三个IO口上,每个IO口通过一个电阻与正极连接,负极与GND连接。

此外,在单片机的一个IO口上连接一个按键,通过按下按键触发程序的执行。

在编写程序之前,首先需要确立交通信号灯的运行逻辑。

一般而言,交通信号灯的运行逻辑如下:1.全红状态:所有车辆和行人均停止,任何方向都不可行驶。

2.绿灯状态:一些方向的车辆和行人可以行驶,其他方向均不可行驶。

3.黄灯状态:信号灯将要变成红灯或绿灯,此时车辆和行人应注意刹车或等待。

接下来,我们将编写程序并烧录到单片机中。

在程序中,需要使用到定时器和中断来进行交通信号灯的控制。

具体步骤如下:1.在程序中定义三个LED灯所对应的IO口。

2.初始化定时器,并设置定时时间,用于控制信号灯的变化。

3.设置中断,用于按键的检测和处理。

4.在主循环中,不断检测按键状态,当按键按下时,切换信号灯的状态。

5.根据信号灯的状态,控制LED灯的亮灭。

在程序设计中,应充分考虑各种异常情况和执行顺序,以保证交通信号灯的正常运行。

此外,还可以增加一些辅助功能,如倒计时显示等,以提高交通信号灯的可视性和安全性。

《单片机原理及应用》基于51单片机的交通信号灯模拟控制系统实验

《单片机原理及应用》基于51单片机的交通信号灯模拟控制系统实验

《单片机原理及应用》基于51单片机的交通信号灯模拟控制系统实验交通信号灯是城市交通管理中常见的一种交通管理设施。

它通过控制不同方向的红绿黄灯亮灭时间来指示不同方向的车辆和行人通行状态,有效地维护交通秩序和保障交通安全。

本实验基于51单片机,通过模拟控制系统实现交通信号灯的控制,以深入理解单片机原理及应用。

首先,我们需要明确实验的目标和要求。

通过本实验,我们可以掌握以下内容:1.掌握51单片机的基本工作原理和硬件结构;2.熟悉51单片机的编程语言和编程环境;3.理解交通信号灯的工作原理和设计要求;4.掌握基于51单片机的交通信号灯控制系统的设计和实现。

本实验的主要设备和材料包括:51单片机开发板、交通信号灯模拟电路、继电器、电压稳压模块、LED等。

实验步骤如下:1.搭建交通信号灯的模拟电路。

根据交通信号灯的工作原理,将LED 灯分别连接到单片机的不同IO口上,并通过继电器和电压稳压模块控制电路的通断,以实现红、黄、绿三个灯的交替亮灭。

2.编写单片机的控制程序。

根据交通信号灯的工作模式,编写单片机的控制程序,通过控制不同IO口的电平状态,实现红、黄、绿三个灯的控制。

程序中需要设置不同灯的时间参数和控制逻辑,确保交通信号灯能够按照预定的时间间隔进行工作。

3.上传程序到单片机。

将编写好的单片机控制程序通过编程器上传到单片机上,使得单片机能够执行相应的控制逻辑。

4.调试和测试。

将交通信号灯模拟电路的电源插入电源插座,观察LED灯的亮灭情况,并根据设定的时间参数检查交通信号灯是否按照预期工作。

如有需要,可以通过修改程序中的参数,调整交通信号灯的控制逻辑。

5.实验总结。

在实验完成后,我们应该对实验结果进行总结和分析,检查实验是否达到预期的目标和要求。

同时,我们还可以对实验中遇到的问题和解决方法进行总结,为今后的实验和应用提供借鉴。

通过这个实验,我们可以深入了解51单片机的原理和应用,并在实践中掌握交通信号灯的控制方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《单片机实验》设计报告交通信号灯模拟系统设计交通信号灯模拟系统设计摘要:本系统以单片机为核心,主要应用单片机中定时器计数器,IO接口,中断系统等,结合8279键盘控制电路,数码管显示以及LED灯实现对十字路口交通信号灯的智能控制。

成功实现了利用单片机的定时器定时,令十字路口的红绿灯交替点亮和熄灭,通过按键对红绿灯点亮和熄灭时间进行调整及设置以及对红绿灯点亮和熄灭时间进行倒计时时间显示等基本功能。

并在此基础上进一步扩展,实现了对某些特殊功能的操作,如:突发紧急情况,所有路线全部红灯,或南北向(主干道)强制绿灯通行,以及东西向(次干道)强制绿灯等,并且可在交通高峰期(系统默认上午7:00-8:00,下午17:00-18:00)自动修改绿灯时间。

系统功能完善,可操控性好,代码通俗易懂。

关键字:51单片机交通信号灯智能控制 8279主要功能:分析题目可知,有两种方案设计的方法,也即两条不同的主干分别对应不同的方案,方案一以键盘控制为主干,穿插对系统时钟的检测,倒计时的检测等,系统主干为循环检测键盘是否被按下并作出相应操作。

方案二以交通信号灯不同的点亮与熄灭状态为主干,即系统的主干是交通灯状态的循环,在循环中检测按键并作出相应调整。

此次试验选择的是方案二,因为对方案一的代码实现比较复杂。

信号灯的状态依次为:南北绿灯,东西红灯->南北黄灯,东西红灯->南北红灯,东西绿灯->南北红灯,东西黄灯。

解决这部分问题的关键在于8279键盘扫描和相应的数码管显示,在实验帮助里有详细代码,另一个难点在于内置时钟和倒计时显示,这一部分内容通过使用单片机内的定时器能很好的解决,实验帮助五有详细的代码,通过定时器T1产生中断来定时,从而完成一秒的时间。

具体详见附录代码。

设计的主要内容:第一部分,系统开机界面,设置及人机互动的按键控制,流程图如下:(相应的功能流程图中已给出)第二部分,系统主干部分,即交通信号灯4个大循环以及循环内部检测按键完成拓展功能的实现,在循环内检测按键,实现相应功能,流程如下:具体细节,例如定时器的设计等在纸质档报告中有详细分析,在这里就不赘述总结:总的来说这次试验比较成功,题目要求的功能基本都实现了,对于单片机汇编程序语言的理解也更深刻了,课本上的知识比较分散,每部分之间都没有什么联系,通过实验很好的把各部分之间联系起来,加深记忆,更便于理解。

唯一不足的是对于题目的考虑不周,特殊功能采用键盘扫描子程序解决了,而没有采用终端,使得程序应激性不好,没有很好的应变性。

在以后的编程中会注意这方面的内容。

附录:(详细代码);-------------------------------------------------------Z8279 EQU 0FF82H ;8279 状态/命令口地址D8279 EQU 0FF80H ;8279 数据口地址LEDMOD EQU 00H ;左边输入八位字符显示;外部译码键扫描方式,双键互锁LEDFEQ EQU 2FH ;扫描速率LEDCLS EQU 0C1H ;清除显示 RAMLEDWR0 EQU 80H ;设定的将要写入的显示RAM地址READKB EQU 40H ;读 FIFO RAM 地址 0 的命令字;-------------------------------------------------------ORG 0000HAJMP STARTORG 001BH ;INT T1 入口地址AJMP INT_T1ORG 0040HSTART:MOV SP,#60HLCALL INIT8279 ;初始化8279MOV R3,#0H ;时MOV R2,#0H ;分MOV R1,#0H ;秒MOV R7,#0H ;倒计时时间MOV R0,#20 ;50毫秒MOV 40H,#0 ;用于改变主次干道时长比MOV R6,#0FFH ;标志MOV TMOD,#10HMOV TL1,#00H ;50毫秒的时间常数MOV TH1,#4CHSETB EX0SETB ET1SETB EA ;允许中断; 初始状态,全红灯MOV DPTR,#8300HMOV A,#0FHMOVX @DPTR,A; 键盘操作WAIT:LCALL GETKEY ;读键盘CJNE A,#0FFH,CONT ;判断是否有键输入MOV A,BCJNE A,#3CH,KEY_C ;输入键是'C',转CLEAR_T LCALL CLEAR_TKEY_C:CJNE A,#3AH,KEY_A ;输入键是'A',转START_T LCALL START_TKEY_A:CJNE A,#3DH,KEY_D ;输入键是'D',转STOP_T LCALL STOP_TKEY_D:CJNE A,#3BH,KEY_E ;输入键是'B',转SET_T LCALL SET_T ;设置系统时间KEY_E:CJNE A,#3FH,KEY_B ;输入键是'F',转SET_COUTLCALL SET_COUT ;设置倒计时间KEY_B:CJNE A,#3EH,CONT ;输入键是'E',转MONITOR AJMP MONITORCONT:CJNE R6,#0FFH,WAIT;若无秒标志则循环LCALL DISPLAY ;显示时间MOV R6,#0 ;清标志SJMP WAIT ;循环MONITOR:NOPSJMP $ ;等待回到监控;按键对应的功能CLEAR_T: ;时间清零子程序CLR TR1 ;关计数器MOV R3,#0H ;小时清零MOV R2,#0H ;分钟清零MOV R1,#0H ;秒清零MOV R0,#20 ;10毫秒清零MOV R7,#0H ;倒计时时间清零MOV R6,#0FFH ;置秒标志RETSTART_T: ;电子钟计时子程序;程序主要部分;程序开始执行后将循环在这部分CIRCLE:LCALL STATION1 ;南北绿灯,东西红灯LCALL STATION2 ;南北绿灯闪转黄灯,东西红灯 LCALL STATION3 ;南北红灯,东西绿灯LCALL STATION4 ;南北红灯,东西绿灯闪转黄灯 LJMP CIRCLERET;STATION1STATION1: ;南北绿灯,东西红灯MOV R7,30HMOV A,R7ADD A,40HMOV R7,AMOV DPTR,#8300HMOV A,#96H ;南北绿灯,东西红灯SETB TR1; 扫描键盘WO1: LCALL GETKEY ;读键盘CJNE A,#0FFH,JB1 ;判断是否有键输入MOV A,BCJNE A,#3FH,PUSHB1 ;若是按下F,则清零并且返回MOV R4,#1LCALL GETWORD ;读倒计时时间数MOV A,BMOV B,#10DIV ABSWAP AADD A,BMOV R7,A ;保存输入的值INC AMOV 30H,ALCALL DISPLAY ;显示时间PUSHB1:CJNE A,#3BH,PUSHC1 ;若是按下B,则清零并且返回WAIT CLR TR1 ;关计数器MOV R3,#0H ;小时清零MOV R2,#0H ;分钟清零MOV R1,#0H ;秒清零MOV R0,#20 ;10毫秒清零MOV R7,#0H ;倒计时时间清零MOV R6,#0FFH ;置秒标志AJMP WAITPUSHC1:CJNE A,#3CH,PUSHD1MOV R7,#3 ;若按下C,输出3秒红灯MOV DPTR,#8300HMOV A,#0FHMOVX @DPTR,APUSHD1:CJNE A,#3DH,PUSHE1 ;若按下D,南北绿灯5秒MOV R7,#5MOV A,#96HMOVX @DPTR,APUSHE1:CJNE A,#3EH,JB1MOV R7,#5MOVX @DPTR,AJB1: CJNE R7,#0H,WO1RET;STATION2STATION2:MOV R7,#3MOV DPTR,#8300HMOV A,#06HMOVX @DPTR,ASETB TR1WO2: LCALL GETKEY ;读键盘CJNE A,#0FFH,JB2 ;判断是否有键输入MOV A,BCJNE A,#3FH,PUSHB2 ;若是按下F,则清零并且返回MOV R4,#1LCALL GETWORD ;读倒计时时间数MOV A,BMOV B,#10DIV ABSWAP AADD A,BMOV R7,A ;保存输入的值INC AMOV 30H,ALCALL DISPLAY ;显示时间PUSHB2:CJNE A,#3BH,PUSHC2 ;若是按下B,则清零并且返回WAIT CLR TR1 ;关计数器MOV R3,#0H ;小时清零MOV R2,#0H ;分钟清零MOV R1,#0H ;秒清零MOV R0,#20 ;10毫秒清零MOV R7,#0H ;倒计时时间清零MOV R6,#0FFH ;置秒标志AJMP WAITPUSHC2:CJNE A,#3CH,PUSHD2MOV R7,#3 ;若按下C,输出3秒红灯MOV DPTR,#8300HMOV A,#0FHMOVX @DPTR,APUSHD2: CJNE A,#3DH,PUSHE2 ;若按下D,南北绿灯5秒MOV R7,#5MOV A,#96HMOVX @DPTR,APUSHE2: CJNE A,#3EH,JB2MOV R7,#5MOV A,#69HMOVX @DPTR,AJB2: CJNE R7,#0H,WO2RET;STATION3STATION3: ;南北红灯,东西绿灯MOV R7,30HMOV DPTR,#8300HMOV A,#69HMOVX @DPTR,ASETB TR1WO3: LCALL GETKEY ;读键盘CJNE A,#0FFH,JB3 ;判断是否有键输入MOV A,BCJNE A,#3FH,PUSHB3 ;若是按下F,则清零并且返回MOV R4,#1LCALL GETWORD ;读倒计时时间数MOV A,BMOV B,#10DIV ABSWAP AADD A,BMOV R7,A ;保存输入的值INC AMOV 30H,ALCALL DISPLAY ;显示时间PUSHB3:CJNE A,#3BH,PUSHC3 ;若是按下B,则清零并且返回WAIT CLR TR1 ;关计数器MOV R3,#0H ;小时清零MOV R2,#0H ;分钟清零MOV R1,#0H ;秒清零MOV R0,#20 ;10毫秒清零MOV R7,#0H ;倒计时时间清零MOV R6,#0FFH ;置秒标志AJMP WAITPUSHC3:CJNE A,#3CH,PUSHD3MOV R7,#3 ;若按下C,输出3秒红灯MOV DPTR,#8300HMOV A,#0FHMOVX @DPTR,APUSHD3: CJNE A,#3DH,PUSHE3 ;若按下D,南北绿灯5秒MOV R7,#5MOV A,#96HMOVX @DPTR,APUSHE3: CJNE A,#3EH,JB3MOV R7,#5MOV A,#69HMOVX @DPTR,AJB3: CJNE R7,#0H,WO3RET;STATION4STATION4:MOV R7,#3MOV DPTR,#8300HMOV A,#09HMOVX @DPTR,ASETB TR1WO4: LCALL GETKEY ;读键盘CJNE A,#0FFH,JB4 ;判断是否有键输入MOV A,BCJNE A,#3FH,PUSHB4 ;若是按下F,则清零并且返回MOV R4,#1LCALL GETWORD ;读倒计时时间数MOV A,BMOV B,#10DIV ABSWAP AADD A,BMOV R7,A ;保存输入的值INC AMOV 30H,ALCALL DISPLAY ;显示时间PUSHB4:CJNE A,#3BH,PUSHC4 ;若是按下B,则清零并且返回WAIT CLR TR1 ;关计数器MOV R3,#0H ;小时清零MOV R2,#0H ;分钟清零MOV R1,#0H ;秒清零MOV R0,#20 ;10毫秒清零MOV R7,#0H ;倒计时时间清零MOV R6,#0FFH ;置秒标志AJMP WAITPUSHC4:CJNE A,#3CH,PUSHD4MOV R7,#3 ;若按下C,输出3秒红灯MOV DPTR,#8300HMOV A,#0FHMOVX @DPTR,APUSHD4: CJNE A,#3DH,PUSHE4 ;若按下D,南北绿灯5秒 MOV R7,#5MOV A,#96HMOVX @DPTR,APUSHE4: CJNE A,#3EH,JB4MOV R7,#5MOV A,#69HMOVX @DPTR,AJB4: CJNE R7,#0H,WO4RET;电子钟停止的部分STOP_T: ;电子钟停止计时子程序CLR TR1RET;时钟设置部分SET_T: ;设置初值子程序CLR TR1 ;关计数器MOV R4,#7LCALL GETWORD ;读小时数CJNE A,#0FFH,INVALID ;判断输入合法性MOV A,BADD A,#232JC INVALID ;判断输入小时值 < 24MOV A,BMOV B,#10DIV ABSWAP AADD A,BMOV R3,A ;保存输入的值MOV R4,#5LCALL GETWORD ;读分钟数CJNE A,#0FFH,INVALID ;判断输入合法性MOV A,BADD A,#196JC INVALID ;判断输入分钟数 < 60 MOV A,BMOV B,#10DIV ABSWAP AADD A,BMOV R2,A ;保存输入的值MOV R4,#3LCALL GETWORD ;读秒钟数CJNE A,#0FFH,INVALID ;判断输入合法性MOV A,BADD A,#196JC INVALID ;判断输入分钟值 < 60 MOV A,BMOV B,#10DIV ABSWAP AADD A,BMOV R1,A ;保存输入的值AJMP SET_TOKSET_COUT:MOV R4,#1LCALL GETWORD ;读倒计时时间数CJNE A,#0FFH,INVALID ;判断输入合法性MOV A,BMOV B,#10DIV ABSWAP AADD A,BMOV R7,A ;保存输入的值INC AMOV 30H,AAJMP SET_TOKINVALID:LCALL CLEAR_T ;时间清零SET_TOK:LCALL DISPLAY ;显示时间RET;读取输入按键的部分GETWORD: ;读数子程序WKEY1:LCALL GETKEY ;读键盘CJNE A,#0FFH,WKEY1;无键输入,则再读MOV A,BADD A,#0C6HJC ERROR1 ;判断输入是否大于9 MOV A,BSUBB A,#30HJC ERROR1 ;判断输入是否小于0MOV R5,ALCALL DISLED ;显示输入的字符MOV B,#10MUL ABPUSH ACC ;保存输入的值WKEY2:LCALL GETKEY ;读键盘CJNE A,#0FFH,WKEY2;无键输入则再读MOV A,BADD A,#0C6H ;判断输入是否大于9 JC ERROR2MOV A,BSUBB A,#30H ;判断输入是否小于0 JC ERROR2DEC R4MOV R5,ALCALL DISLED ;显示输入的字符MOV B,APOP ACCADD A,BMOV B,A ;把得到的值存在B MOV A,#0FFH ;置合法输入标志AJMP KEYOKERROR2: POP ACCERROR1: MOV A,#0 ;置非法输入标志KEYOK: RET;8279初始化INIT8279: ;8279初始化子程序PUSH DPH ;保存现场PUSH DPLPUSH ACCLCALL DELAY ;延时MOV DPTR ,#Z8279MOV A,#LEDMOD ;置8279工作方式MOVX @DPTR,AMOV A,#LEDFEQ ;置键盘扫描速率MOVX @DPTR,AMOV A,#LEDCLS ;清除 LED 显示MOVX @DPTR,APOP ACC ;恢复现场POP DPLPOP DPHRET;读取键盘子程序GETKEY:;输入: 无 ; 输出: B: 读到的键码 A: 按键的标志 PUSH DPH ;保存现场PUSH DPLPUSH PSWMOV DPTR,#Z8279MOVX A,@DPTR ;读8279状态ANL A,#07H ;屏蔽D7-D3JNZ GETVAL ;判断是否有键输入MOV A,#0H ;置标志(无键输入)SJMP NKBHITGETVAL:MOV A,#READKB ;读 FIFO RAM 命令MOVX @DPTR,AMOV DPTR,#D8279MOVX A,@DPTR ;读键ANL A,#3FH ;屏蔽 SHIFT 和 CTRL 键MOV DPTR,#KEYCODE;键码表起始地址MOVC A,@A+DPTR ;查表MOV B,A ;置返回键值MOV A,#0FFH ;置标志(有键输入)NKBHIT:POP PSW ;恢复现场POP DPLPOP DPHRET;T1定时器中断控制部分,INT_T1: ;INT_T1中断服务子程序 PUSH DPH ;保护现场PUSH DPLPUSH ACCPUSH PSWMOV TL1,#00H ;50毫秒定时常数MOV TH1,#4CHDJNZ R0,EXIT ;判断毫秒=0MOV R0,#20 ;DELAY 1 SECONDMOV R6,#0FFH ;置秒标志COUNT1: MOV A,R7ADD A,#99HDA AMOV R7,A ;减1CJNE R1,#59H,SECOND;判断秒=59MOV R1,#99HCJNE R2,#59H,MINUTE;判断分=59MOV R2,#99HCJNE R3,#23H,HOUR ;判断时=23MOV R3,#99HHOUR:MOV A,R3ADD A,#1 ;时加1DA AMOV R3,AMINUTE:MOV A,R2ADD A,#1 ;分加1DA AMOV R2,ASECOND:MOV A,R1ADD A,#1 ;秒加1DA AMOV R1,A;判断是否到了特定时间7~8,17~18点CJNE R3,#7,EXIT1MOV 40H,#5CJNE R3,#00010111B,EXIT1MOV 40H,#5SJMP SHOWTEXIT1: MOV 40H,#0SHOWT: CJNE R6,#0FFH,EXIT;若无秒标志则循环LCALL DISPLAY ;显示时间MOV R6,#0 ;清标志EXIT:POP PSW ;恢复现场POP ACCPOP DPLPOP DPHRETI ;中断返回;实验帮助11延时部分,不太清楚具体功能是什么,可能是键盘消抖DELAY: ;延时子程序PUSH 0 ;保存现场PUSH 1MOV 0,#0HDELAY1:MOV 1,#0HDJNZ 1,$DJNZ 0,DELAY1POP 1 ;恢复现场POP 0RET;显示控制部分,但不是具体显示部分DISPLAY:MOV A,R3ANL A,#0FHADD A,#10HMOV R5,AMOV R4,#6LCALL DISLED ;显示小时低位MOV A,R3SWAP AANL A,#0FHMOV R5,AMOV R4,#7LCALL DISLED ;显示小时高位MOV A,R2ADD A,#10HMOV R5,AMOV R4,#4LCALL DISLED ;显示分钟低位MOV A,R2SWAP AANL A,#0FHMOV R5,AMOV R4,#5LCALL DISLED ;显示分钟高位MOV A,R1ANL A,#0FHADD A,#10HMOV R5,AMOV R4,#2LCALL DISLED ;显示秒低位MOV A,R1SWAP AANL A,#0FHMOV R5,AMOV R4,#3LCALL DISLED ;显示倒计时高位MOV A,R7ANL A,#0FHADD A,#10HMOV R5,AMOV R4,#0LCALL DISLED ;显示倒计时低位MOV A,R7SWAP AANL A,#0FHMOV R5,AMOV R4,#1LCALL DISLEDRET;显示部分DISLED: ;显示字符子程序;输入: R4,位置 R5,值 PUSH DPH ;保存现场PUSH DPLMOV A,#LEDWR0 ;置显示起始地址ADD A,R4 ;加位置偏移量MOV DPTR,#Z8279MOVX @DPTR,A ;设定显示位置MOV DPTR,#LEDSEG ;置显示常数表起始位置MOV A,R5MOVC A,@A+DPTR ;查表MOV DPTR,#D8279MOVX @DPTR,A ;显示数据POP ACC ;恢复现场POP DPLPOP DPHRET;LED显示常数表LEDSEG:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,087H ;'0.,1.,2.,3.,4.,5.,6.,7.' DB 0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1H ;'8.,9.,A.,B.,C.,D.,E.,F.' DB 6DH,02H,08H,00H,59H,0FH,76H ;'U,-,_, ,I,O,P, ';键盘键码表KEYCODE:DB 30H,31H,32H,33H,34H,35H,36H,37H ;'0,1,2,3,4,5,6,7'DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH ;'8,9,A,B,C,D,E,F'END【返回】。

相关文档
最新文档