找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3091|回复: 0
打印 上一主题 下一主题
收起左侧

我的交通灯的课程设计

[复制链接]
跳转到指定楼层
楼主
ID:214646 发表于 2017-6-26 10:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是之前做的一个交通灯的仿真和原理图,很实用,可以用来参考和课程设计,分享给大家。
#include <REGX52.H>

typedef unsigned char u8;
typedef unsigned int u16;

void Time_Initialize(void);
void SEG_Display_4(u8 *BUFF);
//管脚定义

#define SEG_PORT_D P0//数码管端口定义
sbit SEG_PORT_W1 = P2^0;
sbit SEG_PORT_W2 = P2^1;
sbit SEG_PORT_W3 = P2^2;
sbit SEG_PORT_W4 = P2^3;

//变量定义
code u8 SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};//数码管显示的编码0--9
u8 SEG_SWITCH_NUM = 0;//数码管切换变量
u8 SEG_SWITCH_TEMP = 0x01;//用作移位的变量

sbit LED_RED_EW = P3^0;//东西走向灯控制
sbit LED_YELLOW_EW = P3^1;
sbit LED_GREEN_EW = P3^2;

sbit LED_RED_SN = P3^3;//南北走向灯控制
sbit LED_YELLOW_SN = P3^4;
sbit LED_GREEN_SN = P3^5;

sbit KEY_MODE = P1^0;//正常或者紧急模式切换按键

u8 RunModeNom = 0;//正常运行步骤

u8 RunTime = 25;//时间
u8 RunTime_SN = 25;//时间
u8 RunTime_EW = 25;//时间

u8 SysMode = 0;//0表示正常运行模式 1表示非正常运行

void main(void)//主程序
{
        u8 DisplayBuff[4] = {10,10,10,10};
        Time_Initialize();//定时器初始化
        while(1)
        {
                if(!KEY_MODE)//模式按键按下
                {
                        SysMode = ~SysMode;
                        while(!KEY_MODE);
                }
                if(SysMode == 0)
                {
                        TR0 = 1;//打开定时器
                        DisplayBuff[0] = RunTime_EW / 10;//显示时间倒计时
                        DisplayBuff[1] = RunTime_EW % 10;
                        DisplayBuff[2] = RunTime_SN / 10;
                        DisplayBuff[3] = RunTime_SN % 10;
                }
                else
                {
                        TR0 = 0;//关闭定时器
                        DisplayBuff[0] = 10;//不显示
                        DisplayBuff[1] = 10;
                        DisplayBuff[2] = 10;
                        DisplayBuff[3] = 10;
                        LED_RED_SN = 1;
                        LED_YELLOW_SN = 0;//东西亮黄灯
                        LED_GREEN_SN = 0;
                        LED_RED_EW = 1;
                        LED_YELLOW_EW = 0;
                        LED_GREEN_EW = 0;//东西亮绿灯
                }
                SEG_Display_4(DisplayBuff);
        }
}

void Time_Initialize(void)//定时50ms
{
        TMOD = 0x01;
        TL0 = 0xb0 ;                     
        TH0 = 0x3c ;
        TR0 = 1;
        ET0 = 1;
        EA = 1;
}

u16 TIM_Count = 0;

void Tm0_Isr() interrupt 1//定时器中断
{
        TL0 = 0xb0 ;                     
        TH0 = 0x3c ;
        TIM_Count ++;
        if(TIM_Count >= 20)//表示1s
        {
                TIM_Count = 0;
                if(RunTime == 0)
                {
                        RunModeNom ++;
                        if(RunModeNom >= 2) RunModeNom = 0;//循环
                        if(RunModeNom == 0)
                        {
                                RunTime = 25;
                        }
                        else if(RunModeNom == 1)
                        {
                                RunTime = 30;
                        }
                }
                else
                {
                        RunTime --;
                }
                if(RunModeNom == 0)
                {
                        LED_RED_SN = 1;
                        LED_YELLOW_SN = 0;
                        LED_GREEN_SN = 0;//都是红灯
                        RunTime_SN = RunTime;
                        if(RunTime > 5)
                        {
                                LED_RED_EW = 0;
                                LED_YELLOW_EW = 0;
                                LED_GREEN_EW = 1;//东西亮绿灯
                                RunTime_EW = RunTime - 2;
                        }
                        else if((RunTime <= 5)&&(RunTime > 2))
                        {
                                LED_RED_EW = 0;
                                LED_YELLOW_EW = 0;
                                LED_GREEN_EW = !LED_GREEN_EW;//东西绿灯闪烁
                                RunTime_EW = RunTime - 2;
                        }
                        else if(RunTime <= 2)
                        {
                                RunTime_EW = RunTime;
                                LED_RED_EW = 0;
                                LED_YELLOW_EW = 1;//东西亮黄灯
                                LED_GREEN_EW = 0;
                        }
                }
                else if(RunModeNom == 1)
                {
                        LED_RED_EW = 1;
                        LED_YELLOW_EW = 0;
                        LED_GREEN_EW = 0;//都是红灯
                        RunTime_EW = RunTime;
                        if(RunTime > 5)
                        {
                                LED_RED_SN = 0;
                                LED_YELLOW_SN = 0;
                                LED_GREEN_SN = 1;//东西亮绿灯
                                RunTime_SN = RunTime - 2;
                        }
                        else if((RunTime <= 5)&&(RunTime > 2))
                        {
                                LED_RED_SN = 0;
                                LED_YELLOW_SN = 0;
                                LED_GREEN_SN = !LED_GREEN_SN;//东西绿灯闪烁
                                RunTime_SN = RunTime - 2;
                        }
                        else if(RunTime <= 2)
                        {
                                LED_RED_SN = 0;
                                LED_YELLOW_SN = 1;//东西亮黄灯#include <REGX52.H>

typedef unsigned char u8;
typedef unsigned int u16;

void Time_Initialize(void);
void SEG_Display_4(u8 *BUFF);
//管脚定义

#define SEG_PORT_D P0//数码管端口定义
sbit SEG_PORT_W1 = P2^0;
sbit SEG_PORT_W2 = P2^1;
sbit SEG_PORT_W3 = P2^2;
sbit SEG_PORT_W4 = P2^3;

//变量定义
code u8 SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};//数码管显示的编码0--9
u8 SEG_SWITCH_NUM = 0;//数码管切换变量
u8 SEG_SWITCH_TEMP = 0x01;//用作移位的变量

sbit LED_RED_EW = P3^0;//东西走向灯控制
sbit LED_YELLOW_EW = P3^1;
sbit LED_GREEN_EW = P3^2;

sbit LED_RED_SN = P3^3;//南北走向灯控制
sbit LED_YELLOW_SN = P3^4;
sbit LED_GREEN_SN = P3^5;

sbit KEY_MODE = P1^0;//正常或者紧急模式切换按键

u8 RunModeNom = 0;//正常运行步骤

u8 RunTime = 25;//时间
u8 RunTime_SN = 25;//时间
u8 RunTime_EW = 25;//时间

u8 SysMode = 0;//0表示正常运行模式 1表示非正常运行

void main(void)//主程序
{
        u8 DisplayBuff[4] = {10,10,10,10};
        Time_Initialize();//定时器初始化
        while(1)
        {
                if(!KEY_MODE)//模式按键按下
                {
                        SysMode = ~SysMode;
                        while(!KEY_MODE);
                }
                if(SysMode == 0)
                {
                        TR0 = 1;//打开定时器
                        DisplayBuff[0] = RunTime_EW / 10;//显示时间倒计时
                        DisplayBuff[1] = RunTime_EW % 10;
                        DisplayBuff[2] = RunTime_SN / 10;
                        DisplayBuff[3] = RunTime_SN % 10;
                }
                else
                {
                        TR0 = 0;//关闭定时器
                        DisplayBuff[0] = 10;//不显示
                        DisplayBuff[1] = 10;
                        DisplayBuff[2] = 10;
                        DisplayBuff[3] = 10;
                        LED_RED_SN = 1;
                        LED_YELLOW_SN = 0;//东西亮黄灯
                        LED_GREEN_SN = 0;
                        LED_RED_EW = 1;
                        LED_YELLOW_EW = 0;
                        LED_GREEN_EW = 0;//东西亮绿灯
                }
                SEG_Display_4(DisplayBuff);
        }
}

void Time_Initialize(void)//定时50ms
{
        TMOD = 0x01;
        TL0 = 0xb0 ;                     
        TH0 = 0x3c ;
        TR0 = 1;
        ET0 = 1;
        EA = 1;
}

u16 TIM_Count = 0;

void Tm0_Isr() interrupt 1//定时器中断
{
        TL0 = 0xb0 ;                     
        TH0 = 0x3c ;
        TIM_Count ++;
        if(TIM_Count >= 20)//表示1s
        {
                TIM_Count = 0;
                if(RunTime == 0)
                {
                        RunModeNom ++;
                        if(RunModeNom >= 2) RunModeNom = 0;//循环
                        if(RunModeNom == 0)
                        {
                                RunTime = 25;
                        }
                        else if(RunModeNom == 1)
                        {
                                RunTime = 30;
                        }
                }
                else
                {
                        RunTime --;
                }
                if(RunModeNom == 0)
                {
                        LED_RED_SN = 1;
                        LED_YELLOW_SN = 0;
                        LED_GREEN_SN = 0;//都是红灯
                        RunTime_SN = RunTime;
                        if(RunTime > 5)
                        {
                                LED_RED_EW = 0;
                                LED_YELLOW_EW = 0;
                                LED_GREEN_EW = 1;//东西亮绿灯
                                RunTime_EW = RunTime - 2;
                        }
                        else if((RunTime <= 5)&&(RunTime > 2))
                        {
                                LED_RED_EW = 0;
                                LED_YELLOW_EW = 0;
                                LED_GREEN_EW = !LED_GREEN_EW;//东西绿灯闪烁
                                RunTime_EW = RunTime - 2;
                        }
                        else if(RunTime <= 2)
                        {
                                RunTime_EW = RunTime;
                                LED_RED_EW = 0;
                                LED_YELLOW_EW = 1;//东西亮黄灯
                                LED_GREEN_EW = 0;
                        }
                }
                else if(RunModeNom == 1)
                {
                        LED_RED_EW = 1;
                        LED_YELLOW_EW = 0;
                        LED_GREEN_EW = 0;//都是红灯
                        RunTime_EW = RunTime;
                        if(RunTime > 5)
                        {
                                LED_RED_SN = 0;
                                LED_YELLOW_SN = 0;
                                LED_GREEN_SN = 1;//东西亮绿灯
                                RunTime_SN = RunTime - 2;
                        }
                        else if((RunTime <= 5)&&(RunTime > 2))
                        {
                                LED_RED_SN = 0;
                                LED_YELLOW_SN = 0;
                                LED_GREEN_SN = !LED_GREEN_SN;//东西绿灯闪烁
                                RunTime_SN = RunTime - 2;
                        }
                        else if(RunTime <= 2)
                        {
                                LED_RED_SN = 0;
                                LED_YELLOW_SN = 1;//东西亮黄灯
                                LED_GREEN_SN = 0;
                                RunTime_SN = RunTime;
                        }
                }
        }
}

void SEG_Display_4(u8 *BUFF)//一共显示4位
{
        SEG_PORT_D =         SEG_CODE[10];//段选都不亮
        if(SEG_SWITCH_NUM == 0)
        {
                SEG_PORT_W1 = 1;
                SEG_PORT_W2 = 0;
                SEG_PORT_W3 = 0;
                SEG_PORT_W4 = 0;
        }
        else if(SEG_SWITCH_NUM == 1)
        {
                SEG_PORT_W1 = 0;
                SEG_PORT_W2 = 1;
                SEG_PORT_W3 = 0;
                SEG_PORT_W4 = 0;
        }
        else if(SEG_SWITCH_NUM == 2)
        {
                SEG_PORT_W1 = 0;
                SEG_PORT_W2 = 0;
                SEG_PORT_W3 = 1;
                SEG_PORT_W4 = 0;
        }
        else if(SEG_SWITCH_NUM == 3)
        {
                SEG_PORT_W1 = 0;
                SEG_PORT_W2 = 0;
                SEG_PORT_W3 = 0;
                SEG_PORT_W4 = 1;
        }
        SEG_PORT_D =         SEG_CODE[*(BUFF + SEG_SWITCH_NUM)];
        SEG_SWITCH_NUM ++;
        if(SEG_SWITCH_NUM >= 4)
        {
                SEG_SWITCH_NUM = 0;
        }
}
                                LED_GREEN_SN = 0;
                                RunTime_SN = RunTime;
                        }
                }
        }
}

void SEG_Display_4(u8 *BUFF)//一共显示4位
{
        SEG_PORT_D =         SEG_CODE[10];//段选都不亮
        if(SEG_SWITCH_NUM == 0)
        {
                SEG_PORT_W1 = 1;
                SEG_PORT_W2 = 0;
                SEG_PORT_W3 = 0;
                SEG_PORT_W4 = 0;
        }
        else if(SEG_SWITCH_NUM == 1)
        {
                SEG_PORT_W1 = 0;
                SEG_PORT_W2 = 1;
                SEG_PORT_W3 = 0;
                SEG_PORT_W4 = 0;
        }
        else if(SEG_SWITCH_NUM == 2)
        {
                SEG_PORT_W1 = 0;
                SEG_PORT_W2 = 0;
                SEG_PORT_W3 = 1;
                SEG_PORT_W4 = 0;
        }
        else if(SEG_SWITCH_NUM == 3)
        {
                SEG_PORT_W1 = 0;
                SEG_PORT_W2 = 0;
                SEG_PORT_W3 = 0;
                SEG_PORT_W4 = 1;
        }
        SEG_PORT_D =         SEG_CODE[*(BUFF + SEG_SWITCH_NUM)];
        SEG_SWITCH_NUM ++;
        if(SEG_SWITCH_NUM >= 4)
        {
                SEG_SWITCH_NUM = 0;
        }
} 交通灯2.zip (56.46 KB, 下载次数: 12)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表