标题:
单片机交通灯程序 4个数码管
[打印本页]
作者:
jiayoujiayou121
时间:
2025-4-24 23:22
标题:
单片机交通灯程序 4个数码管
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
//数码管段选定义 0 1 2 3 4 5 6 7 8 9 A B
uchar smg_du[]={0x40,0x75,0x0c,0x14,0x31,0x12,0x02,0x74,0x00,0x10,0x20,0x03,}; //断码
uchar dis_smg[4] = {0}; //数码管显示数组的缓冲区
//数码管位选定义
sbit smg_we1 = P2^0; //数码管位选IO口定义
sbit smg_we2 = P2^1; //数码管位选IO口定义
sbit smg_we3 = P3^6; //数码管位选IO口定义
sbit smg_we4 = P3^7; //数码管位选IO口定义
sbit key1 = P1^0; //按键IO口定义
sbit key2 = P1^1; //按键IO口定义
sbit key3 = P1^2; //按键IO口定义
sbit key4 = P1^3; //按键IO口定义
uchar menu_1; //设置不同参数的变量
char dx_s = 0,nb_s = 0; //东西 南北 倒计时变量
sbit dx_red = P2^7; //东西红灯IO口定义
sbit dx_green = P2^6; //东西绿灯IO口定义
sbit dx_yellow = P2^5; //东西黄灯IO口定义
sbit nb_red = P2^4; //南北红灯IO口定义
sbit nb_green = P2^3; //南北绿灯IO口定义
sbit nb_yellow = P2^2; //南北黄灯IO口定义
bit flag_1s = 0; //1秒的变量
bit flag_500ms; //500毫秒的变量
bit flag_dx_nb = 0; //东西南北模式
uchar dx_time = 30,nb_time = 20; //东西、南北的时间设置的时间
uchar flag_jdgz ; //交通管制
/***********************数码位选函数*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
}
}
/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
uchar i;
/********************************************************************
* 名称 : display()
* 功能 : 数码管显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void display()
{
for(i=0;i<4;i++)
{
P0 = 0xff; //消隐
smg_we_switch(i); //位选
P0 = dis_smg[i]; //段选
delay_1ms(3); //延时
}
}
/*********************定时器0初始化******************/
void time0_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
TH0 = 0x3c;
TL0 = 0xb0; //50ms
}
/*********************交通灯处理函数*********************************/
void jiaotongdeng_dis()
{
if(flag_1s == 1) //1秒执行一次里面的程序
{
flag_1s = 0;
if(flag_dx_nb == 0) //南北绿灯时间
{
dx_s --; //东西倒计时时间减1
nb_s --; //南北倒计时时间减1
if(dx_s == 5)
nb_s = 5;
}
if(flag_dx_nb == 1) //东西绿灯时间
{
dx_s --; //南北倒计时时间减1
nb_s --; //东西倒计时时间减1
if(nb_s == 5)
dx_s = 5;
}
if(dx_s <= 0) //倒计时时间为0切换东西 南北绿灯时间
{
flag_dx_nb = ~flag_dx_nb;
if(flag_dx_nb == 1) //东西时间
{
dx_s = dx_time;
nb_s = dx_time + 5;
}
else //南北时间
{
dx_s = nb_time + 5;
nb_s = nb_time;
}
}
}
dis_smg[0] = smg_du[dx_s % 10] ; //显示东西倒计时 时间
dis_smg[1] = smg_du[dx_s / 10] ;
dis_smg[2] = smg_du[nb_s % 10] ; //显示南北倒计时 时间
dis_smg[3] = smg_du[nb_s / 10] ;
/***********************南北时间绿灯时间*********************************/
if(flag_dx_nb == 0)
{
if(dx_s > 5)
{
dx_red = 0; //东西红灯亮
dx_green = 1; //东西绿灯灭
dx_yellow = 1; //东西黄灯灭
nb_red = 1; //南北红灯灭
nb_green = 0; //南北绿灯亮
nb_yellow = 1; //南北黄灯灭
}else if(dx_s <= 5) //当小于5秒时 黄灯要闪了
{
dx_red = 0; //东西红灯灭
dx_green = 1; //东西绿灯灭
dx_yellow = 1; //东西黄灯灭
nb_red = 1; //南北红灯灭
nb_green = 1; //南北绿灯灭
if(flag_500ms == 0) //黄灯闪烁
{
nb_yellow = 0; //亮
}
else
{
nb_yellow = 1; //灭
}
}
}
/***********************东西时间绿灯时间*********************************/
if(flag_dx_nb == 1)
{
if(nb_s > 5)
{
dx_red = 1; //东西红灯灭
dx_green = 0; //东西绿灯亮
dx_yellow = 1; //东西黄灯灭
nb_red = 0; //南北红灯亮
nb_green = 1; //南北绿灯灭
nb_yellow = 1; //南北黄灯灭
}else if(nb_s <= 5) //当小于5秒时 黄灯要闪了
{
dx_red = 1; //东西红灯灭
dx_green = 1; //东西绿灯灭
nb_red = 0; //南北红灯亮
nb_green = 1; //南北绿灯灭
nb_yellow = 1; //南北黄灯灭
if(flag_500ms == 0) //黄灯闪烁
{
dx_yellow = 0;//东西黄灯亮
}
else
{
dx_yellow = 1;//东西黄灯灭
}
}
}
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new; //key_new 这个变量的功能是做按键松手检测的
key_can = 0; //按键值还原成0
if(key1 == 0 || key2 == 0 || key3 == 0 || key4 == 0) //有按键按下
{
delay_1ms(1); //按键延时消抖动
if(key_new == 1)
{
key_new = 0; //key_new = 0 说明按键已按下
if(key1 == 0) //确认是按键按下
key_can = 1; //得到按键值
if(key2 == 0) //确认是按键按下
key_can = 2; //得到按键值
if(key3 == 0) //确认是按键按下
key_can = 3; //得到按键值
if(key4 == 0) //确认是按键按下
key_can = 4; //得到按键值
}
}
else
key_new = 1; //key_new = 1 说明按键已经松开了
}
/********************设置函数*****************/
void key_with()
{
if(key_can == 4) //交通管制按键 紧急模式
{
flag_jdgz ++;
if(flag_jdgz > 4)
flag_jdgz = 0;
if(flag_jdgz == 1) // 全部亮红灯
{
dx_red = 0; //东西红灯亮
dx_green = 1; //东西绿灯灭
dx_yellow = 1; //东西黄灯灭
nb_red = 0; //南北红灯亮
nb_green = 1; //南北绿灯灭
nb_yellow = 1; //南北黄灯灭
}
if(flag_jdgz == 2) // 东西红灯 南北绿灯
{
dx_red = 0; //东西红灯亮
dx_green = 1; //东西绿灯灭
dx_yellow = 1; //东西黄灯灭
nb_red = 1; //南北红灯灭
nb_green = 0; //南北绿灯亮
nb_yellow = 1; //南北黄灯灭
}
if(flag_jdgz == 3) // 南北红灯 东西绿灯
{
dx_red = 1; //东西红灯灭
dx_green = 0; //东西绿灯亮
dx_yellow = 1; //东西黄灯灭
nb_red = 0; //南北红灯亮
nb_green = 1; //南北绿灯灭
nb_yellow = 1; //南北黄灯灭
}
if(flag_jdgz == 4) // 南北黄灯闪 东西黄灯闪
{
dx_red = 1; //东西红灯灭
dx_green = 1; //东西绿灯灭
nb_red = 1; //南北红灯灭
nb_green = 1; //南北绿灯灭
}
}
if(key_can == 1) //设置键
{
menu_1 ++;
if(menu_1 >= 3)
{
menu_1 = 0; //menu_1 = 0 退出设置,是在正常显示界面下
}
}
if(menu_1 == 1) //设置东西绿灯的时间
{
if(key_can == 2) //加键
{
dx_time ++ ; //设置东西绿灯的时间 加1
if(dx_time > 99)
dx_time = 99;
}
if(key_can == 3) //减键
{
dx_time -- ; //设置东西绿灯的时间 减1
if(dx_time <= 5)
dx_time = 5;
}
dis_smg[0] = smg_du[dx_time % 10] ; //显示设置的东西绿灯的时间 个位数
dis_smg[1] = smg_du[dx_time / 10] ; //显示设置的东西绿灯的时间 十位数
dis_smg[2] = smg_du[10] ; //显示为A
dis_smg[3] = smg_du[10] ; //显示为A
}
if(menu_1 == 2) //设置南北绿灯的时间
{
if(key_can == 2) //加键
{
nb_time ++ ; //设置南北绿灯的时间 加1
if(nb_time > 99)
nb_time = 99;
}
if(key_can == 3) //减键
{
nb_time -- ; //设置南北绿灯的时间 减1
if(nb_time <= 5)
nb_time = 5;
}
dis_smg[0] = smg_du[11] ; //显示为B
dis_smg[1] = smg_du[11] ; //显示为B
dis_smg[2] = smg_du[nb_time % 10] ; //显示设置的南北绿灯的时间 个位数
dis_smg[3] = smg_du[nb_time / 10] ; //显示设置的南北绿灯的时间 十位数
}
}
/********************************************************************
* 名称 : main()
* 功能 : 实现灯的闪烁
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
time0_init(); //定时器初始化程序
dx_s = nb_time + 5; //南北时间
nb_s = nb_time ; //东西时间
while(1)
{
key(); //按键函数
if(key_can > 0) //有按键按下
key_with(); //按键处理设置函数
if((menu_1 == 0) && (flag_jdgz == 0))
jiaotongdeng_dis(); //交通灯处理函数
if(flag_jdgz == 4) //夜间模式
if(flag_500ms == 1) // 南北黄灯闪 东西黄灯闪
{
flag_500ms = 0;
nb_yellow = ~nb_yellow; // 南北黄灯闪
dx_yellow = ~dx_yellow; // 东西黄灯闪
}
display(); //数码管显示函数
}
}
/*********************定时器0中断服务程序************************/
void time0_int() interrupt 1
{
static uchar value; //定时50ms中断一次
TH0 = 0x3c;
TL0 = 0xb0; //50ms
value ++;
if(value % 10 == 0)
flag_500ms = ~flag_500ms; //定时产生一个500毫秒的变量
if(value >= 20)
{
value = 0;
flag_1s = 1; //定时产生一个1秒的变量
}
}
复制代码
# 交通灯 4个数码管 大 1.zip
2025-4-24 23:21 上传
点击文件名下载附件
下载积分: 黑币 -5
528.64 KB, 下载次数: 0, 下载积分: 黑币 -5
程序,原理图
作者:
zwxzj
时间:
2025-5-12 07:13
这个程序写的非常好,运行稳定可靠。
作者:
zwxzj
时间:
2025-5-13 22:40
有事请教
作者:
1600485495
时间:
2025-5-19 01:33
这个程序非常好
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1