找回密码
 立即注册

QQ登录

只需一步,快速开始

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

智能交通灯代码原理图与PCB图(AD制作)

[复制链接]
跳转到指定楼层
楼主
基于单片机控制的[url=]智能[/url]交通灯

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. sbit  k1=P1^6;
  6. sbit  k2=P1^7;
  7. sbit  k3=P2^7;
  8. sbit  k4=P3^0;

  9. sbit yellowled_nb=P1^4;        //南北黄灯
  10. sbit yellowled_dx=P1^1;        //东西黄灯
  11. uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴
  12. uchar data dig;        //位选
  13. uchar data led;        //偏移量
  14. uchar data buf[4];
  15. uchar data sec_dx=20;//东西数码指示值
  16. uchar data sec_nb=20;//南北数码指示值
  17. uchar data set_timedx=20;
  18. uchar data set_timenb=20;//倒计时设置的键值保存

  19. uchar data b;//定时器中断次数
  20. bit time;//灯状态循环标志
  21. bit int0_time;//中断强行标志
  22. bit   set;//调时方向切换键标志
  23. void delay(int ms);//延时子程序
  24. void key();//按键扫描子程序
  25. void key_to1();//键处理子程序
  26. void key_to2();
  27. void display();//显示子程序
  28. void main()
  29. {
  30.         TMOD=0X01;        
  31.         TH0=0X3C;
  32.         TL0=0XB0;
  33.         EA=1;
  34.         ET0=1;
  35.         TR0=1;

  36.         EX0=1;
  37.         EX1=1;
  38.         P1=0Xf3;// 东西通行
  39.         while(1)
  40.         {
  41.                 key(); //调用按键扫描程序
  42.                 display(); //调用显示程序

  43.         }        
  44. }



  45. void key()        //按键扫描子程序
  46. {
  47.         if(k1!=1)
  48.         {
  49.                 delay(10);
  50.                 if(k1!=1)
  51.                 {
  52.                         while(k1!=1);
  53.                         key_to1();
  54.                 }
  55.         }

  56.         if(k2!=1)
  57.         {
  58.                 delay(10);
  59.                 if(k2!=1)
  60.                 {
  61.                         while(k2!=1);
  62.                         key_to2();
  63.                 }
  64.         }
  65.          
  66.           if(k4!=1)
  67.          {
  68.                  delay(10);
  69.                  if(k4!=1)
  70.                  {
  71.                          while(k4!=1);
  72.                          set=!set;
  73.                  }
  74.          }

  75.         if(k3!=1&&int0_time==1)
  76.         {        
  77.                 TR0=1;   //启动定时器
  78.                 sec_nb=20;
  79.                 sec_dx=20;
  80.                 int0_time=0;//清标志
  81.                
  82.          }         else if(k3!=1&&int0_time==0)
  83.                     {
  84.                         TR0=1;
  85.                         set_timenb=sec_nb;
  86.                         set_timedx=sec_dx; //设置的键值返回保存
  87.                         }
  88.          
  89. }

  90. void display()
  91. {
  92.                
  93.                 buf[1]=sec_dx/10; //第1位 东西秒十位
  94.                 buf[2]=sec_dx%10; //第2位 东西秒个位
  95.                 buf[3]=sec_nb/10; //第3位 南北秒十位
  96.                 buf[0]=sec_nb%10; //第4位 南北秒个位
  97.                
  98.                 P0=table[buf[led]];
  99.                 delay(2);        //先延时,提前显示一位了
  100.                 P2=dig;
  101.                 dig=_crol_(dig,1);
  102.                 led++;
  103.                 if (led==4)
  104.                 {led=0;
  105.                 dig=0xfe;
  106.                 }
  107. }

  108. void time0(void) interrupt 1 using 1  //定时中断子程序
  109. {
  110.         b++;
  111.         if(b==10)          // 定时器中断次数。
  112.         {
  113.                 b=0;
  114.                 sec_dx--;
  115.                 sec_nb--;
  116. /******************南北黄灯闪烁判断*************************/               
  117.                 if(sec_nb==3&&time==0)
  118.                
  119.                         {
  120.                          yellowled_nb=1;//南北黄灯亮
  121.                          delay(300);
  122.                          yellowled_nb=0;
  123.                          }
  124.                         
  125.                         if(sec_nb==2&&time==0)
  126.                         {
  127.                         yellowled_nb=1;//南北黄灯亮
  128.                          delay(300);
  129.                          yellowled_nb=0;
  130.                         }
  131.                         
  132.                         if(sec_nb==1&&time==0)
  133.                         {
  134.                         yellowled_nb=1;
  135.                          delay(300);
  136.                          yellowled_nb=0;
  137.                            }
  138.                  
  139. /*******************东西黄灯闪判断************************/                    
  140.                 if(sec_dx==3&&time==1)
  141.                 {
  142.                          yellowled_dx=1;//南北黄灯亮
  143.                          delay(300);
  144.                          yellowled_dx=0;
  145.                 }
  146.                         
  147.                         if(sec_dx==2&&time==1)
  148.                         {
  149.                         yellowled_dx=1;//南北黄灯亮
  150.                          delay(300);
  151.                          yellowled_dx=0;
  152.                         }
  153.                         
  154.                         if(sec_dx==1&&time==1)
  155.                         {
  156.                         yellowled_dx=1;
  157.                          delay(300);
  158.                          yellowled_dx=0;
  159.                            }        
  160.                         
  161.                
  162. /*******************************************/


  163.                         if(sec_dx==0||sec_nb==0) //东西或南北先到达1S时即开始重新计时
  164.                         {
  165.                                 sec_dx=set_timedx;
  166.                                 sec_nb=set_timenb; //第一次循环结束重置

  167.                                  if(time==1)
  168.                                 {
  169.                                         P1=0XF3;  //东西通行
  170.                                 }
  171.                                 else
  172.                                 {
  173.                                         P1=0xde; //南北通行
  174.                                 }
  175.                                 time=!time;   //取反
  176.                                 
  177.                         }
  178.                
  179.         }
  180. }

  181. void key_to1()
  182. {
  183.         TR0=0;         //关定时器
  184.         
  185.         if(set==0)
  186.         sec_nb++; //南北加1S
  187.         else
  188.         sec_dx++;//东西加1S
  189.         
  190.         if(sec_nb==100)
  191.                 sec_nb=1;
  192.         if(        sec_dx==100)
  193.                 sec_dx=1;//加到100置1
  194.         
  195. }
  196. void key_to2()
  197. {
  198.         TR0=0;//关定时器
  199.         
  200.         if(set==0)
  201.         sec_nb--;  //南北减1S
  202.         else
  203.         sec_dx--;  //东西减1S
  204.         if(sec_nb==0)
  205.                 sec_nb=99;        
  206.         if(        sec_dx==0 )
  207. ……………………

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

所有资料51hei提供下载:
7e26631c4e26dbdaaa2dc0d451d0e189.rar (1.34 MB, 下载次数: 75)



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

使用道具 举报

沙发
ID:72444 发表于 2017-6-20 16:20 | 只看该作者
不错,支持下
回复

使用道具 举报

板凳
ID:1035448 发表于 2022-6-20 09:43 | 只看该作者
有没有运行结果图啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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