标题: 基于51单片机的交通信号灯的仿真加源代码 [打印本页]

作者: 无痕乀    时间: 2018-11-26 12:43
标题: 基于51单片机的交通信号灯的仿真加源代码
#include<reg51.h>
#include<rtx51tny.h>
#define uint unsigned int
#define uchar unsigned char

sbit con=P3^2;                 //存储寄存器的时钟输入。

sbit snr=P2^2;                //上升沿时移位寄存器中的数据进入存储寄存器,         
sbit sng=P2^3;                    //下降沿时存储寄存器中的数据保持不变。                                                         
sbit sny=P2^4;                    //应用时通常将ST_CP置为低点平,
sbit ewr=P2^5;                    //移位结束后再在ST_CP端产生一个正脉冲更新显示数据。                 
sbit ewg=P2^6;
sbit ewy=P2^7;

sbit KEY1 = P1^0;      
sbit KEY2 = P1^1;
sbit LA=P2^0;
sbit LB=P2^1;

uchar minute=0;
uchar hour=0;
uchar code DSY_DUAN[]={0x3f,0x06,0x5b,0x4f,0x66,
                                                0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code tew[]={0x06,0x7f,0x06,0x07,0x06,0x7d,0x06, 0x6d,
                                                        0x06,0x66,0x06,0x4f,0x06,0x5b,0x06,0x06,
                                                        0x06,0x3f,0x3f,0x6f,0x3f,0x7f,0x3f,0x07,
                                                        0x3f,0x7d,0x3f,0x6d,0x3f,0x66,0x3f,0x4f,
                                                        0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x06,0x66,
                                                        0x06,0x4f,0x06,0x5b,0x06,0x06,0x06,0x3f,
                                                         0x3f,0x6f,0x3f,0x7f,0x3f,0x07,0x3f,0x7d,
                                                        0x3f,0x6d,0x3f,0x66,0x3f,0x4f,0x3f,0x5b,
                                                        0x3f,0x06,0x3f,0x3f,0x3f,0x4f,0x3f,0x5b,
                                                        0x3f,0x06,0x3f,0x3f};
                                             //东西方向数码管倒计时段码表
unsigned char code tsn[]={0x06,0x66,0x06,0x4f,0x06,0x5b,0x06,0x06,
                                                        0x06,0x3f,0x3f,0x6f,0x3f,0x7f,0x3f,0x07,
                                                        0x3f,0x7d,0x3f,0x6d,0x3f,0x66,0x3f,0x4f,
                                                        0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x3f,0x4f,
                                                        0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x06,0x7f,
                                                        0x06,0x07,0x06,0x7d,0x06,0x6d,0x06,0x66,
                                                        0x06,0x4f,0x06,0x5b,0x06,0x06,0x06,0x3f,
                                     0x3f,0x6f,0x3f,0x7f,0x3f,0x07,0x3f,0x7d,
                                                        0x3f,0x6d,0x3f,0x66,0x3f,0x4f,0x3f,0x5b,
                                                        0x3f,0x06,0x3f,0x3f};
                                            //南北方向数码管倒计时段码表
void delay(uint t)
{
   uchar i;
   while(t--);
   for(i=0;i>250;i++);
}


void job0() _task_ 0
{
    os_create_task(1);
        os_create_task(2);
        os_create_task(3);
        os_create_task(4);
        os_create_task(5);
        os_delete_task(0);
}
void job1() _task_ 1                  //十字路口数码管倒计时部分
{         
        uchar i;
        SCON=0x00;                          //配置串口通信为方式0,八位同步移位寄存器
        con=0;                                  //con先拉低,后拉高
        while(1)
        {
           for(i=0;i<38;i++)             //每两个数码管倒计时部分共有76个段码,
                                      //所以需要乘2才能到达下一个状态。        
              {
                           SBUF=tsn[i*2];              //南北方向9-15数码管扫描
                           while(!TI);
                           TI=0;                          //软件清零部分;
                           SBUF=tsn[i*2+1];      //南北方向1-7数码管扫描
                           while(!TI);
                           TI=0;
                        SBUF=tew[i*2];
                           while(!TI);
                           TI=0;               
                        SBUF=tew[i*2+1];
                           while(!TI);
                           TI=0;                      //接收完毕信号;
                           con=1;                           //595芯片ST_CP端工作;
                           os_wait(K_IVL,10,0);       //延时100ms;
                           con=0;                           //595芯片ST_CP端停止工作;
          }
        }                  
}

void job2() _task_ 2
{
   while(1)
   {
                minute++;                    //分钟加一
                if(minute==60)               //分钟满60;
                {
                        minute=0;                //分钟清零;
                        hour++;                  //小时加一;
                        if(hour==60)             //小时满60;
                        {
                                hour=0;              //小时清零;
                        }

                }
                os_wait(K_IVL,100,0);        //延时1s;
        }
}
void job3() _task_ 3                    //按键检测
{
        while(1)
        {
                if(P1!=0xff)                //有键被按下;
                {
                        delay(10);

                        if(KEY1==0)                    //如果第一个键被按下,分钟个位加一;
                        {
                                minute=minute%10+1;
                                if(minute==60)      //分钟满60清零
                                {
                                        minute=0;
                                }
                        }
                        else if(KEY2==0)        //如果第二个键被按下,小时个位加一;
                        {
                                hour=hour%10+1;
                                if(hour==60)        //小时满60清零
                                {
                                        hour=0;
                                }
                        }
                        while(P1!=0xff);             //判断抬起;   
                }
        }
}

void job4() _task_ 4                    //计时数码管扫描程序
{
        while(1)
        {

                LA=1,LB=1;                            //P2口前两个管脚输入
                P0=DSY_DUAN[minute%10];                //分个
                delay(500);

                LA=1,LB=0;
                P0=DSY_DUAN[hour%10];           //时个
                delay(500);

                LA=0,LB=1;
                P0=DSY_DUAN[minute/10];
                delay(500);

                LA=0,LB=0;
                P0=DSY_DUAN[hour/10];
                delay(500);         
   }         
}

交通灯仿真.png (24.98 KB, 下载次数: 41)

交通灯仿真.png

交通灯.zip

51.1 KB, 下载次数: 19, 下载积分: 黑币 -5

压缩


作者: x1ngyun    时间: 2018-12-5 22:17
你好,请问那个74l815芯片是要实现什么功能
作者: x1ngyun    时间: 2018-12-5 22:19
你好请问那个74l815是要实现什么功能

作者: 564571362    时间: 2019-9-8 16:14
感谢分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1