标题:
简易单片机交通灯Proteus仿真代码
[打印本页]
作者:
愤怒的小呆头
时间:
2020-12-22 11:07
标题:
简易单片机交通灯Proteus仿真代码
本系统采用STC89C52单片机以及单片机最小系统和三极管驱动电路以及外围的按键和数码管显示等部件,设计一个基于单片机的交通灯设计。设计通过两位一体共阴极数码管显示,并能通过按键对定时进行设置。本系统实用性强、操作简单、扩展功能强。设计通过STC89C52单片机以及单片机最小系统和三极管驱动数码管(数码管更亮,白天看的很清楚)以及外围的按键和数码管显示等部件,数码管倒计时显示时间。
提供大家对于单片机的学习。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真截图 (1).png
(95.94 KB, 下载次数: 63)
下载附件
仿真截图
2020-12-22 11:07 上传
单片机源程序如下:
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //宏定义"uchar"代替"unsigned char"。
#define uint unsigned int //宏定义"uint"用来定义无符号整型数。
////数码管段选定义 0 1 2 3 4 5 6 7 8 9
uchar smg_du[]={0x6f,0x03,0x3d,0x3b,0x53,0x7a,0x7e,0x23,0x7f,0x7b}; //断码
uchar dis_smg[4] = {0};
//数码管位选定义
sbit smg_we1 = P2^1; //数码管位选定义
sbit smg_we2 = P2^0;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
char dx_s = 0,nb_s = 0; //东西 南北 倒计时变量
sbit dx_red = P2^7; //东西红灯
sbit dx_yellow = P2^6; //东西黄灯
sbit dx_green = P2^5; //东西绿灯
sbit nb_red = P2^4; //南北红灯
sbit nb_yellow = P2^3; //南北黄灯
sbit nb_green = P2^2; //南北绿灯
bit flag_1s = 0;
bit flag_500ms;
bit flag_dx_nb = 0; //东西南北模式
uchar flag_5m_value;
uchar dx_time = 30,nb_time = 20; //东西、南北的时间
uchar yellow_time = 5;
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<110;j++);
}
/********************************************************************
* 名称 : display()
* 功能 : 数码管显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void display()
{
uchar i;
for(i=0;i<4;i++)
{
P0 = 0x00; //消隐
smg_we_switch(i); //位选
P0 = dis_smg[i]; //段选
delay_1ms(3);
}
}
/*********************定时器0、定时器1初始化******************/
void time0_init()
{
EA = 1; //开总中断
TMOD = 0X11; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/*********************交通灯处理函数*********************************/
void jiaotongdeng_dis()
{
if(flag_1s == 1)
{
flag_1s = 0;
if(flag_dx_nb == 0) //南北时间
{
dx_s --;
nb_s --;
if(dx_s == yellow_time)
nb_s = yellow_time;
}
if(flag_dx_nb == 1) //东西时间
{
dx_s --;
nb_s --;
if(nb_s == yellow_time)
dx_s = yellow_time;
}
if(dx_s <= 0)
{
flag_dx_nb = ~flag_dx_nb;
if(flag_dx_nb == 1)
{
dx_s = dx_time; //东西时间
nb_s = dx_time + yellow_time;
}
else
{
dx_s = nb_time + yellow_time;
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 > yellow_time)
{
dx_red = 0; //亮
dx_green = 1; //灭
dx_yellow = 1; //灭
nb_red = 1; //灭
nb_green = 0; //亮
nb_yellow = 1; //灭
flag_5m_value = 0;
}else if(dx_s <= yellow_time) //当小于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 > yellow_time)
{
dx_red = 1; //灭
dx_green = 0; //亮
dx_yellow = 1; //灭
nb_red = 0; //亮
nb_green = 1; //灭
nb_yellow = 1; //灭
flag_5m_value = 0;
}else if(nb_s <= yellow_time) //当小于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_can = 0; //按键值还原
P1 |= 0x0f;
if((P1 & 0x0f) != 0x0f) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P1 & 0x0f)
{
case 0x0e: key_can = 1; break; //得到按键值
case 0x0d: key_can = 2; break; //得到按键值
case 0x0b: key_can = 3; break; //得到按键值
case 0x07: key_can = 4; break; //得到按键值
}
}
}
else
key_new = 1;
}
uchar menu_1,flag_s;
/********************设置函数*****************/
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 = 1; //灭
dx_green = 1; //灭
dx_yellow = 0; //亮
nb_red = 1; //灭
nb_green = 1; //灭
nb_yellow = 0; //亮
}
if(flag_jdgz == 3) // 东西红灯 南北绿灯
{
dx_red = 0; //亮
dx_green = 1; //灭
dx_yellow = 1; //灭
nb_red = 1; //灭
nb_green = 0; //亮
nb_yellow = 1; //灭
}
if(flag_jdgz == 4) // 南北红灯 东西绿灯
{
dx_red = 1; //灭
dx_green = 0; //亮
dx_yellow = 1; //灭
nb_red = 0; //亮
nb_green = 1; //灭
nb_yellow = 1; //灭
}
dis_smg[0] = 0 ; //不显示
dis_smg[1] = 0 ; //不显示
dis_smg[2] = 0 ; //不显示
dis_smg[3] = 0 ; //不显示
}
if(key_can == 1) //设置键
{
menu_1 ++;
if(menu_1 > 3)
{
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] = 0x00 ; //不显示
dis_smg[3] = 0x00 ; //不显示
}
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] = 0x00 ; //不显示
dis_smg[1] = 0x00 ; //不显示
dis_smg[2] = smg_du[nb_time % 10] ; //显示东西设置的时候
dis_smg[3] = smg_du[nb_time / 10] ;
}
if(menu_1 == 3) //设置黄灯的时间
{
if(key_can == 2)
{
yellow_time ++ ; //加1
if(yellow_time > 99)
yellow_time = 99;
}
if(key_can == 3)
{
yellow_time -- ; //减1
if(yellow_time <= 1)
yellow_time = 1;
}
dis_smg[0] = smg_du[yellow_time % 10] ; //显示黄灯时间
dis_smg[1] = smg_du[yellow_time / 10] ;
dis_smg[2] = smg_du[yellow_time % 10] ; //显示黄灯时间
dis_smg[3] = smg_du[yellow_time / 10] ;
}
}
/********************************************************************
* 名称 : main()
* 功能 : 实现灯的闪烁
* 输入 : 无
* 输出 : 无
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
仿真与程序51hei提供下载:
简易交通灯.rar
(842.89 KB, 下载次数: 117)
2020-12-22 11:05 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1