1、当19脚E为H时,A、B为高阻。E为L时,DIR为L时,数据由B传向A;DIR为H时,由A传向B。(3)两位共阴数码管16脚和11脚对应A、15脚和10脚对应B、3脚和8脚对应C、2脚和6脚对应D、1脚和5脚对应E、18脚和12脚对应F、17脚7脚对应G、4脚和9脚对应DP。公共脚为14脚和13脚,分别对应左边和右边显示的数字。 三、系统硬件电路设计(1)时钟电路设计 如图所示,采用内部时钟产生方式,在XTAL1和XTAL2两端跨接晶体或陶瓷振荡器,与内部反相器构成稳定的自击震荡。其发出的时钟脉冲直接送入片内定时控制部件。(2) 复位电路设计如上图所示,采用上电+按钮电平复位方式,当按下按钮时
2、,RST管脚高电平触发。为保证复位可靠,RC时间常数应大于两个机器周期,电容取10uf,电阻取1000欧。(3) 灯控制电路设计 如上图所示,交通灯状态显示电路由东西南北四个方向各三个LED灯组成,分别显示四个方向上红、黄、绿三个状态,用以指示十字路口各方向车辆的行驶。通过软件编程,可使路口交通变化情况为:南北方向和东西方向两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒。在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;黄灯亮时每秒闪亮一次。(4) 按键控制电路设计 开关控制由7个连接到单片机的控制按钮组成。通过软件编程,使得各个开关的功能如上图所示, 基本满足了交通灯的需
3、要。四、元件清单及实物图1、程序清单名 称规 格数 量单片机AT89S521排阻9脚10K 1晶振11.0592MHz发光二极管GREEN 3REDYELLOW 数码管 两位共阴 2 电阻1K电阻10K 6按键 8电解电容10uF独石电容22pF电源插头排座20脚 排座40脚双排针2.54间距单排针排线15cm16根实验板10*15cm2、原理图五、实验心得这次交通灯的制作是我学会了不少的东西,首先是proteus和keil的使用。单片机程序的编写和原理图的仿真都是在这两个软件的运行下才可以进行的。这个实验最重要的是让我对51系列的单片机有了更深层次的了解,这一学期 开接触单片机的时候觉得这是
4、一门极其高深的课程,老师讲的什么基本完全不懂,课后看仍旧是一头雾水。通过交通灯的学习和制作,对单片机有了初步的了解,知道了它的组成、工作原理等等。在软件编写这一块,开始时遇到了很大的难题,因为两百行的程序,哪怕有一个错误,修改起来也不是十分方便。时常没有心思去寻找和改正错误,所以软件这一块花了很大的一部分时间。几次调试后总算出现“0 warning”和“0 error”的字样。焊接也是比较麻烦,由于万能板买小了,再加上需要连接的线有很多根,所以首先必须考虑到元器件的排布问题,尽量让自己的焊接的时候方便一点。借鉴别人的经验,数码管和排阻之间用排线相连接,很大程度上节省焊接的时间,并且让板子看起来
5、更加整洁、美观。除了学会很多东西以为,也发现了自己的不足。由于自己在这一方面只是的短缺,所以很多问题都需要查阅资料或者向别的同学请教。比如说proteus和keil的使用方法,都是看着别人操作几遍之后才慢慢学会。还有在焊接这一方面也存在着很大问题。由于焊接在万能板反面,所以有时候会把单片机的引脚看错,然后用吸枪慢慢清理。这不仅浪费时间而且还可能破坏万能板。在焊接过程中还出现短路问题,一不小心锡丝用多了就有可能造成两个点之间的短路问题,这一点说明了焊接能力还有待提升。实验的结果是成功的,模拟出了交通灯的功能,各个按键的功能也和模拟时一致,看着数字的跳动自己信息也感到十分开心。虽然想过在这个交通灯
6、里加入一些额外的功能,但终究由于自己知识的局限性而放弃,有点遗憾,不过能够学到东西就好。此次试验增长了自己的单片机知识外也让我知道实践和理论学习的差别。实践过程中学到的知识自己记得会更加牢固一些,不容易忘记。总的来说,单片机的制作让我收获不小。附1 源程序代码#include #define uchar unsigned char#define uint unsigned intuchar data buf4;uchar data sec_dx=20;/东西数默认uchar data sec_nb=30;/南北默认值uchar data set_timedx=20;uchar data set
7、_timenb=30;int n;uchar data b;/定时器中断次数sbit k1=P16;/定义5组开关sbit k2=P17;sbit k3=P27;sbit k4=P30;sbit k5=P31;sbit Yellow_nb=P25; /南北黄灯标志sbit Yellow_dx=P22; /东西黄灯标志sbit Green_nb=P24;sbit Green_dx=P21;sbit Buzz=P37;bit Buzzer_Indicate;bit time=0;/灯状态循环标志bit set=1;/调时方向切换键标志uchar code table11= /共阴极字型码0x3f,
8、 /-00x06, /-10x5b, /-20x4f, /-30x66, /-40x6d, /-50x7d, /-60x07, /-70x7f, /-80x6f, /-90x00 /-NULL;/函数的声明部分void delay(int ms);/延时子程序void key();/按键扫描子程序void key_to1();/键处理子程序void key_to2();void key_to3();void display();/显示子程序void logo(); /开机LOGOvoid Buzzer();/主程序void main() TMOD=0X01; TH0=0XD8; TL0=0XF
9、0; EA=1; ET0=1; TR0=1; EX0=1; EX1=1; logo(); P2=0Xc3;/ 开始默认状态,东西绿灯,南北黄灯 sec_nb=sec_dx+5; while(1) key(); /调用按键扫描程序 display(); /调用显示程序 Buzzer(); /函数的定义部分void key() /按键扫描子程序 if(k1!=1) delay(10); if(k1! while(k1! key_to1(); for(n=0;n40;n+) display(); if(k2! if(k2! while(k2! key_to2(); if(k3! TR0=1; /启动
10、定时器 Buzzer_Indicate=0; sec_nb=set_timenb; /从中断回复,仍显示设置过的数值 sec_dx=set_timedx; if(time=0) P2=0X99;sec_nb=sec_dx+5; else P2=0xC3;sec_dx=sec_nb+5; if(k4! delay(5); if(k4! while(k4!=1); set=!set; if(k5! delay(5); while(k5!=1) key_to3();void display() /显示子程序 buf1=sec_dx/10; /第1位 东西秒十位 buf2=sec_dx%10; /第2
11、位 东西秒个位 buf3=sec_nb/10; /第3位 南北秒十位 buf0=sec_nb%10; /第4位 南北秒个位 P1=0xff; / 初始灯为灭的 P0=0x00; P1=0xfe; /片选LCD1 P0=tablebuf1; delay(1); P1=0xff; P1=0xfd; /片选LCD2 P0=tablebuf2; delay(1); P1=0Xfb; /片选LCD3 P0=tablebuf3; P1=0xff; P1=0Xf7; P0=tablebuf0; /片选LCD4 void time0(void) interrupt 1 using 1 /定时中断子程序 b+;
12、 if(b=19) / 定时器中断次数 b=0; sec_dx-; sec_nb-; if(sec_nb=5&time=0) /东西黄灯闪 Green_dx=0;Yellow_dx=!Yellow_dx; if(sec_dxtime=1) /南北黄灯闪 Green_nb=0;Yellow_nb=!Yellow_nb; if(sec_dx=0&sec_nb=5) sec_dx=5; if(sec_nb=0&sec_dx=5) sec_nb=5; if(time=0&sec_nb=0) P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5
13、; if(time=1&sec_dx=0) P2=0Xc3;sec_dx=set_timedx;sec_nb=set_timedx+5; void key_to1() /键盘处理子程序之+ TR0=0; /关定时器 if(set=0) set_timenb+; /南北加1S else set_timedx+; /东西加1S if(set_timenb=100) set_timenb=1; if( set_timedx=100) set_timedx=1; /加到100置1 sec_nb=set_timenb ; /设置的数值赋给东西南北 sec_dx=set_timedx;void key_t
14、o2() /键盘处理子程序之- set_timenb-; /南北减1S set_timedx-; /东西减1S if(set_timenb=0) set_timenb=99; if( set_timedx=0 ) set_timedx=99; /减到1重置99void key_to3() /键盘处理之紧急车通行 P2=0Xc9; sec_dx=00; sec_nb=00; Buzzer_Indicate=1;void int0(void) interrupt 0 using 1 /只允许东西通行 Buzzer_Indicate=0;void int1(void) interrupt 2 using 1 /只允许南北通行 P2=0X99;void logo()/开机的Logo - - - - for(n=0;50; P0=0x40; P1=0Xf7; P1 = 0xff;void Buzzer() if(Buzzer_Indicate=1) Buzz=!Buzz; else Buzz=0;void delay(int ms) /延时子程序 uint j,k; for(j=0;jms;j+) for(k=0;k124;k+);附2 原理图
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1