一、实验目的
掌握单片机的综合应用设计。
二、实验仪器、材料
Keil软件、proteus软件
三、实验内容及要求
完成以下任务:十字路口的交通灯控制系统,四组灯对应十字路口的四个方向,用两位的数码管显示剩余的时间。
四、实验原理
五、实验过程及原始记录(包括原理图程序代码)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar shuzi[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//p0控制LED灯是否亮
sbit ew_red=P0^0; //东西红灯,低电平亮
sbit ew_yellow=P0^1;
sbit ew_green=P0^2;
sbit sn_red=P0^3;
sbit sn_yellow=P0^4;
sbit sn_green=P0^5;
//p2口控制段码
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
//控制数码管位码
sbit P1_0=P1^0;
sbit P1_1=P1^1; //p1_0,p1_1控制东西灯位码
sbit P1_2=P1^2;
sbit P1_3=P1^3; //p1_2,p1_3控制南北灯位码
//按键控制
sbit P3_3=P3^3; //南北通行按键
sbit P3_4=P3^4; //全部禁止按键
//定义变量
int s=0,n=0;
void time(void) interrupt 1 //中断,产生1s
{
TH0=(65536-50000)/256; //0.05s=50ms
TL0=(65536-50000)%256;
n++;
if(n==20) //设置频率,即倒计时速率
{n=0;
s++;}
if(s==60) //设置交通灯循环一次的时间
s=0;
}
void ew_allow() //东西绿灯,南北红灯
{
ew_red=1;
ew_yellow=1;
ew_green=0; //低电平亮
sn_red=0;
sn_yellow=1;
sn_green=1;
}
void ew_wait() //东西黄灯,南北红灯
{
ew_red=1;
ew_yellow=0;
ew_green=1;
sn_red=0;
sn_yellow=1;
sn_green=1;
}
void sn_allow() //东西红灯,南北绿灯
{
ew_red=0;
ew_yellow=1;
ew_green=1;
sn_red=1;
sn_yellow=1;
sn_green=0;
}
void sn_wait() //东西红灯,南北黄灯
{
ew_red=0; //低电平亮
ew_yellow=1;
ew_green=1;
sn_red=1;
sn_yellow=0;
sn_green=1;
}
void delay()
{ int i;
int j;
for(i=0;i<100;i++)
for(j=0;j<10;j++);
}
void chushi() //P1初始化
{
P1_0=0;
P1_1=0;
P1_2=0;
P1_3=0;
}
void jinzhi() //按下禁止按钮后四个方向都禁止(都为红灯),且时间显示为99
{
chushi();
P2=shuzi[9];
P1_0=1;
P1_2=1;
delay();
chushi();
P1_1=1;
P1_3=1;
ew_red=0;
ew_yellow=1;
ew_green=1;
sn_red=0;
sn_yellow=1;
sn_green=1;
delay();
}
void display_led() //LED灯显示
{
if(s<=27) //东西方向与南北方向时间间隔3s(即黄灯时间)
ew_allow(); //东西绿灯,南北红灯
else if(s<=30)
ew_wait(); //东西黄灯,南北红灯
else if(s<=57) //3s
sn_allow(); //东西红灯,南北绿灯
else if(s<=60)
sn_wait();
else
jinzhi();
}
void display_shuzi1() //绿灯以及黄灯的倒计时显示
{
if(s<=27)
{
chushi();
P2=shuzi[(27-s)/10];
P1_1=0;
P1_0=1;
delay();
chushi();
P2=shuzi[(27-s)%10];
P1_1=1; //个位
P1_0=0; //十位
delay();
}
else if(s<=30)
{
chushi();
P2=shuzi[(30-s)/10];
P1_1=0;
P1_0=1;
delay();
chushi();
P2=shuzi[(30-s)%10];
P1_1=1;
P1_0=0;
delay();
}
else if(s<=57)
{
chushi();
P2=shuzi[(57-s)/10];
P1_3=0;
P1_2=1;
delay();
chushi();
P2=shuzi[(57-s)%10];
P1_3=1;
P1_2=0;
delay();
}
else if(s<=60)
{
chushi();
P2=shuzi[(60-s)/10];
P1_3=0;
P1_2=1;
delay();
chushi();
P2=shuzi[(60-s)%10];
P1_3=1;
P1_2=0;
delay();
}
else
jinzhi();
}
void display_shuzi2() //红灯的倒计时显示
{
if(s<=30)
{
chushi();
P2=shuzi[(30-s)/10];
P1_3=0; //个位
P1_2=1; //十位
chushi();
P2=shuzi[(30-s)%10];
P1_3=1;
P1_2=0;
delay();
}
else if(s<=60)
{
chushi();
P2=shuzi[(60-s)/10];
P1_1=0;
P1_0=1;
delay();
chushi();
P2=shuzi[(60-s)%10];
P1_1=1;
P1_0=0;
delay();
}
else
jinzhi();
}
void display_shuzi3()
{
if(s<=60)
{
chushi();
P2=0;
delay();
chushi();
P2=0;
delay();
}
if(s==61)
jinzhi();
}
void panduan() //按键的判断
{
if(P3_3==0) //按下时切换到南北绿灯刚亮起的时间段
s=31;
if(P3_4==0) //按下时实现全部禁止(按下南北通行解除禁止)
s=61;
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256; //高8位
TL0=(65536-50000)%256; //低8位
EA=1;
ET0=1;
TR0=1;
while(1)
{
display_led();
display_shuzi1();
display_shuzi2();
display_shuzi3();
panduan();
}
}
六、实验结果及分析(程序仿真分析)
文章来源:https://www.toymoban.com/news/detail-512191.html
文章来源地址https://www.toymoban.com/news/detail-512191.html
到了这里,关于单片机交通灯控制系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!