1、基于51单片机的交通灯设计目 录1. 课设题目 12. 设计环境 13. 设计要求 14. 设计相关知识 14.1 硬件设计 14.2 软件应用 25. 主程序设计 36. 系统实现 147. 仿真运行 148. 设计心得 169. 参考文献 161.设计题目: 基于51单片机的交通灯设计2.设计环境1.装有 Windows 系统、keil C 51 v6.12中文完全版和proteus7.5仿真环境的PC 机一台。2.AT89C51单片机最小实现电路及配套发光二极管电路。3.设计要求1.编程要求:主程序利用 C 语言编写。 2.实现功能:使用AT89C51单片机控制 4个方向的交通灯(红黄绿
2、)并用数码管显示其时间。 3. 实验现象:状态一:主干道、支干道均亮红灯5秒;状态二:主干道亮绿灯30秒、支干道亮红灯;状态三:主干道绿灯闪3次转亮黄灯、支干道亮红灯3秒;状态四:主干道亮红灯、支干道亮绿灯25秒;状态五:主干道亮红灯、支干道绿灯闪3次转亮黄灯3秒;返回到第二个状态。4.设计相关知识4.1 硬件设计1. AT89C51简介:AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS 8位微处理器。它是一种带2K字节闪存可编程可擦除只读存储器的单片机。AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。2. 2位8段数码管工
3、作原理: 2位8段数码管电路采用“共阴”连接,阴极公共端(COM)由晶体管推动。如图4-3所示:段码和位码,段码即段选信号 SEG,它负责数码管显示的内容,图中 ag、dp组成的数据(a 为最低位,dp 为最高位)就是段码。位码即位选信号 DIG,它决定哪个数码管工作,哪个数码管不工作。当需要某一位数码管显示数字时,只需要先选中这位数码管的位信号,再给显示数字的段码。4.2 软件应用1. Proteus7.5简介:Proteus软件不仅具有EDA工具软件的仿真功能,还能仿真单片机及外围器件Proteus从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了将电路仿真
4、软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等。在编译方面,它支持IAR、Keil和MPLAB等多种编译器。2. Keil C51开发系统简介:Keil C51是51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,生成的目标代码效率非常之高,多数语句生成的汇编代码紧凑,容易理解。在开发大型软件时更
5、能体现其高级语言的优势。5.主程序设计/*11.0952M晶振*/#include/头文件#include/头文件#define uchar unsigned char/宏定义#define uint unsigned int/宏定义sbit RED_ZHU = P10;sbit YELLOW_ZHU = P11;sbit GREEN_ZHU = P12;sbit RED_ZHI = P13;sbit YELLOW_ZHI = P14;sbit GREEN_ZHI = P15; uint aa, bai,shi,ge,bb; /定义变量/*数码管显示0-9*/uint code table=0
6、x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/*子函数声明*/void delay(uint z);void delay0(uint z);/void init(uint a);void display(uint ge,uint shi);void xtimer0();void init1();void init2();void init3();void init4();void init5();void xint1();void xint0();void LED_ON();void LED_OFF();/*主函数*/void main()
7、 P0=0XFF; P1=0xFF; P2=0xFF; EA=1;/打开外部中断 EX1=1;/允许外部中断1中断 IT1=0;/INT0为沿触发方式 init1(); while(1) init2();/第2个状态 init3(); /第3个状态 init4(); /第4个状态 init5();/第5个状态 void init1()/第一个状态:主干道、支干道均亮红灯5S uint temp; temp=6;/变量赋初值 TMOD=0x01;/定时器0工作于方式1 TH0=0x4c; TL0=0x00;/定时器赋初值 EA=1;/开外部中断 ET0=1;/开定时中断 TR0=1;/开定时器0
8、 while(1) RED_ZHU=0; /第一个状态主干道、支干道均亮红灯5S RED_ZHI=0; GREEN_ZHU=1; GREEN_ZHI=1; YELLOW_ZHU=1; YELLOW_ZHI=1; if(aa=20)/定时20*50MS=1S aa=0;/定时完成一次后清0 temp-;/变量自增 /delay(10); if(temp250)/定时100S temp=6;/变量清0 break; shi=temp%100/10;/显示十位 ge=temp%10;/显示个位 display(ge,shi); void init2()/第二个状态:主干道亮绿灯30S、支干道亮红灯
9、uint temp; temp=31;/变量赋初值 TMOD=0x01;/定时器0工作于方式1 TH0=0x4c; TL0=0x00;/定时器赋初值 EA=1;/开外部中断 ET0=1;/开定时中断 TR0=1;/开定时器0 while(1) RED_ZHU=1; RED_ZHI=0; GREEN_ZHU=0; GREEN_ZHI=1; YELLOW_ZHU=1;/第二个状态:主干道亮绿灯30S、支干道亮红灯 YELLOW_ZHI=1; if(aa=20)/定时20*50MS=1S aa=0;/定时完成一次后清0 temp-;/变量自增 if(temp=3)/定时100S temp=30;/变
10、量清0 break; shi=temp%100/10;/显示十位 ge=temp%10;/显示个位 display(ge,shi); void init3() /第三个状态:主干道绿灯闪3次转亮黄灯、支干道亮红灯3S uint temp; temp=4;/变量赋初值 TMOD=0x01;/定时器0工作于方式1 TH0=0x4c; TL0=0x00;/定时器赋初值 EA=1;/开外部中断 ET0=1;/开定时中断 TR0=1;/开定时器0 while(1) RED_ZHI=0; GREEN_ZHU=1; /YELLOW_ZHU=YELLOW_ZHU; if(aa=20)/定时20*50MS=1S
11、 aa=0;/定时完成一次后清0 temp-;/变量自增 YELLOW_ZHU=YELLOW_ZHU; if(temp200)/定时100S temp=4;/变量清0 break; shi=temp%100/10;/显示十位 ge=temp%10;/显示个位 display(ge,shi); void init4()/第四个状态:主干道亮红灯、支干道亮绿灯25S uint temp; temp=26;/变量赋初值 TMOD=0x01;/定时器0工作于方式1 TH0=0x4c; TL0=0x00;/定时器赋初值 EA=1;/开外部中断 ET0=1;/开定时中断 TR0=1;/开定时器0 whil
12、e(1) RED_ZHU=0; RED_ZHI=1; YELLOW_ZHU=1;/第一个状态主干道、支干道均亮红灯5S GREEN_ZHI=0; if(aa=20)/定时20*50MS=1S aa=0;/定时完成一次后清0 temp-;/变量自增 if(temp=3)/定时100S temp=25;/变量清0 break; shi=temp%100/10;/显示十位 ge=temp%10;/显示个位 display(ge,shi); void init5()/第五个状态:主干道亮红灯、支干道绿灯闪3次转亮黄灯3S uint temp; temp=4;/变量赋初值 TMOD=0x01;/定时器0
13、工作于方式1 TH0=0x4c; TL0=0x00;/定时器赋初值 EA=1;/开外部中断 ET0=1;/开定时中断 TR0=1;/开定时器0 while(1) RED_ZHI=1; RED_ZHU=0; GREEN_ZHU=1; GREEN_ZHI=1; /YELLOW_ZHI=YELLOW_ZHI; if(aa=20)/定时20*50MS=1S aa=0;/定时完成一次后清0 temp-;/变量自增 YELLOW_ZHI=YELLOW_ZHI; if(temp200)/定时100S temp=4;/变量清0 break; shi=temp%100/10;/显示十位 ge=temp%10;/
14、显示个位 display(ge,shi); /*显示子函数*/void display(uint ge,uint shi) P0=0xfd; P2=tableshi;/显示十位 delay0(5); P0=0xfe; P2=tablege;/显示个位 delay0(5);void xint0() interrupt 2 /外部中断1,这里用2是INT1的优先级为0 LED_ON();void LED_ON()/外部中断0显示子程序 RED_ZHI=0; RED_ZHU=0; GREEN_ZHI=1; GREEN_ZHU=1; YELLOW_ZHI=1; YELLOW_ZHU=1; delay0
15、(1000); return ;/*定时中断子函数*/void xtimer0() interrupt 1 TH0=0x4c; TL0=0x00; aa+;/*延时子函数*/void delay0(uint z) uint i,j; for(i=0;iz;i+) for(j=0;j0;j-) for(i=1250;i0;i-) for(k=180;k0;k-); 6.系统实现1. 使用keil C 51编写程序;2. 将编好的程序“.C”文件用Keil C 51转换成“.hex”文件;3. 画出设计系统仿真图;3. 打开proteus7.5,将画好的仿真图载入,鼠标右击图中的51单片机选择“编
16、辑属性”,在Program File中载入之前的“.hex”文件,再点击“调试”中的“开始”或点击软件左下角的“”,即仿真开始运行;4. 观察运行现象是否与设计结果相符;5. 确定设计后,按图焊接硬件电路;6. 测试硬件电路。7.仿真运行8.设计心得用单片机实现交通灯控制,可以使我们的生活方便快捷。这项看起来不需要多少技术的工作却是非常需要耐心和精力,几天的设计对我们来说的意义,不仅仅是让我们把所学的理论知识与实践相结合起来,还提高了我们的实际动手能力和独立思考的能力,更重要的是团队合作,虽然我们这次设计仓促,制作有些简单,但我们得到了很多远大于设计的东西!9.参考文献单片机原理及应用51单片机原理及应用-基于Keil C与ProteusProteus 7.5 Professional 51单片机入门教程XX文库:AT89C51中文资料Proteus仿真论坛
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1