找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简单的交通灯焊接与程序课程设计报告

[复制链接]
跳转到指定楼层
楼主
简单的交通灯焊接与程序设计用时:5天

本课程设计报告的word版本及完整的程序代码下载地址:
http://www.51hei.com/bbs/dpj-77888-1.html

1 设计目的:

设计一个东西方向和南北方向十字路口的简单交通灯控制系统。

2 设计要求2.1 可以按键设置交通灯东西、南北的倒计时时间
第一次按设置键是设置东西方向的时间,第二次按设置键是设置南北方向的时间,再按加减键就可以设置对应的时间。
22 东西和南北方向各有两个数码管分别显示时间
东西和南北的时间相差5秒,这5秒为黄灯亮的时间。
2.3 当有特殊情况时,可以按紧急模式进行调整.2.4 紧急模式:
当消防车、救护车等特殊车辆通行时按下”紧急模式键”全部亮红灯,待紧急车辆通过后,再恢复后再退出。
2.5 夜间模式:
4个方向黄灯亮起。
2.6 禁止通行
第1次按紧急键4个方向全部亮红灯.
2.7 夜间模式
第2次东西南北4个方向黄灯闪烁
2.8 南北优先通行
第3次南北绿灯亮东西红灯亮
2.9 东西优先通行
第4次南北红灯亮东西绿灯亮
2.10 再按一次回到正常显示
不同的模式适合不同的交通情况(如夜间模式,有交通事故的时候)


3 材料准备
10*15洞洞板1块,
51芯片(STC89C51RC),
母座(或者40pin芯片座或zip座),
红色LED灯1个,
103上拉排阻1个(九个引脚),
10K电阻1个,
1K电阻1个,
30pf瓷片电容2个,
10uf电解电容1个,
单排针,
轻触按键4个,
12.288 MHz晶振1个,
自锁开关(六脚),
杜邦线,
USB转TTL线(下载与供电),
红黄绿LED灯各2个,
3641AH数码管(共阴四位数码管)
4 电路图:*注:关于EA
我使用的STC89C52RC单片机芯片(EA管脚已内部上拉到Vcc)
  •                     如外部不加上拉,或外部上拉到Vcc,上电复位后单片机从内部开始执行程序;
  •                     如外部下拉到地,上电复位后单片机从外部开始执行程序。
根据网上找到的资料画的电路图:
1)去掉了复位电路和电源插孔:
2)再修改后
5 时钟电路


5.1 关于单片机的XTAL1和XTAL2
单片机的XTAL1和XTAL2内部有一片内振荡器结构但仍需要在XTAL1和XTAL2两端连接一个晶振和两个电容才能组成时钟电路,这种使用晶振配合产生信号的方法是内部时钟方式;
5.2 晶振说明
无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来;
5.3 时钟电路的重要性
时钟电路在单片机系统中很重要,它能控制着单片机工作的节奏,是必不可少的部分。单片机运行需要时钟支持——就像计算机的CPU一样,如果没有时钟电路来产生时钟驱动单片机,那单片机就不能执行程序。
6 自锁开关:
六引脚自锁开关是一个双刀双掷开关,除了图上用黑线相连的部分,其他部分均不相连。
7 A103J排阻:
排阻是具有极性,在焊接的时候一定需要注意,如果方向弄错可能导致显示不了。
从图上可以看到排阻左边有一个点标记和103数值。那个点表示那一端的第一个引脚为公共引脚。,而103表示该排阻,前两位数表示数值,最后一位表示倍数即10X10 3=10K。
排阻在原理图中的符号表示:根据图可以发现排阻内部的所有电阻都连接到第一个引脚上,所以第一个引脚肯定就是公共端,见下图。
8 四脚开关:
9 3641AH数码管引脚图:

              对应的字母段码排列            
10 仿真图
11 电路连接测试1正面图:
2背面图:

12 程序分析

  1. #include
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4.               /* I/O口的定义 */
  5. sbit w1_NS=P1^0;              //数码管南北时间的位选               
  6. sbit w2_NS=P1^1;
  7. sbit w1_WE=P1^4;              //数码管东西时间的位选
  8. sbit w2_WE=P2^7;
  9. sbit k1=P3^2;                            //按键的定义
  10. sbit k2=P3^5;
  11. sbit k3=P3^6;
  12. sbit k4=P3^7;
  13. sbit red_NS=P2^1;                            //南北红绿黄灯的定义
  14. sbit yellow_NS=P1^6;
  15. sbit green_NS=P1^5;
  16. sbit red_WE=P2^6;                            //东西红绿黄灯的定义
  17. sbit yellow_WE=P2^4;
  18. sbit green_WE=P2^3;

  19. uchar seconds_NS,seconds_WE,seconds_WE_set,seconds_NS_set,flag_NS,flag_WE,t0,k1num,k4num;            
  20. uchar code table[]={                                          
  21. 0xeb,0x28,0xb3,0xba,0x78,                                                        //数码管译码:分别对应数字0~9
  22. 0xda,0xdb,0xa8,0xfb,0xfa
  23. };                             
  24.                            
  25. void delay(uint z);                              //延时函数
  26. void init();                                            //初始化函数
  27. void display_NS();                              //南北时间显示函数
  28. void display_WE();                              //东西时间显示函数
  29. void LED_display();                              //红路灯的正常模式函数
  30. void keyscan();                                            //按键扫描函数

  31. void main()
  32. {
  33.               init();            
  34.               while(1)
  35.               {               
  36.                             keyscan();
  37.                             display_NS();
  38.                             display_WE();
  39.                             LED_display();                           
  40.               }                                 
  41. }

  42. void delay(uint z)                                                        //延时函数
  43. {
  44.               uint x,y;
  45.               for(x=z;x>0;x--)
  46.                             for(y=110;y>0;y--);
  47. }

  48. void init()                                                                        //初始化函数
  49. {
  50.               t0=0;
  51.               flag_NS=0;
  52.               flag_WE=0;
  53.               seconds_NS_set=10;
  54.               seconds_WE_set=15;
  55.               seconds_NS=seconds_NS_set;
  56.               seconds_WE=seconds_WE_set;
  57.               TMOD=0x01;                                                                      //设置定时器的工作方式为1,定时器工作方式
  58.               TH0=(65536-50000)/256;                              
  59.               TL0=(65536-50000)%256;
  60.               EA=1;                                                        //开总中断
  61.               ET0=1;                                                        //开定时器0的中断
  62.               TR0=1;                                                        //开启定时器0的运行开关
  63.                            
  64. }

  65. void display_NS()                                            //南北时间显示函数
  66. {
  67.               P0=0x00;            
  68.               w1_NS=0;
  69.               P0=table[seconds_NS/10];                            //显示南北时间的十位
  70.               delay(1);                                                                     
  71.               w1_NS=1;                                                                     
  72.                                                                         
  73.               P0=0x00;
  74.               w2_NS=0;
  75.               P0=table[seconds_NS%10];                            ////显示南北时间的个位
  76.               delay(1);                                                                     
  77.               w2_NS=1;
  78.                            
  79. }

  80. void display_WE()                                            //东西时间显示函数
  81. {
  82.               P0=0x00;            
  83.               w1_WE=0;
  84.               P0=table[seconds_WE/10];                //显示东西时间的十位
  85.               delay(1);                                                                     
  86.               w1_WE=1;                                                                     
  87.                                                                         
  88.               P0=0x00;
  89.               w2_WE=0;
  90.               P0=table[seconds_WE%10];                            //显示东西时间的个位
  91.               delay(1);                                                                     
  92.               w2_WE=1;
  93.                            
  94. }                             

  95. void timer0() interrupt 1                 //中断函数,16位加1计数器
  96. {
  97.               TH0=(65536-50000)/256;
  98.               TL0=(65536-50000)%256;
  99.               t0++;
  100.               if(t0==20)
  101.               {
  102.                             t0=0;
  103.                             seconds_NS--;
  104.                             seconds_WE--;                                                      
  105.               }
  106. }

  107. void LED_display()                            //红路灯的正常模式
  108. {
  109.               if(flag_NS==0)                            //flag_NS为0时
  110.               {
  111.                             if(seconds_NS>5)                //南北时间大于5s
  112.                             {
  113.                                           red_NS=1;                              //红灯灭
  114.                                           yellow_NS=1;                //黄灯灭
  115.                                           green_NS=0;                            //绿灯亮                           
  116.                             }
  117.                             else
  118.                             {                                                           //5s内亮黄灯5s
  119.                                           red_NS=1;                           
  120.                                           yellow_NS=0;
  121.                                           green_NS=1;               
  122.                                           if(seconds_NS==0)
  123.                                           {
  124.                                             seconds_NS=seconds_WE_set;
  125.                                             flag_NS=1;
  126.                                           }                                                                                                               
  127.                             }
  128.               }
  129.               if(flag_NS==1)                            // flag_NS为1时
  130.               {
  131.                             if(seconds_NS>5)
  132.                             {
  133.                                           red_NS=0;                            //红灯亮
  134.                                           yellow_NS=1;                //黄灯灭
  135.                                           green_NS=1;                            //绿灯灭            
  136.                             }
  137.                             else
  138.                             {                                                                      //5s内亮黄灯5s
  139.                                           red_NS=1;                             
  140.                                           yellow_NS=0;
  141.                                           green_NS=1;
  142.                                           if(seconds_NS==0)
  143.                                           {
  144.                                             seconds_NS=seconds_NS_set;
  145.                                             flag_NS=0;
  146.                                           }                                                                                                               
  147.                             }            
  148.               }

  149.               if(flag_WE==0)                            //flag_WE为0时
  150.               {
  151.                             if(seconds_WE>5)
  152.                             {
  153.                                           red_WE=0;                              //红灯亮
  154.                                           yellow_WE=1;                //黄灯灭
  155.                                           green_WE=1;                              //绿灯灭
  156.                             }
  157.                             else
  158.                             {                                                           //5s内黄灯亮5s
  159.                                           red_WE=1;
  160.                                           yellow_WE=0;
  161.                                           green_WE=1;
  162.                                           if(seconds_WE==0)
  163.                                           {
  164.                                                         seconds_WE=seconds_NS_set;
  165.                                                         flag_WE=1;
  166.                                           }                           
  167.                             }
  168.               }
  169.               if(flag_WE==1)
  170.               {
  171.                             if(seconds_WE>5)
  172.                             {
  173.                                           red_WE=1;                               //红灯灭
  174.                                           yellow_WE=1;                 //黄灯灭
  175.                                           green_WE=0;                               //绿灯亮
  176.                             }
  177.                             else
  178.                             {                                                          //黄灯亮5s
  179.                                           red_WE=1;
  180.                                           yellow_WE=0;
  181.                                           green_WE=1;
  182.                                           if(seconds_WE==0)
  183.                                           {
  184.                                                         seconds_WE=seconds_WE_set-3;
  185.                                                         flag_WE=0;
  186.                                           }                           
  187.                             }            
  188.               }
  189. }

  190. void keyscan()                            //按键扫描
  191. {
  192.               if(k1==0)
  193.               {            
  194.                             while(!k1);                            //等待按键释放(消抖)
  195.                             k1num++;
  196.                             TR0=0;                           
  197.               }
  198.               if(k1num==1)
  199.               {
  200.                             if(k2==0)
  201.                             {
  202.                                           while(!k2);
  203.                                           seconds_NS_set++;
  204.                                           seconds_NS=seconds_NS_set;
  205.                             //              display_NS();                                                      
  206.                                           if(seconds_NS==100)
  207.                                                         seconds_NS=0;                           
  208.                             }
  209.                             if(k3==0)
  210.                             {
  211.                                           while(!k3);
  212.                                           seconds_NS_set--;
  213.                                           seconds_NS=seconds_NS_set;
  214.                             //              display_NS();
  215.                                           if(seconds_NS==0)
  216.                                                         seconds_NS=99;            
  217.                             }
  218.               }
  219.               if(k1num==2)
  220.               {
  221.                             if(k2==0)
  222.                             {
  223.                                           while(!k2);
  224.                                           seconds_WE_set++;
  225.                                           seconds_WE=seconds_WE_set;            
  226.                             //              display_WE();                                         
  227.                                           if(seconds_WE==100)
  228.                                                         seconds_WE=0;                           
  229.                             }
  230.                             if(k3==0)
  231.                             {
  232.                                           while(!k3);
  233.                                           seconds_WE_set--;
  234.                                           seconds_WE=seconds_WE_set;
  235.                             //              display_WE();
  236.                                           if(seconds_WE==0)
  237.                                                         seconds_WE=99;            
  238.                             }
  239.               }
  240.               if(k1num==3)
  241.               {
  242.                             k1num=0;
  243.                             TR0=1;
  244.               }

  245.               if(k4==0)
  246.               {
  247.                             while(!k4);
  248.                             k4num++;
  249.               }

  250.               /*特殊情况选择模式*/
  251.               switch(k4num)                                                                       
  252.               {
  253.                             case 1:                                                                      //按第1次为紧急模式,禁止通行
  254.                                                         red_WE=0;
  255.                                                         yellow_WE=1;
  256.                                                         green_WE=1;
  257.                                                         red_NS=0;
  258.                                                         yellow_NS=1;
  259.                                                         green_NS=1;
  260.                                                         TR0=0;
  261.                                                         flag_NS=-1;
  262.                                                         flag_WE=-1;
  263.                                                         seconds_NS=99;
  264.                                                         seconds_WE=99;
  265.                                                         break;
复制代码
13 心得体会
本次是第一次焊接,刚开始出现许多错误,修改修改再修改;上网查资料,请教师兄,最后做出来了。这次从中收获许多,学会从网上检索有用的资料,这对我们学习有很大的帮助。对单片机也有了进一步的了解,动手能力、分析能力也增强了,实践很重要,再好的理论如果不能用于实践,那么它就是没有用的。
纸上得来终觉浅,绝知此事要躬行。
感谢。
  





参考资料:
1、单片机最小系统电路图:


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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