【任务】设计十字路口交通灯,模拟红黄绿灯的亮灭规律。
【硬件平台】交通灯的运行规律是:红灯(R)停,绿灯(G)行,黄灯(Y)准备。同一方向的同色灯同亮通灭,可双向通行,因此单片机对的一个端口控制两盏灯,比如p0.0控制D1和D9。
【编程思路】交通灯的作用是防止东西向的人车流与南北向的人车流对撞。规定:东西向绿灯亮一段时间后(保证东西向正常速度的人车流通过),黄灯闪烁5次后红灯亮,禁止南北方向通行;东西向的红灯亮后,南北向交通灯由红变绿(允许通行),保持若干秒后(保证南北向正常速度的人车流通过),南北向的黄灯闪烁5次后红灯亮,东西向绿灯亮,如此两个方向轮流通过。两个方向的红绿状态互反。下面的编程思想是使用Switch开关语句及标志位实现程序的条件跳转。
1 #include <reg51.h>
2 #define uchar unsigned char
3 #define uint unsigned int
4
5 sbit red_A=P0^0; //定义东西向红黄绿指示灯控制位,以便进行位操作
6 sbit yellow_A=P0^1;
7 sbit green_A=P0^2;
8
9 sbit red_B=P0^3; //定义南北向红黄绿指示灯控制位,以便进行位操作
10 sbit yellow_B=P0^4;
11 sbit green_B=P0^5;
12
13 uchar flash_count=0; //定义闪烁次数变量
14 operation_type=1; //定义操作类型变量
15
16 void delay(uint x) //延时函数
17 {
18 uchar i;
19 while(x--) for(i=0;i<100;i );
20 }
18
19 void traffic_light() //交通灯切换函数
20 {
21 switch(operation_type)
22 {
23 case 1://东西向绿灯与南北向红灯亮
24 red_A=1; yellow_A=1;green_A=0;
25 red_B=0; yellow_B=1;green_B=1;
26 delay(1000); //延时
27 operation_type=2; //下一步操作
28 break;
29 case 2://东西向黄灯开始闪烁,绿灯关闭
30 delay(200); //延时
31 yellow_A=!yellow_A;green_A=1;
32 //闪烁5次
33 if( flash_count!=5) return;
34 flash_count=0;
35 operation_type=2; //下一步操作
36 break;
37 case 3://东西向红灯与南北向绿灯亮
38 red_A=0; yellow_A=1;green_A=0;
39 red_B=1; yellow_B=1;green_B=0;
40 //南北向黄灯亮若干秒后切换
41 delay(1000);
42 operation_type=4; //下一步操作
43 break;
44 case 4://南北向黄灯开始闪烁,绿灯灭
45 delay(200); //延时
46 yellow_B=!yellow_B;green_B=1;
47 //闪烁5次
48 if( flash_count!=5) return;
49 flash_count=0;
50 operation_type=1; //回到第一种操作
51 }
52 }
53
54 //主程序
55 void main()
56 {
57 while(1) void traffic_light(); //主函数在形式上越简洁越好,频繁调用的函数应在主函数外部详细定义
58 }
【说明】清晰表达编程思路绝非简单的事情,有时候鬼使神差地写出了程序,但要表达出为什么这样写却很难说清楚。实事求是地说,阅读程序比阅读自然语言文本难,因为语句比较散乱,不符合人类的思维习惯。
【程序截图】
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved