单片机交流
直播中

京五环以外

10年用户 3188经验值
擅长:EMC/EMI设计
私信 关注
[问答]

怎么利用51单片机实现交通灯的设计?

怎么利用51单片机实现交通灯的设计?

回帖(1)

王利祥

2021-9-29 11:42:04
给大家分享一下前段时间做的基于51单片机的交通灯设计,用于大家学习交流,希望能给大家带来一点点帮助。


所需元器件如下:
STC89C52RC芯片 *1
10K电阻 *1
330Ω电阻 *22
10uF 电解电容 *1
22pF 瓷片电容 *2
12MHz晶振 *1
按键 *1
8550 *8
单位7段数码管 *8
黄色LED *4
红色LED *4
绿色LED *4


程序代码如下:
#include"reg51.h"


#define LEDSS1 0     //定义数码管对应存储数组下标号
#define LEDSS2 1     //定义数码管对应存储数组下标号
#define LEDSN1 2     //定义数码管对应存储数组下标号
#define LEDSN2 3     //定义数码管对应存储数组下标号
#define LEDSW1 4     //定义数码管对应存储数组下标号
#define LEDSW2 5     //定义数码管对应存储数组下标号
#define LEDSE1 6     //定义数码管对应存储数组下标号
#define LEDSE2 7     //定义数码管对应存储数组下标号


***it NSG=P3^0;       //定义南北方向绿灯
***it NSY=P3^1;       //定义南北方向黄灯
***it NSR=P3^2;       //定义南北方向红灯
***it WEG=P3^3;       //定义东西方向绿灯
***it WEY=P3^4;       //定义东西方向黄灯
***it WER=P3^5;       //定义东西方向红灯


unsigned char code LED[12]=   //定义数码管显示数组
        {
        0XC0,0XF9,0XA4,0XB0,0X99,0X92,
        0X82,0XF8,0X80,0X90,0XFF,0XF6
        };
       
unsigned char code dispbit[8]=  //定义数码管位选
        {
        0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F
        };
       
unsigned char dat[9]={0,0,0,0,0,0,0,0}; //可调用数码管显示数组


void delay(unsigned int x)
{
        unsigned char i;
        while(x--)
        {
                for(i=0;i<100;i++);
        }
}
void save_dat(unsigned char second)
{
       
        dat[LEDSS1]=second/10;   //北方向秒十位存储
        dat[LEDSS2]=second%10;   //北方向秒个位存储
        dat[LEDSN1]=second/10;   //南方向秒十位存储
        dat[LEDSN2]=second%10;   //南方向秒个位存储
        dat[LEDSW1]=second/10;   //西方向秒十位存储
        dat[LEDSW2]=second%10;   //西方向秒个位存储
        dat[LEDSE1]=second/10;   //东方向秒十位存储
        dat[LEDSE2]=second%10;   //东方向秒个位存储
}
void main(void)
{
        unsigned char ledcount=0;
        unsigned int circle_count=0;
        unsigned        char second=25;
        unsigned char jtd_status=1;
        unsigned char flash_count=3;


        NSG=1;
        NSY=1;
        NSR=0;
        WEG=1;               
        WEY=1;               
        WER=0;
        save_dat(second);


                while(1)
                {
                        switch(jtd_status)
                        {
                                case 1:
                                        if(circle_count%200==0)
                                        {
                                                NSR=1;
                                                WER=0;                                               
                                                NSG=0;
                                                WEY=1;
                                                save_dat(second);
                                                second--;
                                               
                                        }
                                        if(circle_count>3200)
                                        {
                                                circle_count=0;
                                                jtd_status=2;
                                        }
                                break;
                                case 2:
                                        if(circle_count>200)
                                        {
                                                NSG=1;
                                                circle_count=0;
                                                save_dat(second);
                                                second--;
                                                flash_count--;
                                                if(flash_count>0)
                                                        jtd_status=3;
                                                else
                                                        jtd_status=4;
                                        }
                                break;
                                case 3:
                                        if(circle_count>200)
                                        {
                                                NSG=0;
                                                circle_count=0;
                                                save_dat(second);
                                                second--;
                                                jtd_status=2;
                                               
                                        }
                                break;
                                case 4:
                                        if(circle_count>200)
                                        {
                                                NSY=0;
                                                circle_count=0;
                                                save_dat(second);
                                                second--;                                                                                               
                                                                       
                                                if(second==0)
                                                {
                                                        jtd_status=5;
                                                        second=25;
                                                }
                                        }
                                break;
                                case 5:
                                        if(circle_count%200==0)
                                        {
                                                NSG=1;
                                                NSY=1;
                                                NSR=0;
                                                WER=1;
                                                WEY=1;
                                                WEG=0;
                                                save_dat(second);
                                                second--;                                               
                                        }
                                        if(circle_count>3200)
                                        {
                                                circle_count=0;
                                                jtd_status=6;
                                                flash_count=3;
                                        }
                                break;
                                case 6:
                                        if(circle_count>200)
                                        {                                               
                                                WEG=1;
                                                circle_count=0;
                                                save_dat(second);
                                                second--;
                                                flash_count--;
                                                if(flash_count>0)
                                                        jtd_status=7;
                                                else
                                                        jtd_status=8;
                                        }
                                break;
                                case 7:
                                        if(circle_count>200)
                                        {
                                                WEG=0;
                                                circle_count=0;
                                                save_dat(second);
                                                second--;
                                                jtd_status=6;
                                               
                                        }
                                break;
                                case 8:
                                        if(circle_count>200)
                                        {
                                                circle_count=0;
                                                WEY=0;
                                                WEG=1;
                                                save_dat(second);
                                                second--;                                                                                                                               
                                                if(second==0)
                                                {
                                                        jtd_status=1;
                                                        second=25;
                                                        flash_count=3;
                                                }
                                        }
                                break;
                                default:break;
                        }
                        P2=0xff;
                        P0=LED[dat[ledcount]];
                        P2=dispbit[ledcount];
                        ledcount++;
                        if(ledcount>7)
                        ledcount=0;
                        delay(5);
                        circle_count++;
                }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分