找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的红绿灯Proteus仿真设计

[复制链接]
ID:472123 发表于 2021-4-8 14:17 | 显示全部楼层 |阅读模式
51单片机模拟红绿灯仿真原理图如下(proteus仿真工程和程序文件可到本帖附件中下载)

仿真

仿真


单片机代码如下:
  1. #include<reg52.h>  

  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define ON 0
  5. #define OFF 1
  6.         
  7.         sbit g1=P1^0;
  8.         sbit y1=P1^1;
  9.         sbit l1=P1^2;
  10.         sbit g2=P1^3;
  11.         sbit y2=P1^4;
  12.         sbit l2=P1^5;
  13.          
  14.         uchar num,num1,key,a,b,c,d;
  15.         uint t0,t1; /*t0,t1,要大于255!!*/  
  16.         uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0};
  17.         /*uchar code table[]={ 0xf9,0xdb,0xa4,0xb0,0x80,0x90,0x88,0x83,0x99,0x92,0x82,0xf8, 0xc6,0xa1,0x86,0x8e,0xff};*/  
  18.         
  19. void init();                 //初值函数
  20.         
  21. void display(uchar a,uchar b,uchar c,uchar d);  //显示程序
  22.         
  23. void Keyscan();  
  24.         
  25. void delay (uint z)           //延时函数
  26. {
  27.          uint x,y;  
  28.         for(x=z;x>0;x--)   
  29.                 for(y=110;y>0;y--);
  30. }

  31. void main()
  32. {     
  33.         init();  
  34.         while(1)  
  35.         {
  36.                   display(a,b,c,d);   
  37.                 Keyscan();
  38.                   if(key)    //如果有按键按下,   
  39.                 {   
  40.                         TR0=0;
  41.                            TR1=0;    //不计时   
  42.                         P0=table[9];  //显示99   
  43.                         P2=0;    //全部显示   
  44.                         if(key==1)    //东西方向   
  45.                         {
  46.                             P1=0xde;   //LED状态   
  47.                         }
  48.                            if(key==2)    //南北方向   
  49.                         {
  50.                             P1=0xf3; //LED状态   
  51.                         }
  52.                            while(key)   
  53.                         {
  54.                             Keyscan();    //等待按下正常  
  55.                           }
  56.                            if(t0<=400)
  57.                             P1=0xde;      //11 01 1 110  绿红   
  58.                         else if(t0>400&&t0<=460)
  59.                             P1=0xdd;      //11 01 1 101    黄红   
  60.                         else if(t0>460&&t0<=920)
  61.                      if(t1>860)       //南北为黄灯        
  62.                                 P1=0xeb;      //11 10 1 011      
  63.                         else
  64.                                 P1=0xf3;        //11 11 0 011         
  65.                                 TR0=1;   
  66.                                 TR1=1;   
  67.                 }  
  68.         }   
  69. }  

  70. void Keyscan()
  71. {
  72.          uchar temp;  
  73.         temp=P3;
  74.          while(temp!=0xff)  
  75.         {
  76.                   delay(5);    //延时,消抖
  77.                   temp=P3;     //再次确认是否有健按下
  78.                   temp=temp&0xff;   
  79.                 while(temp!=0xff)   
  80.                 {
  81.                            temp=P3;  
  82.                            switch(temp)   
  83.                         {
  84.                             case 0xfe:key=1;      break;     
  85.                                 case 0xfd:key=2;      break;     
  86.                                 case 0xfb:key=0;      break;   
  87.                         }
  88.                            while(temp!=0xff)   //松手检测   
  89.                         {
  90.                             temp=P3;     
  91.                                 temp=temp&0xff;   
  92.                         }   
  93.                 }  
  94.         }
  95. }
  96.          
  97. void init()                 //初值函数
  98. {
  99.         g1=ON;  
  100.         y1=OFF;  
  101.         l1=OFF;  
  102.         g2=OFF;  
  103.         y2=OFF;  
  104.         l2=ON;  
  105.         num=20;  
  106.         num1=25;  
  107.         a=num/10;  
  108.         b=num%10;  
  109.         c=num1/10;  
  110.         d=num1%10;
  111.          
  112.         TMOD=0x11;
  113.          TH0=(65536-50000)/256;  
  114.         TL0=(65536-50000)%256;  
  115.         TH1=(65536-50000)/256;  
  116.         TL1=(65536-50000)%256;  
  117.         EA=1;  
  118.         ET0=1;  
  119.         ET1=1;  
  120.         TR0=1;  
  121.         TR1=1;
  122. }

  123. void timer0() interrupt 1   //定时器0中断
  124. {
  125.         TH0=(65536-50000)/256;  
  126.         TL0=(65536-50000)%256;  
  127.         t0++;
  128.         if(t0%20==0)    //每一秒进入 一次  
  129.         {
  130.                   if(t0<=400)   //绿灯 时间   
  131.                 {   
  132.                         num--;
  133.                            if(num==0)    //绿灯结束,开黄灯   
  134.                         {     
  135.                                 num=5;     
  136.                                 g1=OFF;     
  137.                                 y1=ON;     
  138.                                 l1=OFF;   
  139.                         }   
  140.                 }
  141.                  if(t0>400&&t0<=500)  //黄灯时间   
  142.                 {   
  143.                         num--;
  144.                            if(num==0)   //黄灯结束,开红灯   
  145.                         {
  146.                             num=25;     
  147.                                 g1=OFF;
  148.                                 y1=OFF;     
  149.                                 l1=ON;   
  150.                         }   
  151.                 }
  152.                   if(t0>500&&t0<=1000)   //红灯时间   
  153.                 {   
  154.                         num--;
  155.                            if(num==0)  //红灯结束,开绿灯   
  156.                         {
  157.                             num=20;     
  158.                                 g1=ON;     
  159.                                 y1=OFF;     
  160.                                 l1=OFF;   
  161.                         }   
  162.                         if(t0==1000)     
  163.                         t0=0;   
  164.                 }   
  165.                 a=num/10;   
  166.                 b=num%10;  
  167.         }
  168. }  

  169. void timer1() interrupt 3   //定时器1中断
  170. {
  171.         TH1=(65536-50000)/256;  
  172.         TL1=(65536-50000)%256;  
  173.         t1++;  
  174.         if(t1%20==0)  
  175.         {
  176.                 if(t1<=500)   
  177.                 {
  178.                            num1--;   
  179.                         if(num1==0)   
  180.                         {
  181.                             num1=20;     
  182.                                 g2=ON;     
  183.                                 y2=OFF;     
  184.                                 l2=OFF;   
  185.                         }   
  186.                 }
  187.                   if(t1>500&&t1<=900)   
  188.                 {
  189.                            num1--;   
  190.                         if(num1==0)   
  191.                         {
  192.                             num1=5;     
  193.                                 g2=OFF;     
  194.                                 y2=ON;
  195.                                 l2=OFF;   
  196.                         }  
  197.                 }
  198.                   if(t1>900&&t1<=1000)   
  199.                 {
  200.                            num1--;   
  201.                         if(num1==0)   
  202.                         {
  203.                             num1=25;     
  204.                                 g2=OFF;     
  205.                                 y2=OFF;     
  206.                                 l2=ON;   
  207.                         }
  208.                            if(t1==1000)     
  209.                         t1=0;   
  210.                 }
  211.                   c=num1/10;   
  212.                 d=num1%10;  
  213.         }
  214. }

  215. /*void display(uchar a,uchar b,uchar c,uchar d) //显示程序
  216. {         
  217.         P0=table[a];  P2=1;  delay(1);  P2=255;  
  218.          P0=table[b];  P2=2;  delay(1);  P2=255;  
  219.          P0=table[c];  P2=4;  delay(1);  P2=255;  
  220.          P0=table[d];  P2=8;  delay(1);  P2=255;  } */

  221. void display(uchar a,uchar b,uchar c,uchar d) //显示程序
  222. {  
  223.         P0=table[a];  P2=0xfe;  delay(1);  P2=0xff;  
  224.          P0=table[b];  P2=0xfd;  delay(1);  P2=0xff;  
  225.          P0=table[c];  P2=0xfb;  delay(1);  P2=0xff;  
  226.          P0=table[d];  P2=0xf7;  delay(1);  P2=0xff;  
  227. }
复制代码
全部资料51hei下载地址:
红绿灯(proteus仿真+程序).rar (77.63 KB, 下载次数: 35)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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