标题:
51单片机实现红绿灯控制的代码+Proteus仿真
[打印本页]
作者:
Zerozz
时间:
2018-11-30 14:08
标题:
51单片机实现红绿灯控制的代码+Proteus仿真
51实现红绿灯控制仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(20.4 KB, 下载次数: 112)
下载附件
2018-11-30 16:31 上传
单片机源程序如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
//定义共阴数码管段码0-9
uchar code segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
sbit A_R = P2 ^ 0; // 定义A路的红灯
sbit A_Y = P2 ^ 1; // 定义A路的黄灯
sbit A_G = P2 ^ 2; // 定义A路的绿灯
sbit B_R = P2 ^ 3; // 定义B路的红灯
sbit B_Y = P2 ^ 4; // 定义B路的黄灯
sbit B_G = P2 ^ 5; // 定义B路的绿灯
sbit A_SEG_EN_1 = P0 ^0; // 定义A路的数码管的第一个位的使能
sbit A_SEG_EN_2 = P0 ^1; // 定义A路的数码管的第二个位的使能
sbit B_SEG_EN_1 = P0 ^2; // 定义B路的数码管的第一个位的使能
sbit B_SEG_EN_2 = P0 ^3; // 定义B路的数码管的第二个位的使能
sbit key = P0 ^ 7; // 紧急按键
bit flag = 0; // 标志是否处于紧急状态,紧急状态flag=1
//作用:延时 z ms
//参数:z
//返回值:
void delay(uint z) // 利用不停的运行空代码来消耗时间
{
uint x, y;
for (x = z; x>0; x--)
for (y = 110; y>0; y--);
}
void check_buttn()
{
//检测按键key
if (key == 0) // 如果按键被按下
{
delay(10); // 消抖
if (key == 0) // 确认按键被按下
{
flag = !flag; // 紧急标志位取反
while (!key); // 等待按键释放
}
}
}
void seg_display(int numA, int numB)
{
P0 |= 0x7F; // 关闭所有数码管的片选
P3 = segment[numA/10]; // 显示A路计时的十位
A_SEG_EN_1 = 0; // 打开A路的十位的使能
P1 = segment[numB/10]; // 显示B路计时的十位
B_SEG_EN_1 = 0; // 打开B路的十位的使能
delay(5); // 延时,是数据在数码管上停留一段时间
P0 |= 0x7F; // 关闭所有数码管的片选
P3 = segment[numA%10]; // 显示A路计时的个位
A_SEG_EN_2 = 0; // 打开A路的个位的使能
P1 = segment[numB%10]; // 显示B路计时的个位
B_SEG_EN_2 = 0; // 打开B路的个位的使能
delay(5); // 延时,是数据在数码管上停留一段时间
}
void display(int numA, int numB)
{
int i = 0;
int temp = P2; // 保存红绿灯的状态
for(i=0; i<50; i++)
{
check_buttn(); // 按键检测
if(flag) // 如果处于紧急状态
{
while(flag) // 紧急状态中
{
P2 = 0x09; // 将AB路都变成红灯
seg_display(numA, numB); // 显示计时
check_buttn(); // 按键检测
}
P2 = temp; // 还原进入紧急之前的状态
}
seg_display(numA, numB); // 显示计时
}
}
void main()
{
int j=0;
P2 = 0; //先关闭所有的红绿灯,为了防止刚打开仿真的时候有闪烁
while(1)
{
A_G = 1;
B_R = 1;
for (j=10; j>=0; j--)
display(j/2, j/2);
P2 = 0;
for (j=5; j>=0; j--)
{
A_Y = 1;
B_R = 1;
display(j, j+25);
A_Y = 0;
B_R = 1;
display(j, j+25);
}
P2 = 0;
A_R = 1;
B_G = 1;
for (j=25; j>=0; j--)
display(j+5, j);
P2 = 0;
A_R = 1;
B_Y = 1;
for (j=5; j>=0; j--)
display(j, j);
P2 = 0;
}
}
复制代码
所有资料51hei提供下载:
交通灯.rar
(48.19 KB, 下载次数: 228)
2018-11-30 14:07 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
北燕思缘
时间:
2018-11-30 20:07
可以,顶一下
作者:
Vantage666
时间:
2020-12-7 11:50
这个还是十字路口的
作者:
alexxhtyz
时间:
2021-12-16 13:09
能发一下元件表吗
作者:
AINA2019
时间:
2022-5-8 15:49
有原件表吗
作者:
17867122535
时间:
2024-12-24 14:58
AINA2019 发表于 2022-5-8 15:49
有原件表吗
原件图
作者:
17867122535
时间:
2024-12-24 14:58
有原件图不
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1