51单片机系统实验报告--计数器、交通灯
基于51单片机控制交通灯课程设计报告

基于51单片机控制交通灯课程设计报告本设计课程使用STC89c52型号的芯片及相关元器件自己组装单片机最小系统,并编写程序用于控制交通信号灯。
1.STC89c52的芯片元器件的说明:STC89c52内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
此外,STC89c52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。
在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。
掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能,STC89c52在众多嵌入式控制应用系统中得到广泛应用。
2.STC89c52的功能是:·标准MCS-51内核和指令系统·片内8kROM(可扩充64kB外部存储器)· 32个双向I/O口· 256x8bit内部RAM(可扩充64kB外部存储器)· 3个16位可编程定时/计数器·时钟频率3.5-12/24/33MHz·向上或向下定时计数器·改进型快速编程脉冲算法· 6个中断源· 5.0V工作电压·全双工串行通信口·布尔处理器—帧错误侦测· 4层优先级中断结构—自动地址识别·兼容TTL和CMOS逻辑电平·空闲和掉电节省模式· PDIP(40)和PLCC(44)封装形式3.管脚说明VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
基于51单片机设计的交通灯报告书

报告书干路—支路口交通信号灯控制器项目目的:通过对模拟交通灯控制系统的操作,让我们掌握定时器和中断系统的综合应用,进一步熟练51单片机的应用.项目要求:本项目主要通过感应开关控制交通灯的切换显示,实现主干路与支路车辆的分流。
(1)在正常情况下,主干道交通灯绿灯一直亮着。
(2)当支路检测到有车辆,60秒后,主干道禁止通行,支路放行。
(3)支路放行30 秒后,恢复正常情况。
项目电路如图:按键S1、S2模拟支路的车辆检测,当S1、S2为高电平(不按下按键)时,表示正常情况。
当S1或S2为低电平(按下按键)时,表示支路上有车辆,将S1、S2接到P3.0、P3.1把信号送入到单片机。
程序设计:源程序代码:#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar time,second,n,m;sbit k1=P3^0;sbit k2=P3^1;Uchar code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x 80,0x90};//数码管显示0~9的段码表void delay(uint t){uchar i;while(t--)for(i=0;i<255;i++);}void shumaguan(uchar s){P2=0xfd;P0=Tab[s/10];delay(1);P2=0xfe;P0=Tab[s%10];delay(1);}void main(){IE=0x82;TMOD=0x01;TH0=(65536-50000)/16;TL0=(65536-50000)%16;while(1){ uchar j;P1=0xde;if(k1==0||k2==0){delay(500);if(k1==0||k2==0){time=40;TR0=1;for(second=60;second>0;)shumaguan(second);TR0=0;P2=0x00;P1=0xf3;delay(3000);for(j=0;j<2;j++){P1=0xfb;delay(200);P1=0xf3;delay(200);}P1=0xeb;delay(500);}}}}void ld() interrupt 1{TR0=0;time--;if(time==0){time=40;second--;if(second==5)P1=0xdf;if(second==4)P1=0xde;if(second==3)P1=0xdf;if(second==2)P1=0xdd;if(second==1)P1=0xdd;}TH0=(65536-50000)/16;TL0=(65536-50000)%16;TR0=1;}项目小结:本项目程序主要包括四部分:主函数、延时函数、数码管显示函数、中断函数。
基于51单片机交通灯工程实践方案报告书

《工程实践》设计方案报告基于单片机的交通灯控制系统设计题目主要研究思路和方法:一,研究方案本项目计划实现的基本目标是:利用单片机作为主要控制系统,模拟出东西方向为主干道十字路口交通灯控制系统。
二,重点解决问题1. 本项目要求可实现可手动设定交通灯亮灭交换所需时长,并且该灯亮时间倒计时用数码管显示。
2. 模拟遭遇突发情况的时候,可手动实现红灯全亮,禁行任何方向的车辆。
3. 由于本项目是模拟东西主干道的十字路口交通灯系统,故要求须包含左转灯,并且可实现右转灯长绿灯。
三. 技术路线1. 本项目由于是单片机作为主控系统,故要求我们熟练掌握单片机编程知识。
2. 本系统由显示电路(包含LED灯倒计时及发光二极管模拟交通灯),单片机主控制电路,按键和电源电路组成,需熟悉自动控制原理。
3. 将紧急情况红灯全亮写成程序编入单片机。
4. 该系统采用+5V直流稳压电源供电工作。
5.显示界面4个路口采用8个共阴极数码管,采用74LS48芯片驱动电路驱动LED晶体管显示部分。
系统原理框图和工作原理:具体:先东西双向直行和左转都是红灯,直行红灯长亮45秒,红灯亮时开始倒计时,剩5秒时开始闪烁(共计红灯亮50秒);接着左转还是红灯,东西双向直行灯长亮绿灯57秒,绿灯亮时倒计时,剩3秒时闪烁(共计绿灯亮60秒,在此期间其余全部红灯);然后5秒黄灯倒计时(不闪烁);然后东西左转绿灯亮时开始倒计时,剩3秒时闪烁(共计13秒),接着黄灯5秒倒计时(不闪烁),直行灯亮红色。
然后东西双向直行与左转又是红灯依次循环(灯亮情况南北直行方向与东西直行方向相反)。
具体对应情况如下主干道亮灭情况及时长:东西 南北左转灯 直行灯 左转灯 直行灯1.红 红(35) 1.红 绿(27)2. 红 绿闪(3)红 黄(5)3.红 红(7) 3.绿(7) 红4.红 红(3) 4.绿闪(3) 红5.红 红(5) 5.黄(5) 红6.红 绿(57) 6.红 红(65)7.红 绿闪(3)8.红 黄(5)9.绿(7) 红 9.红 红(10)10.绿闪(3)红 10.红 红(5)11.黄(5) 红12.红 红(35) 12.红 绿(32)东西方向为主干道;南北为辅干道。
51单片机实验报告(共五则)

51单片机实验报告(共五则)第一篇:51单片机实验报告51单片机实验报告实验一点亮流水灯实验现象 Led灯交替亮,间隔大约10ms。
实验代码#include 〈reg51、h> void Delay10ms(unsigned int c);voidmain(){)1(elihwﻩ{ ﻩP0= 0x00;Delay10ms(50);;ffx0 =0Pﻩﻩ;)05(sm01yaleDﻩ } } void Delay10ms(unsigned int c){unsigned char a,b;for(;c>0;c-—){)——b;0〉b;83=b(rofﻩ{ ﻩﻩfor(a=130;a〉0;a--);}ﻩﻩ}} 实验原理W W hi i le(1)表示一直循环。
循环体内首先将P0 得所有位都置于零,然后延时约5 5 0*10=500ms,接着 0 P0 位全置于 1 1,于就是 D LED 全亮了。
接着循环,直至关掉电源..延迟函数就是通过多个for r 循环实现得。
实验 2 流水灯(不运用库函数)实验现象起初 led 只有最右面得那一个不亮,半秒之后从右数第二个led也不亮了,直到最后一个也熄灭,然后 led 除最后一个都亮,接着上述过程 #includemain(){unsigned char LED;LED = 0xfe;while(1){ ﻩ;DEL = 0PﻩDelay10ms(50);00x0 == 0P(fiﻩ {;1〈〈 DEL = DELﻩ)ﻩ;efx0 = DELﻩ} ﻩ}ﻩ} void Delay10ms(unsigned int c){unsigned char a,b;for(;c>0;c-—){)—-b;0〉b;83=b(rofﻩ{ ﻩﻩﻩ;)--a;0>a;031=a(rofﻩ} ﻩ} ﻩ} 实验原理这里运用了C语言中得位运算符, , 位运算符左移, , 初始值得二进制为1111 1 110, 之后左移一次变成1111 1 100 0,当变成00000 0000 时通过 f if 语句重置 1 1 11 1 11110、延迟函数在第一个报告已经说出了,不再多说..实验 3 流水灯(库函数版)实验现象最开始还就是最右边得一个不亮,然后不亮得灯转移到最右边得第二个,此时第一个恢复亮度,这样依次循环.实验代码#include 〈reg51、h> #include 〈intrins、h〉void Delay10ms(unsigned int c); void main(void){unsigned char LED;;EFx0 = DELﻩ)1(elihwﻩ{ ﻩP0 = LED;;)05(sm01yaleDﻩﻩ;)1,DEL(_lorc_ = DELﻩ} ﻩ} void Delay10ms(unsigned in t c){unsigned chara, b;for(;c〉0;c——){ ﻩfor(b=38;b〉0;b—-){ ﻩﻩ;)-—a;0〉a;031=a(rofﻩ} ﻩ}}实验原理利用头文件中得函数,_cro l_(,), 可以比位操作符更方便得进行 2 2 进制得移位操作, , 比位操作符优越得就是,该函数空位补全时都就是用那个移位移除得数据, , 由此比前一个例子不需要f if 语句重置操作..数码管实验实验现象单个数码管按顺序显示0-9与 A-F。
单片机c语言程序设计---C51-交通灯实验报告

单片机c语言程序设计---C51-交通灯实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称: C51-交通灯实验一、实验目的和要求1.熟悉单片机的硬件结构及其工作原理2.掌握单片机的C51编程二、实验内容和原理(1)硬件设计使用P1端口连接VD1、VD2、VD3,模拟路口东面的红、黄、绿灯;P0端口连接VD9、VD10、VD11,模拟路口西面的红、黄、绿灯;P3端口连接VD17、VD18、VD19,模拟路口南面的红、黄、绿灯;P2端口连接VD25、VD26、VD27,模拟路口北面的红、黄、绿灯。
路口红绿灯的显示规律为:①南面和北面显示红灯(即VD17和VD25为红灯)时,东面和西面显示绿灯(即VD3和VD11为绿灯)。
②南面和北面,东面和西面都变成黄灯。
③南面和北面显示绿灯,东面和西面显示红灯④南面和北面,东面和西面都变成黄灯,然后再从①进行循环(需注意:此处设置的黄灯显示时长应短于红灯或绿灯的显示时长)(2)protues仿真通过Keil编译后,利用protues软件进行仿真。
在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
三、主要仪器设备四、操作方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。
2.在keil上进行编译后生成“xxx.hex”文件。
3.编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
五、实验结果与分析void S_N(void){VD1=0;VD9=0;VD19=0;VD27=0;Delay(1000);VD1=1;VD9=1;VD19=1;VD27=1;}int main (void) {while(1){E_W();NOT();S_N();NOT();}}六、讨论和心得。
交通灯实验报告——单片机

二、用51单片机设计交通灯、彩灯控制器一、可实现功能:1)通过51单片机,在面包板上模拟交通红绿灯。
分为主干道和支干道,每条道上安装红、绿、黄三种颜色的灯,并用两位八段数码管显示主干道三种灯亮的时间,由程序控制自动循环,红灯40秒,绿灯35秒,黄灯5秒;2)用单片机的外部中断0的产生来控制六路彩灯,此处只设计了四种花型。
二、电路原理图:三、源程序如下:#include "reg51.h"#include <intrins.h>void display(unsigned int digital);void delay(unsigned int time);void colour();unsigned shu[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; Unsignedled[41]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff,0xdf,0xcf,0xc7,0xc3,0xc1,0xc0,0xc1,0xc3,0xc7,0xcf,0xdf,0xff, 0xf3,0xe1,0xc0,0xe1,0xf3,0xff,0xde,0xcc,0xc0,0xcc,0xdf,0xff, 0xdb,0xed,0xf6,0xed,0xdb,0xff,0xc0,0xff,0xc0,0xff,0xc0,0xff};sbit a=P2^6;sbit b=P2^7;sbit G=P2^0;sbit Y=P2^1;sbit R=P2^2;sbit g=P2^3;sbit y=P2^4;sbit r=P2^5;int flag=0;//全局变量,当它为1时显示彩灯,当它为0时,显示交通灯#define state_1 G=0;Y=1;R=1;g=1;y=1;r=0//主干道绿,支干道红#define state_2 G=1;Y=0;R=1;g=1;y=1;r=0//主干道黄,支干道红#define state_3 G=1;Y=1;R=0;g=0;y=1;r=1//主干道红,支干道绿#define state_4 G=1;Y=1;R=0;g=1;y=0;r=1//主干道红,支干道红void main(void){unsigned int i;EA=1; //首先开启总中断EX0=1; //开启外部中断 0IT0=1; //设置触发方式为下降沿触发while(1){while(flag==0){state_1;for(i=35;i>0;i--)delay(1);state_2;for(i=5;i>0;i--){delay(i);y1=~y1;}state_3;for(i=20;i>0;i--)delay(i);state_4;for(i=5;i>0;i--){delay(i);y2=~y2;}}while(flag==1) colour();}}//显示子程序,实现用两位数码管显示灯亮的时间void display(unsigned int digital){ unsigned int k;unsigned int ge=digital%10,shi=digital/10;//将十位与个位分离for(k=0;k<30000;k++){ a=1;b=0;P0=shu[ge];P0=0;a=0;b=1;P0=shu[shi];P0=0;}}//实现彩灯控制void colour(){ P1=0xff;P3=0x00;P2=0xff;while(1){ unsigned int j;for(j=0;j<41;j++)//循环程序演示四种花型{ P2=led[j];delay(1);} delay(5);}}//中断函数void key_scan() interrupt 0 //关键字"interrupt" ,这是C语言的中断函数表示法,,单片机有6个中断口,外部中断0的优先级最高,在程序里我们只用外部中断0 {flag++;if(flag==2) flag=0;}//延时程序void delay(unsigned int time) //参数time大小决定延时时间长短{ unsigned int j,k;time=time*5;for(j=0;j<time;j++)for(k=0;k<10000;k++);}四、源程序分析1、在电路设计时我用了共阴极八段数码管来显示时间:unsigned shu[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};数组中十个数分别表示0到9十个数;2、在设计彩灯时,我直接利用交通灯的主干道和支干道的六个灯设计彩灯:unsignedled[48]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff,0xdf,0xcf,0xc7,0xc3,0xc1,0xc0,0xc1,0xc3,0xc7,0xcf,0xdf,0xff,0xf3,0xe1,0xc0,0xe1,0xf3,0xff,0xde,0xcc,0xc0,0xcc,0xdf,0xff,0xdb,0xed,0xf6,0xed,0xdb,0xff,0xc0,0xff,0xc0,0xff,0xc0,0xff};数组中的48个数共演示了四种花型3、void display(unsigned int digital){ unsigned int k;unsigned int ge=digital%10,shi=digital/10;//将十位与个位分离for(k=0;k<30000;k++){ a=1;b=0;P0=shu[ge];P0=0;a=0;b=1;P0=shu[shi];P0=0;}}显示子程序中将时间的十位与个位分离,用a、b来选择数码管将个位与十位分时输出。
51单片机红绿灯设计报告

51单片机红绿灯设计报告一、引言红绿灯是城市道路交通管理中非常重要的设备,它能够有效地控制车辆和行人的通行,维护交通秩序,提高交通效率。
本报告将介绍一种基于51单片机的红绿灯设计,利用单片机的强大功能,实现了智能化、自动化的红绿灯控制系统。
二、设计原理1.硬件设计本设计使用了51单片机,通过其IO口控制LED灯的亮灭。
红绿灯的控制通过三个IO口分别连接到红、黄、绿三个LED灯,通过控制这三个IO口的电平,实现红绿灯的切换。
2.软件设计设计中使用了C语言进行程序开发。
程序通过设置IO口的状态和延时函数,控制红绿灯的切换和延时时间。
三、电路设计1.电路图电路图给出了51单片机、LED灯和电流限制电阻之间的连接关系。
单片机的P1口连接到红、黄、绿三个LED灯上,通过改变P1口的电平,控制LED的亮灭。
2.电路元件说明-51单片机:中央处理器,负责控制整个系统的运行和信号的处理。
-LED灯:用于显示红、黄、绿三种不同的状态。
-电流限制电阻:用于限制电流大小,保护51单片机和LED灯。
四、程序设计程序设计中,通过无限循环实现红绿灯系统的连续运行,程序中设置了红绿灯切换的时间间隔和黄灯亮灭的时间间隔。
五、实验结果经过测试,本设计能够正常地实现红绿灯的切换,各种状态都能够正确显示。
红灯亮10秒,黄灯亮3秒,绿灯亮15秒,然后循环重复。
六、总结本设计利用51单片机的强大功能,实现了红绿灯的自动切换。
通过控制IO口的电平和延时函数,能够实现红绿灯的各种状态的切换。
该设计简单、实用、可靠,适用于城市交通管理中的红绿灯设备。
51单片机交通灯设计报告

51单⽚机交通灯设计报告课程设计说明书课程名称:《单⽚机技术》设计题⽬:交通灯设计学院:电⼦信息与电⽓⼯程学院学⽣姓名:学号:专业班级:指导教师:课程设计任务书交通灯设计摘要:近年来随着科技的发展,单⽚机的应⽤正在不断深⼊,同时带动传统控制检测技术⽇益更新。
在实时检测和⾃动控制的单⽚机应⽤系统中,单⽚机往往作为⼀个核⼼部件来使⽤,仅单⽚机⽅⾯的知识是不够的,还应该根据具体硬件结构软硬结合,加以完善。
⼗字路⼝车辆穿梭,⾏⼈熙攘,车⾏车道,⼈⾏⼈道,有条不紊,那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的⾃动指挥系统。
交通信号灯控制⽅式很多。
本系统采⽤51系列单⽚机ATMEL89C51为核⼼控制器件来设计交通信号灯控制器,实现亮绿灯通⾏,亮黄灯闪烁并发声警⽰,亮红灯禁⽌通⾏的功能,并显⽰通⾏或禁⽌通⾏倒计时,紧急按键信号灯加时和紧急按键南北、东西红绿灯跳变。
本系统使⽤性强,操作简单,容易实现,扩展功能强,可⾃⾏修改程序扩展⾃⼰想要实现的功能。
关键词:交通灯,单⽚机,复位电路⽬录1. 设计背景 (1)1.1设计原因 (1)1.2个⼈意义 (1)2.设计⽅案 (1)2.1总体⽅案提出 (1)2.2稳压电源⽅案设计与分析 (1)2.3复位电路⽅案设计与分析 (2)3. ⽅案实施 (2)3.1总体设计框图 (2)3.2硬件设计 (3)3.3软件设计 (6)3.4电路仿真 (10)3.5制板⼦与安装过程 (11)3.6软硬件调试 (11)4. 结果与结论 (12)5 收获与致谢 (12)6. 参考⽂献 (12)7. 附件 (13)7.1硬件电路图 (13)7.2元器件清单 (14)7.3作品实物图 (15)7.4源程序: (16)1. 设计背景1.1设计原因随着社会的进步,交通的⾼速发展,红绿灯已经成为了我们⽣活中不可或缺的⼀部分,如今,红绿灯已经安装在各个道路的交接⼝处,已经成为疏导交通车辆最常见和最有效的⼿段。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
系统实验报告学院XXXXXXXXX专业XXXXXX姓名XXXXX学号XXXXXXX一、本设计拟实现的功能1.时钟:四只数码管低二位0~59计数后给高二位0~59计数(即分秒计时),一只按键控制开始、结束;2.交通灯:灯和数码管结合,模拟十字路口的交通灯的点亮与熄灭,数码管倒计时显示时间。
二、所用器件的功能、引脚图1.所用器件:AT89S51、74LS47、LM70852.所用器件功能、引脚图a)AT89S51AT89S51引脚图AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。
主要性能特点1、4k Bytes Flash片内程序存储器;2、128 bytes的随机存取数据存储器(RAM);3、32个外部双向输入/输出(I/O)口;4、5个中断优先级、2层中断嵌套中断;5、6个中断源;6、2个16位可编程定时器/计数器;7、2个全双工串行通信口;8、看门狗(WDT)电路;9、片内振荡器和时钟电路;10、与MCS-51兼容;11、全静态工作:0Hz-33MHz;12、三级程序存储器保密锁定;13、可编程串行通道;14、低功耗的闲置和掉电模式。
b) 74LS4774LS47引脚图74LS47真值表74LS47是一种常用的BCD--七段数码管译码器驱动器,74LS47的输入端是四位二进制信号(8421BCD码),a、b、c、d、e、f、g是七段译码器的输出驱动信号,低电平有效。
可直接驱动共阴极七段数码管,是使能端,起辅助控制作用。
使能端的作用如下:(1) LT是试灯输入端,当 LT=0, BI=1时,不管其它输入是什么状态,a~g七段全亮;(2)BI静态灭灯输入,当 BI=0,不论其它输入状态如何,a~g 均为0,显示管熄灭;(3)RBI动态灭零输入,当 LT=1, RBI=0时,如果 A3A2A1A0(ABCD)=0000时,a~g均为各段熄灭;(4) RBO动态灭零输出,它与灭灯输入BI 共用一个引出端。
当在动态灭零时输出才为0。
片间与 RBI配合,可用于熄灭多位数字前后所不需要显示的零。
c) LM7805LM7085引脚图7805是常用到的稳压芯片,外围电路简单,输出电压为5V,可为51单片机提供工作电压。
三、软件设计流程图四、源程序#include <reg51.h>#define uchar unsigned char#define uint unsigned int#define TH_SET 0x4C#define TL_SET 0x00 //定时50ms的初始值#define RTime 24 // 红灯时间20s#define GTime 24 // 绿灯时间20s#define YTime 3 //黄灯时间5ssbit KEY_A=P1^0;sbit KEY_B=P1^1;sbit GREEN1=P2^0;sbit GREEN2=P2^3;sbit RED1=P2^1;sbit RED2=P2^4;sbit YELLOW1=P2^2;sbit YELLOW2=P2^5;//位定义bit key1=0,key2=0;//四个按键状态标志uint time1,time2;//time1,time2分别为键1、键2功能实现的时间变量uchar acount,keyflag,Status=1,yellow=0;//acount定时一秒标志//Status交通灯状态显示标志,keyflag按键选择标志,P黄灯闪烁定时标志void Delay(int n){ //延时程序uint i;uint j;for(i=0;i<n;i++){for(j=0;j<200;j++);}}//定时器0void Timer0_SVR() interrupt 1{TH0=TH_SET;TL0=TL_SET;acount++;if(KEY_A==0){//按键扫描实现暂停和按键切换Delay(2);if(KEY_A==0){key1=~key1 ;keyflag=1;while(!KEY_A);}}if(KEY_B==0){Delay(2);if(KEY_B==0){key2=~key2 ;keyflag=2;while(!KEY_B);}}if(acount==20){//IntCount=20定时一秒acount=0; //定时一秒恢复if(keyflag==1){if(key1==1){//按下键1使交通灯显示时间自减time1--;if(time1==0){Status++;//显示时间为零时,切换交通灯状态 if(Status==5){Status=1;}}}}if(keyflag==2){if(key2==1){time2++; //按下键2时计时器时间自增if(time2==3600){//计时满一小时时归零time2=0;}}}}EA=1;}//计时器数码管显示函数void xianshi1(void){P0=time2/600+0x10;Delay(2); //分的十位P0=(time2/60%10)+0x20;Delay(2); //分的个位P0=((time2%60)/10)+0x40;Delay(2); //秒的十位P0=(time2%60%10)+0x80;Delay(2); //秒的个位}//交通灯数码管显示函数void xianshi2(void){P0=(time1/10)+0x50;Delay(2); //秒的十位P0=(time1%10)+0xA0;Delay(2); //秒的个位 yellow++;}//计数器状态函数void Count(){time2=0;key2=1;P2=0x80;while(1){if(keyflag==2){xianshi1();}elsebreak;}}//交通灯状态函数void TraLight(void){key1=1;time1=0;P2=0x80;while(1){if(Status==1&&time1==0){//Status=1时南北向红绿灯亮RED1=0;RED2=1;YELLOW1=0;YELLOW2=0;GREEN1=1;GREEN2=0;time1=GTime;}if(Status==2&&time1==0){//Status=2时黄灯闪烁RED1=0;RED2=0;YELLOW1=1;YELLOW2=1;GREEN1=0;GREEN2=0;time1=YTime;}if(Status==3&&time1==0){//Status=3时东西向红绿灯亮RED1=1;RED2=0;YELLOW1=0;YELLOW2=0;GREEN1=0;GREEN2=1;time1=RTime;}if(Status==4&&time1==0){//Status=4时黄灯闪烁RED1=0;RED2=0;YELLOW1=1;YELLOW2=1;GREEN1=0;GREEN2=0;time1=YTime;}if(yellow==50&&key1){//Status=2或4时为黄灯,实现闪烁if(Status==2||Status==4){yellow=0;YELLOW1=~YELLOW1; YELLOW2=~YELLOW2; }}if(keyflag==1){xianshi2();}elsebreak;}}void choose(void){switch(keyflag){case 1:TraLight();break;// 按键1case 2:Count();break; // 按键2default: break;}}//主函数void main(){//初始化定时器0EA=1;ET0=1;TMOD=0x01;TH0=0x4c;TL0=0x00;P2=0x80;if(KEY_A==0){ //按键扫描实现暂停和切换Delay(5);if(KEY_A==0){key1=~key1 ;keyflag=1;while(!KEY_A);}}if(KEY_B==0){Delay(5);if(KEY_B==0){key2=~key2 ;keyflag=2;while(!KEY_B);}}TR0=1;while(1){choose();}}六、已实现的功能1.KEYA:交通灯灯和数码管结合,模拟十字路口的交通灯的点亮与熄灭,数码管倒计时显示时间。
亮灯方式:红(20s)黄(闪烁5s)绿(20s)黄(闪烁5s)红(20s)数码管显示方式:南北向红绿灯20s 黄灯闪烁5s东西向红绿灯20s 黄灯闪烁5s南北向红绿灯20s按下KEYA可实现计时与红绿灯暂停2.KEYB:计时器四只数码管低二位0~59计数后给高二位0~59计数(即分秒计时)按下KEYB可实现计时器暂停七、调试过程步骤1:运行Keil uVision3新建工程并将程序代码输入,编译无错误后生成HEX文件。
步骤2:将HEX文件通过专业烧录软件烧录到AT89S51芯片中。
步骤3:上电按键操作,看是否符合设计要求。
步骤4:根据上电操作结果修改程序,并再次烧录调试,直至满足设计要求为止。
八、心得小结在焊接电路板的时候需要认真仔细,焊接时要先焊接体积较小的元器件,再焊接较大的元器件,这样比较方便,同时要看清三极管,排阻,二极管等带有方向性元器件,不要搞错方向,对于焊锡的把握适量即可,太多或太少都会导致虚焊。
在编写程序的过程中,最重要的是想好框架,然后从小处入手,先完成每个按键的功能,均能实现后,再将各个功能统筹在一起,这样程序不但简单易读还不容易出错。
当然在写程序的过程中也遇到了一些问题,比如在实现计时器功能时,每次计时到4分15秒时就归零了,后来发现原来是计时器中的计时变量time2用的是char型,而char型的计数范围为0——255,后来将char改为int型后,这个问题就得到了解决。
总之对于程序的调试最重要的还是反复的去尝试和分析问题的可能性,一步步的解决它,这样总是能完成任务的。