找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C51仿真实现交通灯+单片机代码

[复制链接]
跳转到指定楼层
楼主
观察十字路口红绿灯工作流程,设计交通灯。
1、初始时:南北向、东西向直行左转均为红灯
2、南北向直行:
①南北向直行绿灯亮,延时若干秒
②启动南北向左转数码管显示:倒计时6秒;同时南北向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后南北向直行绿灯灭,南北向直行黄灯亮,延时3秒
③南北向左转数码管倒计时显示结束,关闭;同时南北向直行黄灯灭,南北向直行红灯亮
3、南北向左转:
①南北向左转绿灯亮,延时若干秒
②启动东西向直行数码管显示:倒计时6秒;同时南北向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后南北向左转绿灯灭,南北向左转黄灯亮,延时3秒
③东西向直行数码管倒计时显示结束,关闭;同时南北向左转黄灯灭,南北向左转红灯亮
4、东西向直行:
①东西向直行绿灯亮,延时若干秒
②启动东西向左转数码管显示:倒计时6秒;同时东西向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后东西向直行绿灯灭,东西向直行黄灯亮,延时3秒
③东西向左转数码管倒计时显示结束,关闭;同时东西向直行黄灯灭,东西向直行红灯亮
5、东西向左转:
①东西向左转绿灯亮,延时若干秒
②启动南北向直行数码管显示:倒计时6秒;同时东西向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后东西向左转绿灯灭,东西向左转黄灯亮,延时3秒
③南北向直行数码管倒计时显示结束,关闭;同时东西向左转黄灯灭,东西向左转红灯亮

电路原理图如下:


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit LX0=P3^0;
  6. sbit LX1=P3^1;
  7. bit bp=0;
  8. uchar m,n,k;
  9. uchar time1[]={20,120};//数码管第一状态5s,第二状态6s
  10. uchar time2[]={100,10,60};//交通灯第一状态5s,第二状态3s,第三状态3s
  11. uint index1=1;
  12. uint index2=0;
  13. uchar tt[]={0x20,0x04};
  14. uint t=0;
  15. uint flag=0;
  16. uchar code table[]={
  17. 0x3f,0x06,0x5b,0x4f,
  18. 0x66,0x6d,0x7d,0x07,
  19. 0x7f,0x6f,0x77,0x7c,
  20. 0x39,0x5e,0x79,0x71,
  21. 0x00
  22. };
  23. uchar P2_0=0x01;//(P2.0~P2.3)选择数码管
  24. uchar P1_01=0x21;
  25. uchar P1_02=0x09;
  26. int number=6;
  27. void showNumber()
  28. {
  29.         if(index1==0)
  30.         {
  31.                 P2=P2_0;        
  32.                 P0=~table[number];
  33.                 if(number==0)
  34.                 {
  35.                         P2=0x00;
  36.                         P2_0<<=1;
  37.                         if(P2_0==0x10)
  38.                                 P2_0=0x01;
  39.                         number=6;
  40.                         index1=1;
  41.                 }
  42.         }
  43. }
  44. void openLight()
  45. {
  46.         switch(index2)
  47.         {
  48.                 case 0:
  49.                 if(m==time2[index2])
  50.                 {
  51.                         m=0;
  52.                         index2=1;        
  53.                 }        
  54.                 break;
  55.                 case 1:
  56.                 if(m==time2[index2])
  57.                 {
  58.                         m=0;
  59.                         k++;
  60.                         if(bp==0)
  61.                                 P1_01=P1_01^tt[t];
  62.                         else
  63.                                 P1_02=P1_02^tt[t];
  64.                         if(k==8)
  65.                         {
  66.                                 k=0;
  67.                                 t=(t+1)%2;
  68.                                 index2=2;
  69.                                 if(bp==0)
  70.                                 {
  71.                                         if(t==1)
  72.                                                 P1_01=0x11;
  73.                                         else
  74.                                                 P1_01=0x0A;
  75.                                 }
  76.                                 else
  77.                                 {
  78.                                         if(t==1)
  79.                                                 P1_02=0x11;
  80.                                         else
  81.                                                 P1_02=0x0A;
  82.                                 }
  83.                                 
  84.                         }
  85.                 }
  86.                 break;
  87.                 case 2:
  88.                 if(m==time2[index2])
  89.                 {
  90.                         flag++;
  91.                         if(bp==0)
  92.                         {
  93.                                 if(flag!=2)
  94.                                         P1_01=0x0C;
  95.                                 else
  96.                                 {
  97.                                         flag=0;
  98.                                         P1_01=0x09;
  99.                                         P1_02=0x21;
  100.                                         bp=~bp;
  101.                                 }
  102.                         }
  103.                         else
  104.                         {
  105.                                 if(flag!=2)
  106.                                         P1_02=0x0C;
  107.                                 else
  108.                                 {
  109.                                         flag=0;
  110.                                         P1_02=0x09;
  111.                                         P1_01=0x21;
  112.                                         bp=~bp;
  113.                                 }
  114.                         }
  115.                         index2=0;
  116.                         m=0;
  117.                 }
  118.                 break;
  119.         }
  120.         P1=0x00;
  121.         LX0=1;
  122.         P1=P1_01;
  123.         LX0=0;

  124.         P1=0x00;
  125.         LX1=1;
  126.         P1=P1_02;
  127.         LX1=0;
  128. }
  129. void main()
  130. {
  131.         P1=0x00;
  132.         EA=1;//打开全局中断允许
  133.         TMOD=0x11;//设置定时器工作方式
  134.         TH0=15535/256;//计时50ms
  135.         TL0=15535%256;
  136.         TH1=15535/256;
  137.         TL1=15535%256;
  138.         ET0=1;//打开计时器中断允许
  139.         ET1=1;
  140.         TR0=1;//启动定时器
  141.         TR1=1;
  142.         while(1)
  143.         {        //openLight();
  144.                 showNumber();
  145.         }
  146. }
  147. void ET_T0() interrupt 1
  148. {
  149.         TH0=15535/256;
  150.         TL0=15535%256;
  151.         m++;
  152.         openLight();
  153. }
  154. void ET_T1() interrupt 3
  155. {
  156.         TH1=15535/256;
  157.         TL1=15535%256;
  158.         n++;
  159.         switch(index1)
  160.         {
  161.                 case 0:
  162.                 if(n==time1[index1])
  163.                 {
  164.                         number=(number-1)%6;
  165.                         n=0;        
  166.                 }        
  167.                 break;
  168.                 case 1:
  169.                 if(n==time1[index1])
  170.                 {
  171.                         index1=0;
  172.                         n=0;
  173.                 }
  174.                 break;
  175.         }
  176. }
复制代码

所有资料51hei提供下载:
交通灯.zip (25.37 KB, 下载次数: 84)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:526182 发表于 2019-5-25 22:51 | 只看该作者
楼主可以抽空注释一下代码的作用吗?
回复

使用道具 举报

板凳
ID:404722 发表于 2019-8-5 18:02 | 只看该作者
nouman 发表于 2019-5-25 22:51
楼主可以抽空注释一下代码的作用吗?

比较忙,不喜欢注释
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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