标题:
基于51单片机的十字路口信号灯设置 Proteus仿真代码
[打印本页]
作者:
65423..+
时间:
2020-6-24 08:44
标题:
基于51单片机的十字路口信号灯设置 Proteus仿真代码
红绿灯共有五个阶段,直行和右转、左转、人行道、红灯、黄灯。数字键盘按1~5可以调节相对应阶段的时间,按#和*可以暂停所所有信号灯
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei截图20200624082839.png
(78.85 KB, 下载次数: 70)
下载附件
2020-6-24 08:31 上传
单片机源程序如下:
#include "reg51.h"
#include "intrins.h"
typedef unsigned char uchar;
sbit X_forward = P1^0;
sbit X_left = P1^1;
sbit X_rignt = P1^2;
sbit Y_forward = P1^3;
sbit Y_left = P1^4;
sbit Y_rignt = P1^5;
sbit X_red = P1^6;
sbit X_yellow = P1^7;
sbit Y_yellow = P3^0;
sbit Y_red = P3^1;
sbit Y_red_people = P3^2;
sbit Y_green_people = P3^3;
sbit X_red_people = P3^4;
sbit X_green_people = P3^5;
uchar dir = 0; // x--0; y--1;
uchar dat[] = {0,0};//ge,shi,y(f,l,r,s),x(f,l,r,s) //0-s 1-f 2-l 3-r
char dx[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int red_sj = 5;
int yellow_sj = 3;
int green_sj = 5;
int left_sj = 5;
int right_sj = 5;
int people_sj = 5;
int num = 0;
uchar jd = 2;
int state;
int cmd;
char key_value[] = {
0x3d,0x73,0x75,0x76,
0x6b,0x6d,0x6e,0x5b,
0x5d,0x5e,0x3b,0x3e
};
void ledDisplay(){
uchar j,i;
for(j=0;j<4;j++)
{
i = P3;
i &= 0x3f;
i |= ((j<<6)&0xc0);
P3 = i;
P0 = dx[dat[j>1?j-2:j]];
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
P0 = 0x00;
}
}
void init(){ //初始化
IE = 0x02; //允许定时器0中断;
TMOD = 0x01; //定时器0工作方式1
TH0 = 0xDF;
TL0 = 0x72;
EA = 1; //开中断
}
void set_state(uchar shi,uchar ge,uchar dirY,uchar dirX,uchar x_red,uchar x_yellow,uchar y_red,uchar y_yellow,uchar x_people,uchar y_people)
{
dat[1] = ge;
dat[0] = shi;
switch(dirY)
{
case 0: Y_forward=1;Y_left=1;Y_rignt=1;break;
case 1: Y_forward=0;Y_left=1;Y_rignt=0;break;
case 2: Y_forward=1;Y_left=0;Y_rignt=1;break;
case 3: Y_forward=1;Y_left=1;Y_rignt=0;break;
}
switch(dirX)
{
case 0: X_forward=1;X_left=1;X_rignt=1;break;
case 1: X_forward=0;X_left=1;X_rignt=0;break;
case 2: X_forward=1;X_left=0;X_rignt=1;break;
case 3: X_forward=1;X_left=1;X_rignt=0;break;
}
X_red = x_red;
X_yellow = x_yellow;
Y_red = y_red;
Y_yellow = y_yellow;
switch(x_people)
{
case 0: X_green_people = 1;X_red_people = 0;break;
case 1: X_green_people = 0,X_red_people = 1;break;
}
switch(y_people)
{
case 0: Y_green_people = 1;Y_red_people = 0;break;
case 1: Y_green_people = 0,Y_red_people = 1;break;
}
}
void key_chuli(int i)
{
if(state==0)
{
cmd = i;
state = 1;
}else if(state==1)
{
switch(cmd)
{
case 1:red_sj = i;break;
case 2:yellow_sj = i;break;
case 3:green_sj = i;break;
case 4:left_sj= i;break;
case 5:right_sj= i;break;
case 6:people_sj= i;break;
}
state = 2;
}else if(state==2)
{
switch(cmd)
{
case 1:red_sj *= 10; red_sj += i;break;
case 2:yellow_sj *= 10; yellow_sj += i;;break;
case 3:green_sj *= 10; green_sj += i;;break;
case 4:left_sj *= 10; left_sj += i;;break;
case 5:right_sj *= 10; right_sj += i;;break;
case 6:people_sj *= 10; people_sj += i;;break;
}
state = 0;
}
}
void key_san(void)
{
int i;
char wz;
P2 = 0x07;
if(P2!=0x07){
_nop_();
if(P2!=0x07){
wz = P2;
P2 = 0x78;
wz |= (P2&0x78);
for(i=0;i<12;i++){
if(key_value[i]==wz){
if(i>9)
{
set_state(0,0,0,0,0,1,0,1,0,0);
TR0 = 0;
while(1)
{
ledDisplay();
}
}else
{
key_chuli(i);
P2 = 0x07;
while(P2!=0x07);
}
}
}
}
}
}
void main(void)
{
init();
TR0 = 1;
while(1)
{
key_san();
ledDisplay();
}
}
void chuli(void)
{
if(dir)
{
switch(jd)
{
case 1:set_state((red_sj/10)%10,red_sj%10,0,0,0,1,0,1,0,0);break;
case 2:set_state((yellow_sj/10)%10,yellow_sj%10,0,0,0,1,1,0,0,0);break;
case 3:set_state((green_sj/10)%10,green_sj%10,1,0,0,1,1,1,0,0);break;
case 4:set_state((left_sj/10)%10,left_sj%10,2,0,0,1,1,1,0,0);break;
case 5:set_state((people_sj/10)%10,people_sj%10,0,0,1,1,1,1,0,1);break;
}
}else
{// shi, ge, dirY, dirX, x_red, x_yellow, y_red, y_yellow, x_people, y_people
switch(jd)
{
case 1:set_state((red_sj/10)%10,red_sj%10,0,0,0,1,0,1,0,0);break;
case 2:set_state((yellow_sj/10)%10,yellow_sj%10,0,0,1,0,0,1,0,0);break;
case 3:set_state((green_sj/10)%10,green_sj%10,0,1,1,1,0,1,0,0);break;
case 4:set_state((left_sj/10)%10,left_sj%10,0,2,1,1,0,1,0,0);break;
case 5:set_state((people_sj/10)%10,people_sj%10,0,0,1,1,0,1,1,0);break;
}
}
}
void time_chuli(void)
{
if(dat[0]==0&dat[1]==0)
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
红绿灯 - 副本 - 副本 (2).rar
(234.65 KB, 下载次数: 13)
2020-6-24 08:41 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1