这是我做的一个基于51单片机的红绿灯系统自己手工焊接
内附硬件图
分别有两个按钮控制正道和侧道交通灯的情况
一个按钮处理突发情况的情况,即全部灯变为红灯
单片机源程序如下:
- #include"reg52.h"
- //脚定义
- sbit Adaoyouche=P3^2; //将Adaoyouche定义为P3_2脚
- sbit Bdaoyouche=P3^3;
- sbit jinji=P3^4;
- //函数声明
- void display(int miao); //显示子函数声明
- void time_init(); //定时器使能子函数声明
- void delay(unsigned int t); //延时子函数声明
- void dingshi(); //定时子函数声明
- void deng(); //亮灯模式控制子函数声明
- //变量定义
- int i=1,l=0,tt=0; //定义全局变量
- unsigned char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示数字0-9
-
- main()
- {
- time_init(); //定时器使能
- Adaoyouche=1;
- Bdaoyouche=1;
- jinji=1;
- while(1)
- {
- display(i); //显示i
- if(Adaoyouche==0) //按键功能
- {
- l=0; //A车道绿灯模式
- i=1; //当i=0,tt=0时进入模式选择
- tt=0;
- }
- if(Bdaoyouche==0)
- {
- l=2; //B车道绿灯模式
- i=1;
- tt=0;
- }
- if(jinji==0)
- {
- l=4; //紧急双红灯模式
- i=1;
- tt=0;
- }
- deng(); //亮灯模式控制
- delay(300); //短暂延时
- }
- }
- //定时器使能子函数
- void time_init()
- {
- tt=0;
- TMOD=0X01; //设置定时器1为模式一,即16位计算模式
- TH0=(65536-50000)/256; //给计数寄存器赋值,50毫秒时间
- TL0=(65536-50000)%256;
- EA=1; //开启总中断
- ET0=1; //开启定时器0中断
- TR0=1; //启动定时器
- }
- //中断函数,关键字"interrupt" , 这是C语言的中断函数表示法,1表时定地器0
- void dingshi() interrupt 1
- {
- TH0=(65536-50000)/256; //重新给计数寄存器赋值,50毫秒时间
- TL0=(65536-50000)%256;
- tt--; // 每50毫秒tt就减1,tt从20减到0为1秒
- }
- //显示子函数
- void display(int miao)
- {
- P0=0xff; //P0数据清0,数码管为0亮1灭。
- P1=0xaa; //开启十位
- P0=table[miao/10];//显示十位
- delay(500); //短暂延时
- P0=0xff;
- P1=0x55; //开启个位
- P0=table[miao%10];//显示个位
-
- }
- //亮灯模式控制子函数
- void deng()
- {
- if(tt==0)// 每50毫秒tt就减1,tt从20减到0为1秒,当tt=0时i就减1,i为倒数时间。
- {
- i=i-1;
- if(i==0)//当i=0时判断下一步要亮的灯
- {
- switch(l)
- {
- case 0: //l=0,A道绿灯50秒
- i=50;
- P2=0x78; //灯为0亮1灭。A道红黄绿灯分别接了P2的4、3、2脚,B道红黄绿灯分别接了P2的7、6、5脚。0x78为0111 1000
- break;
- case 1: //l=1,A道黄灯10秒
- i=10;
- P2=0x74;
- break;
- case 2: //l=2,B道黄灯25秒
- i=25;
- P2=0xcc;
- break;
- case 3: //l=3,B道黄灯5秒
- i=5;
- P2=0xac;
- break;
- case 4: //l=4,A,B两道红灯99秒
- i=99;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
红绿灯.zip
(902.41 KB, 下载次数: 10)
|