找回密码
 立即注册

QQ登录

只需一步,快速开始

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

交通灯系统 原理图,PCB(AD格式)单片机程序都有

[复制链接]
跳转到指定楼层
楼主
51单片机左的交通灯控制系统 原理图,PCB,程序都有.

交通灯的原理图(ad画的 需要用ad打开,里面也有pdf版本)

交通灯的pcb图(有2个版本):


交通灯的单片机源程序:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dongxi_red=P1^3;                                        //东西方向红灯定义
  5. sbit dongxi_yellow=P3^6;                                //东西方向黄灯定义
  6. sbit dongxi_green=P3^7;                                        //东西方向绿灯定义
  7. sbit nanbei_red=P1^2;                                        //南北方向红灯定义
  8. sbit nanbei_yellow=P1^1;                                //南北方向黄灯定义
  9. sbit nanbei_green=P1^0;                                        //南北方向绿灯定义
  10. uchar tab[]={0xbf,0x7f,0xef,0xdf};                //数码管位选
  11. uchar IRtime;                                                        //红外解码时间次数
  12. uchar IRbyte[4];                                                //红外一字节
  13. uchar IRdate[33];                                                //红外数据码,用户码,停止码共33位
  14. uchar IRbyte_ok,IRdate_ok;                                //接收一字节完成标志位,解码完成标志位

  15. bit flag=0;
  16. uchar num=45,num1=40,shi,ge,shi1,ge1,i;
  17. uchar table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管段选

  18. void delay(uchar z)                                //延时
  19. {
  20.         uchar k,l;
  21.         for(k=0;k<110;k++)
  22.                 for(l=0;l<z;l++);
  23. }

  24. void dongxi__red()           //东西方向红灯亮,黄绿灯都灭,南北方向绿灯亮,红黄灯灭
  25. {
  26.         dongxi_red=0;
  27.         dongxi_yellow=1;
  28.         dongxi_green=1;
  29.         nanbei_red=1;
  30.         nanbei_yellow=1;
  31.         nanbei_green=0;
  32. }

  33. void nanbei__yellow()  //东西方向红灯亮,黄绿灯都灭,南北方向黄灯亮,红绿灯灭
  34. {
  35.         dongxi_red=0;
  36.         dongxi_yellow=1;
  37.         dongxi_green=1;
  38.         nanbei_red=1;
  39.         nanbei_yellow=0;
  40.         nanbei_green=1;
  41. }

  42. void nanbei__red()          //南北方向红灯亮,黄绿灯都灭,东西方向绿灯亮,红黄灯灭
  43. {
  44.         dongxi_red=1;
  45.         dongxi_yellow=1;
  46.         dongxi_green=0;
  47.         nanbei_red=0;
  48.         nanbei_yellow=1;
  49.         nanbei_green=1;
  50. }

  51. void dongxi__yellow()  //南北方向红灯亮,黄绿灯都灭,东西方向黄灯亮,红绿灯灭
  52. {
  53.         dongxi_red=1;
  54.         dongxi_yellow=0;
  55.         dongxi_green=1;
  56.         nanbei_red=0;
  57.         nanbei_yellow=1;
  58.         nanbei_green=1;
  59. }

  60. void number(uchar num,num1)                   //两个数码管分别求个位和十位
  61. {
  62.         shi=num/10;
  63.         ge=num%10;
  64.         shi1=num1/10;
  65.         ge1=num1%10;
  66. }

  67. void display(uchar shi,ge)                  //数码管显示
  68. {
  69.         P2=tab[1];
  70.         P0=0x00;
  71.         P0=table[shi];
  72.         delay(5);

  73.         P2=tab[0];
  74.         P0=0x00;
  75.         P0=table[ge];
  76.         delay(5);
  77. }

  78. void display1(uchar shi1,ge1)         //数码管显示
  79. {
  80.         P2=tab[3];
  81.         P0=0x00;
  82.         P0=table[shi1];
  83.         delay(5);

  84.         P2=tab[2];
  85.         P0=0x00;
  86.         P0=table[ge1];
  87.         delay(5);
  88. }

  89. void start()                           //定时器0、1,外中断0初始化
  90. {
  91.         EA=1;
  92.         EX0=1;
  93.         EX1=1;
  94.         IT0=1;
  95.         IT1=1;
  96.         ET0=ET1=1;
  97.         TMOD=0X21;                 
  98.         TH1=0X00;
  99.         TL1=0X00;
  100.         TH0=(65536-50000)/256;
  101.         TL0=(65536-50000)%256;
  102.         TR0=TR1=1;
  103. }

  104. void first()                                //一开始东西方向亮红灯45秒,南北绿灯40秒
  105. {
  106.         if(num>5)
  107.                 {
  108.                         dongxi__red();
  109.                         number(num,num1);
  110.                         display(shi,ge);
  111.                         display1(shi1,ge1);
  112.                 }
  113.                 if(num<=5)                        //南北绿灯亮完了亮黄灯5秒
  114.                 {
  115.                         nanbei__yellow();
  116.                         number(num,num1);
  117.                         display(shi,ge);
  118.                         display1(shi1,ge1);
  119.                         if(num==0){num=45;num1=40;flag=1;}
  120.                 }
  121. }

  122. void second()                                //南北红灯45秒,东西绿灯40秒
  123. {
  124.         if(num>5)
  125.                 {
  126.                         nanbei__red();
  127.                         number(num1,num);
  128.                         display(shi,ge);
  129.                         display1(shi1,ge1);
  130.                 }
  131.                         if(num<=5)                //东西绿灯结束,亮黄灯5秒
  132.                         {
  133.                                 dongxi__yellow();
  134.                                 number(num1,num);
  135.                                 display(shi,ge);
  136.                                 display1(shi1,ge1);
  137.                                 if(num==0){num=45;num1=40;flag=0;}
  138.                         }                        
  139. }

  140. void all_red()                           //双向禁行,亮红灯,数码管关闭
  141. {
  142.         dongxi_red=0;
  143.         dongxi_yellow=1;
  144.         dongxi_green=1;
  145.         nanbei_red=0;
  146.         nanbei_yellow=1;
  147.         nanbei_green=1;
  148.         P2=0x00;
  149.         P0=0x00;
  150. }

  151. void nanbei_all_red()           //南北方向禁行,亮红灯数码管关闭,东西方向正常工作
  152. {
  153.         for(num=45;num>0;)
  154.         {
  155.                 dongxi_red=0;
  156.                 dongxi_yellow=1;
  157.                 dongxi_green=1;
  158.                 nanbei_red=0;
  159.                 nanbei_yellow=1;
  160.                 nanbei_green=1;
  161.                 number(num,num1);
  162.                 display(shi,ge);
  163.         }
  164.         for(num=40;num>0;)
  165.         {
  166.                 nanbei__red();
  167.                 number(num,num1);
  168.                 display(shi,ge);
  169.         }
  170.         for(num=5;num>0;)
  171.         {
  172.                 dongxi__yellow();
  173.                 number(num,num1);
  174.                 display(shi,ge);
  175.         }
  176.         
  177. }

  178. void dongxi_all_red()                 //东西方向禁行,亮红灯数码管关闭,南北方向正常工作
  179. {
  180.         for(num=45;num>0;)
  181.         {
  182.                 dongxi_red=0;
  183.                 dongxi_yellow=1;
  184.                 dongxi_green=1;
  185.                 nanbei_red=0;
  186.                 nanbei_yellow=1;
  187.                 nanbei_green=1;
  188.                 number(num,num1);
  189.                 display1(shi,ge);
  190.         }
  191.         for(num=40;num>0;)
  192.         {
  193.                 dongxi__red();
  194.                 number(num,num1);
  195.                 display1(shi,ge);
  196.         }
  197.         for(num=5;num>0;)
  198.         {
  199.                 nanbei__yellow();
  200.                 number(num,num1);
  201.                 display1(shi,ge);
  202.         }
  203.         
  204. }

  205.                                                                   
  206. void jiema()                          //红外解码
  207. {
  208.         uchar i,j,k=1;
  209.         for(i=0;i<4;i++)
  210.         {
  211.                 for(j=0;j<8;j++)
  212.                 {
  213.                         if(IRdate[k]>5)
  214.                                 IRbyte[i] |=0x80;
  215.                         if(j<7)
  216.                                 IRbyte[i]>>=1;
  217.                         k++;
  218.                 }
  219.         }
  220.         IRbyte_ok=1;
  221. }

  222. void display2()                         //比对收到的信号
  223. {
  224.         switch(IRbyte[2])         
  225.         {
  226.                 case 0x45 :while(1) all_red();                 //按下该键两个方向都持续亮红灯
  227.             case 0x46 :while(1) dongxi_all_red();          //按下该键东西方向持续亮红灯
  228.             case 0x47 :while(1) nanbei_all_red();           //按下该键南北方向持续亮红灯
  229.         }  
  230. }


  231. void main()
  232. {
  233.         start();                          //初始化
  234.         while(1)
  235.         {        
  236.                 if(!flag)
  237.                 first();
  238.                 if(flag)
  239.                 second();
  240.                 if(IRdate_ok)                          //红外接收完成
  241.                 {
  242.                         jiema();                           //解码
  243.                         IRdate_ok=0;                   //标志位清零
  244.                         if(IRbyte_ok)                   //如果解码完成,做相关指令
  245.                         {
  246.                                 display2();
  247.                                 IRbyte_ok=0;            //解码完成标志清零
  248.                         }
  249.                 }
  250.         }
  251. }

  252. void ex0() interrupt 0                           //外中断0用来接收红外脉冲
  253. {
  254.         static uchar i;                                   //静态变量i
  255.         static bit flag;
  256.         if(flag)                                           //如果flag为1执行一下操作
  257.         {                                 
  258.                 if((IRtime<53)&&(IRtime>=32))        //IRtime在此范围内说明接收到红外起始信号           
  259.                 i=0;
  260.                 IRdate[i]=IRtime;                                //将IRtime的值保存到数组中
  261.                 IRtime=0;
  262.                 i++;
  263.                 if(i==33)                                                //如果i=33接收到停止位
  264.                 {
  265.                         i=0;
  266.                         IRdate_ok=1;
  267.                 }
  268.         }
  269.         else                                                                //flag不为1时执行
  270.         {
  271.                 IRtime=0;                                                //IRtime数值清零
  272.                 flag=1;                                                        //flag置1
  273.         }
  274. }

  275. void et0() interrupt 1                                        //定时器0用来控制交通灯的时间
  276. {
  277.         TH0=(65536-50000)/256;                                //重装初值
  278.         TL0=(65536-50000)%256;
  279.         i++;
  280.         if(i==20)
  281.         {
  282.                 i=0;
  283.                 num--;
  284.                 num1--;
  285.                 if(num1==0)
  286.                 num1=5;
  287.         }
  288. }


  289. void time0() interrupt 3                                //定时器1用来计算收到的红外脉宽

  290. …………余下代码请下载附件…………
复制代码




交通灯源码和pcb原理图资料下载:http://www.51hei.com/bbs/dpj-54314-1.html


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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