标题:
超级交通灯proteus仿真,立体实物,行人道上的红绿灯第二轮,发代码,大家点评
[打印本页]
作者:
q23154762
时间:
2017-12-13 22:26
标题:
超级交通灯proteus仿真,立体实物,行人道上的红绿灯第二轮,发代码,大家点评
超级交通灯proteus仿真,立体实物,行人道上的红绿灯第二轮,发代码,大家点评
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.jpg
(154.46 KB, 下载次数: 83)
下载附件
2017-12-13 23:45 上传
0.png
(6.33 KB, 下载次数: 72)
下载附件
2017-12-13 23:45 上传
单片机源程序如下:
#include<reg51.h>
sbit P3_5=P3^5;
sbit shi=P3^6; //十位
sbit ge=P3^7; //个位
sbit fm=P3^4;
sbit hw1=P3^3;
sbit LED1=P1^0; //南红北绿
sbit LED2=P1^1; //南北黄
sbit LED3=P1^2; //南绿北红
sbit LED4=P1^3; //东红西绿
sbit LED5=P1^4; //东西黄
sbit LED6=P1^5; //东绿西红
sbit k2=P1^6;
sbit sw=P1^7;
sbit led1=P3^1; //电机启动为0
sbit led2=P3^2;
sbit k1=P3^0;
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 P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
unsigned char count=0; //计数50ms
unsigned char miaoa; //东西方向
unsigned char miaob; //南北方向
unsigned char DY=1; //标志第一个方式
unsigned char DX=1;
unsigned char DZ=0;
unsigned char DB=0;
unsigned int c=0;
unsigned int b=0;
unsigned char miao; //加减时间
void disp1();
void disp2();
void delay(unsigned int t) //延时函数
{
unsigned int a;
for(a=0;a<t;a++);
}
void timer_1() interrupt 3 //定时器T1的中断函数,工作方式1下50ms产生中断,执行该中断函数
{
TH1=(65536-50000)/256; //重新设置T1计数初值高8位
TL1=(65536-50000)%256; //重新设置T1计数初值低8位
count++; //50ms计数器加1
}
//void hongwai1()
//{
// bit flag;
// flag=0; //灯灭
//
// if(hw1==1&&flag==0)
// {
// fm=0;
// delay(50000);
// flag=1;
// }
// else if(hw1==0&&flag==1)
// {
// fm=1;
// delay(50000);
// flag=0;
// }
//}
void shumaguan()
{
if(DX==1) //方式1
{
if(DY==1)
{
// hongwai1();
P0_0=1;
P0_1=0;
P0_2=0;
P0_3=1;
switch(c) //切换闲忙时间范围
{
case 0:miaoa=15+miao;miaob=12+miao;break; //忙
case 1:miaoa=25+miao;miaob=22+miao;break; //不忙
case 2:miaoa=35+miao;miaob=32+miao;break; //闲
default:break;
}
DY=0;
}
if(count==20)
{
miaoa--;
miaob--;
count=0; //50ms计数清零
}
if(miaoa<10&&miaob<7)
{
disp1();
}
if(DZ==0)
{
LED6=1; //灭东绿西红,亮东西黄灯
LED3=1;
LED1=0; //南红北绿,东红西绿
LED4=0;
LED2=1;
LED5=1;
if(miaoa==3&&miaob==0)
{
miaob=3; //东西方向减为0
LED1=1; //灭南红北绿,南北亮黄
LED4=1;
DZ=1;
}
}
if(DZ==1)
{
LED1=1; //灭南红北绿,南北亮黄
LED4=1;
if(count<10)
{
LED2=0; // 南北红灯亮,东西黄灯灭
LED5=0;
}
else {
LED2=1;
LED5=1 ;
}}
if(miaoa==-1&&miaob==-1) //东西南北都减为0
{
DX=0;
DZ=0;
//DY置0,准备方式2
}
}
else if(DX==0)
{ //方式2启动
if(DY==0)
{
// hongwai1();
P0_0=0;
P0_1=1;
P0_2=1;
P0_3=0;
switch(c) //切换闲忙时间范围
{
case 0:miaoa=12+miao;miaob=15+miao;break; //忙
case 1:miaoa=22+miao;miaob=25+miao;break; //不忙
case 2:miaoa=32+miao;miaob=35+miao;break; //闲
default:break;
}
DY=1;
}
if(count==20)
{
miaoa--;
miaob--;
count=0;
}
if(miaob<10&&miaoa<7)
{
disp2() ;
}
if(DB==0)
{
LED1=1; //灭南红北绿,南北亮黄
LED4=1;
LED3=0; //南绿北红,东绿西红
LED6=0;
LED2=1;
LED5=1 ;
if(miaob==3&&miaoa==0)
{
miaoa=3;
LED6=1;
LED3=1; //灭东绿西红,亮东西黄灯
DB=1 ;
}
}
if(DB==1)
{
LED6=1; //灭东绿西红,亮东西黄灯
LED3=1;
if(count<10)
{
LED2=0; // 南北红灯亮,东西黄灯灭
LED5=0;
}
else {LED2=1;
LED5=1 ;
}}
if(miaob==-1&&miaoa==-1)
{
DX=1;
DB=0; //转为方式1
}
}
}
void disp() //显示函数
{
unsigned char led1[]={0,1,0,1,0,1,0,1,0,1};
unsigned char led2[]={0,0,1,1,0,0,1,1,0,0};
unsigned char led3[]={0,0,0,0,1,1,1,1,0,0};
unsigned char led4[]={0,0,0,0,0,0,0,0,1,1};
P2_7=led4[miaoa/10%10]; //显示十位 西东
P2_6=led3[miaoa/10%10];
P2_5=led2[miaoa/10%10];
P2_4=led1[miaoa/10%10];
P2_3=led4[miaob/10%10]; //南北
P2_2=led3[miaob/10%10];
P2_1=led2[miaob/10%10];
P2_0=led1[miaob/10%10];
shi=0;
delay(5);
shi=1;
P2_7=led4[miaoa%10]; //显示十位 西东
P2_6=led3[miaoa%10];
P2_5=led2[miaoa%10];
P2_4=led1[miaoa%10];
P2_3=led4[miaob%10]; //南北
P2_2=led3[miaob%10];
P2_1=led2[miaob%10];
P2_0=led1[miaob%10];
ge=0;
delay(5);
ge=1;
}
void disp1()
{
unsigned char led1[]={0,1,0,1,0,1,0,1,0,1};
unsigned char led2[]={0,0,1,1,0,0,1,1,0,0};
unsigned char led3[]={0,0,0,0,1,1,1,1,0,0};
unsigned char led4[]={0,0,0,0,0,0,0,0,1,1};
P0_7=led4[miaoa]; //显示十位 西东
P0_6=led3[miaoa];
P0_5=led2[miaoa];
P0_4=led1[miaoa];
P3_5=0;
delay(5);
P3_5=1;
}
void disp2()
{
unsigned char led1[]={0,1,0,1,0,1,0,1,0,1};
unsigned char led2[]={0,0,1,1,0,0,1,1,0,0};
unsigned char led3[]={0,0,0,0,1,1,1,1,0,0};
unsigned char led4[]={0,0,0,0,0,0,0,0,1,1};
P0_7=led4[miaob]; //南北
P0_6=led3[miaob];
P0_5=led2[miaob];
P0_4=led1[miaob];
P3_5=0;
delay(5);
P3_5=1;
}
void main()
{
TMOD=0x10;
TH1=(65536-50000)/256; //设置T1计数初值高八位
TL0=(65536-50000)%256; //设置T1计数初值低八位
EA=1;
while(1)
{
while(!sw)
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
超级交通灯(proteus仿真).rar
(224.99 KB, 下载次数: 34)
2017-8-28 21:19 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
renqian4436
时间:
2017-12-14 08:48
不错不错
作者:
578293667
时间:
2018-4-18 18:16
很棒很棒
作者:
yuchen173
时间:
2018-5-24 16:47
大佬,发个说明书吧,没有看懂按键和左上角的led显示啥意思
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1