⑵ 选择芯片;
⑶ 新建文档,把编写好代码写入文档并保存了C文件; ⑷ 把保存的文档加载到Source Group; ⑸编译程序;
⑹设置转换成16进制; ⑺运行程序的结果;
2. 把编译好的16进制文件(.hex) 输入单片机STC89C52仿真器和对其进行初始化。
3.给实验板进行通电,观察运行结果,不一致则跳到第一步进行反复调试,直到与预定目的一致。
4.程序实现代码
;此程序分为四个部分,循环运行。南北方向绿灯6S。东西方向红灯6S。 ;南北方向黄灯3S,东西方向红灯3S(总共9S红灯)。 ;东西方向绿灯6S,南北方向红灯6S。
;东西方向黄灯3S,南北方向红灯3S(总共9S红灯)。
;共设计12个发光二极管,4个红的,4个绿的,4个黄的。
;按照如图的解法将南北东西各方向的红绿灯依次接到P3.0~~P3.5共6个IO口上。K1,K2,K3按键分别接到P2^2~P2^0上。表示了暂停/继续按键,南北强制通行按键,东西强制通行按键。
C语言程序如下 :
#include
sbit hong1=P3^0; //定义各个方向红绿灯端口 sbit lv1=P3^1; sbit huang1=P3^2; sbit hong2=P3^5; sbit lv2=P3^4; sbit huang2=P2^3;
sbit w1=P2^7; //定义位选 sbit w2=P2^6; sbit w3=P2^5; sbit w4=P2^4;
sbit k1=P2^2; //定义按键 sbit k2=P2^1; sbit k3=P2^0; uchar num;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 11 -
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delayms(uint x); void keyscank1(); void keyscank2(); void keyscank3();
void main() //主函数 {
unsigned int i,j,m,n; w1=0; w2=0; w3=0; w4=0;
while(1) {
for(i=6;i>0;i--)
{keyscank1(); keyscank2(); keyscank3(); //按键扫描 lv1=0; //南北方向绿灯6S。东西方向红灯6S。 hong1=1;huang1=1; hong2=0;
huang2=1;lv2=1; P0=table[i-1]; P1=table[i+2]; delayms(1000); }
for(j=3;j>0;j--)
{ keyscank1(); keyscank2(); keyscank3();
lv1=1; //南北方向黄灯3S,东西方向红灯3S(总共9S红灯)。 hong1=1;huang1=0; hong2=0;
huang2=1;lv2=1; P0=table[j-1]; P1=table[j-1]; delayms(1000); }
for(m=6;m>0;m--) { keyscank1();keyscank2(); keyscank3();
hong1=0; //东西方向绿灯6S,南北方向红灯6S。 lv1=1;huang1=1; P0=table[m+2]; P1=table[m-1]; lv2=0;
huang2=1;hong2=1; delayms(1000); }
- 12 -
for(n=3;n>0;n--) { keyscank1(); keyscank2(); keyscank3();
hong1=0; //东西方向黄灯3S,南北方向红灯3S(总共9S红灯)。 lv1=1;huang1=1; P0=table[n-1]; P1=table[n-1]; huang2=0;
lv2=1;hong2=1; delayms(1000); } } }
void keyscank1() //{
if(k1==0) {
delayms(5); if(k1==0) {
while(!k1); } } }
void keyscank2() //{ {
if(k2==0) {
delayms(10) ; if(k2==0) { while(!k2) {
hong1=0;
lv1=1;huang1=1; lv2=0;
huang2=1;hong2=1; delayms(1000); } } } }
void keyscank3() //{ {
按键K1扫描 按键K2扫描 按键K3扫描 - 13 -
if(k3==0) {
delayms(10) ; if(k3==0) { while(!k3) {
hong2=0;
lv2=1;huang2=1; lv1=0;
huang1=1;hong1=1; delayms(1000); } } } }
void delayms(uint x) //延迟程序 {
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--) ; }
结论
本系统就是利用了STC89C52芯片的I/O引脚。系统采用STC公司生产的单片机STC89C52,以及其它芯片(如:L7805三端稳压电源)来设计交通灯控制器,实现了红灯亮9秒,绿灯亮6秒和黄灯亮3秒。并通过STC89C52的IO口设置红、绿灯燃亮的功能和控制实现在七段数码管上的时间显示;为了系统稳定可靠系统内集成了“看门狗”芯片,避免了系统因为死机而停止工作的情况发生。系统设计简便、实用性强、操作简单、程序设计简便。
系统不足:时间设定中间隔较短,没有设置左右转以及人行灯,以及自动根据车流改变红绿灯时间。此外,还没有充分考虑的把现代管理、人工智能运用到交通的控制中,来计算交通控制点之间的距离,来更合理的安排红、绿灯的持续时间,使城市的交通管理更加人性化。使人们远离目前的交通拥塞的现象。仅仅是在红绿灯的基础上增加了暂停/继续按键,南北强制通行按键,东西强制通行按键。
- 14 -
参考文献
[1]刘海宽 单片机实验与实训教程[M] 东南大学出版,2008 [2]张鑫 单片机原理及应用(第二版) 电子工业出版社 2012 [3]郭天祥 51单片机C语言教程[M] 电子工业出版社 2007 [4]谭浩强 C程序设计 [M] 电子工业出版社,1991
致谢
三周单片机实训结束了,感慨很多。三周时间很长也很短,在这三周里首先感谢之前单片机老师给我们很多扎实的基本知识。感谢学校图书馆和实验室给我们的良好的理论与实践支持。感谢老师们的无私帮助,无私解答我们实训中的问题,感谢班级同学尤其是集成创新社里的各位同学的帮助与支持。
- 15 -