找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2358|回复: 0
收起左侧

单片机交通信号灯TrafficLight仿真与源码

[复制链接]
ID:411308 发表于 2018-10-17 19:21 | 显示全部楼层 |阅读模式
交通信号灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1.    #include<reg51.h>
  2.    #define uchar unsigned char
  3.    #define uint unsigned int
  4.    sbit P1_0=P1^0;
  5.    sbit P1_2=P1^2;
  6.    sbit P1_3=P1^3;
  7.    sbit P1_5=P1^5;
  8.    sbit P3_0=P3^0;
  9.    sbit P3_1=P3^1;
  10.    sbit P3_4=P3^4;
  11.    sbit P3_5=P3^5;
  12.    sbit P3_6=P3^6;
  13.    sbit P3_7=P3^7;
  14.    uchar n=90,f0=0,f1=0,a=0;
  15.    uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//1-9
  16.    void init()        //初始化函数
  17.    {
  18.         IT1=1;                                   //外部中断1采用跳沿触发方式
  19.         IT0=1;                                   //外部中断0采用跳沿触发方式
  20.         TMOD=0x11;                          //T1,T0都采用方式1工作
  21.         TH0=(65536-50000)/256;//定时初值50毫秒
  22.         TL0=(65536-50000)%256;
  23.         TR0=1;                                  //启动定时器/计数器0
  24.         IP=0X01;                           //外部中断0为高优先级
  25.         IE=0X87;
  26.    }
  27.   void delay1()
  28.   {
  29.      uchar i,j;
  30.          for(i=0;i<10;i++)
  31.             for(j=0;j<33;j++)
  32.                    ;
  33.   }
  34.   void delayn(uint n)
  35.   {
  36.           uint i;
  37.         for(i=0;i<n;i++)
  38.         delay1();
  39.   }
  40.   void timer0() interrupt 1//定时器T0中断,实现倒计时
  41.   {
  42.         TH0=(65536-50000)/256;
  43.         TL0=(65536-50000)%256;
  44.         a++;                       
  45.         if(a==20) //没记一次为0.05秒,一共计20次为1秒,然后a重新归零计数,总时间n减1
  46.         {               
  47.                 a=0;
  48.                 n--;
  49.         }               
  50.         if(f1==0)
  51.         {
  52.             P1=0XF3;//南北方向绿灯亮,东西方向红灯亮
  53.                 if(n<=6) //绿灯闪烁倒计时计数
  54.                 {  
  55.                   if(a==10)
  56.                   {
  57.                    P1_2=!P1_2;        //绿灯闪烁
  58.                   }
  59.                 }                                                                                                   
  60.                    if(n==0)          //黄灯倒计时
  61.                    {
  62.                       delayn(500);
  63.                           P1=0XF5;
  64.                           delayn(500);
  65.                    }       
  66.         }
  67.         if(f0==0)
  68.         {
  69.                 if(n==0)
  70.                 {
  71.                         n=50;
  72.                         f1=1;
  73.                 }
  74.         }       
  75.         if(f1==1)
  76.         {
  77.             P1=0XDE;  //东西方向绿灯亮
  78.                 if(n<=6) //当时间剩6秒时绿灯闪烁
  79.                 {
  80.                 if(a==10)
  81.                  {
  82.                   P1_5=!P1_5;
  83.                  }
  84.                 }
  85.                 if(n==0)   //黄灯
  86.                  {  
  87.                     delayn(500);
  88.                         P1=0XEE;
  89.                         delayn(500);
  90.                  }
  91.                 f0=1;
  92.                 if(n==0)
  93.                 {
  94.                         n=90;
  95.                         f1=0;
  96.                         f0=0;
  97.                 }       

  98.         }
  99.   }
  100.         void display()        //倒计时计数,让数码管显示相应的数字
  101.         {
  102.           while(1)
  103.           {
  104.           if(P1_0==0)
  105.           {
  106.            P0=seg[n%10];
  107.            P3_5=1;
  108.            delayn(5);
  109.            P3_5=0;
  110.            delayn(10);
  111.            P0=seg[n/10];
  112.            P3_4=1;
  113.            delayn(5);
  114.            P3_4=0;
  115.          }
  116.            if(P1_3==0)
  117.            {
  118.            P2=seg[n%10];
  119.            P3_7=1;
  120.            delayn(5);
  121.            P3_7=0;
  122.            P2=seg[n/10];
  123.            P3_6=1;
  124.        delayn(5);
  125.            P3_6=0;
  126.            delayn(10);
  127.            }
  128.           }
  129.         }
  130.    void int0() interrupt 0 //紧急情况1:四个方向都亮红灯
  131.    {
  132.             int n2;
  133.          P3_4=P3_5=P3_6=P3_7=0;
  134.          for(n2=0;n2<40;n2++)
  135.          {
  136.            delayn(1000);
  137.            P1=0XF6;
  138.          }
  139.          
  140.    }
  141.     void int1() interrupt 2       
  142.    {
  143.              int n2,n3;
  144.           P3_4=P3_5=P3_6=P3_7=0;
  145.           if(P3_1==0)  //紧急情况2:东西方向同行,南北方向禁止通行
  146.           {
  147.              P3_0=1;
  148.                  P1=0xDE;
  149.                  for(n2=0;n2<30;n2++)  //执行30秒恢复正常
  150.                  {
  151.                    delayn(1000);
  152.                    P1=0XDE;
  153.                  }
  154. ……………………

  155. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
新建文件夹 (4).rar (292.04 KB, 下载次数: 13)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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