找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机原理及应用课程设计论文模板-交通信号灯模拟控制系统

[复制链接]
跳转到指定楼层
楼主
资料包内容:



课程设计论文模板:


目录
摘要    I
1    课程论文内容与要求:    I
2    硬件系统的设计    I
2.1    各元器件选择及其功能介绍    I
2.2    STC89C5X    II
2.3    单片机最小系统    VI
2.4    紧急通行模块    IX
2.5    忙等通行模块    X
2.6    总电路图    X
3    软件系统的设计    XII
3.1    概要设计    XII
3.1.1    程序流程图    XII
4    系统调试    XIII
4.1    功能测试    XIII
4.1.1    正常运行模块    XIII
4.1.2    紧急通行模块    XIV
4.1.3    忙等通行模块    XIV
5    收获与体会    XVI
附录    I
源程序清单    I
参考文献    I

单片机源程序如下:
  1. /**************************************************************************************
  2. *                              交通灯实验                                                                                                  *
  3. 实现现象:模仿交通灯运作
  4. 注意事项:无                                                                                                                                                                  
  5. ***************************************************************************************/

  6. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  7. void delay();
  8. void display();
  9. void TrafficStart();
  10. void TrafficStop();
  11. void ledInit();
  12. void changeNSpass();
  13. void changeEWpass();

  14. typedef unsigned int u16;          //对数据类型进行声明定义
  15. typedef char u8;

  16. u8 code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,  
  17.                                         0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};
  18. u8 code stop[]={0xbf};                           //1011 1111                  

  19. u8 time1=3;                 //东西方向  第一位数字
  20. u8 time2=0;                 //东西方向  第二位数字

  21. u8 time3=2;                 //南北方向  第一位数字
  22. u8 time4=5;                 //南北方向  第一位数字

  23. u8 change=0;         //东西方向状态改变,初始为0        0为红灯    1为绿灯    2为黄灯
  24. u8 change1=2;         //南北方向状态改变,初始为2        0为红灯    1为绿灯    2为黄灯

  25. u8 ledset=0;         //紧急状态标志位,0为允许紧急状态启动
  26. u8 templed=2;         //LED灯临时记录,初始为2                        0为绿灯           1为黄灯          2为红灯
  27. u8 templed1=5;         //LED灯临时记录,初始为5                        3为绿灯           4为黄灯          5为红灯

  28. u8 count=0;                  //紧急状态按键计数   
  29. u8 count1=0;          //方向转变计数

  30. sbit led0=P1^0;           //将P1^0口定义为led0          绿色1
  31. sbit led1=P1^1;           //将P1^1口定义为led1                 黄色1
  32. sbit led2=P1^2;           //将P1^2口定义为led2                 红色1
  33. sbit led3=P1^3;           //将P1^0口定义为led3                 绿色2
  34. sbit led4=P1^4;           //将P1^1口定义为led4                 黄色2
  35. sbit led5=P1^5;           //将P1^2口定义为led5                 红色2

  36. sbit CK1 = P2^3;   //东西方向第一位数码管
  37. sbit CK2 = P2^2;   //东西方向第二位数码管

  38. sbit CK3 = P2^1;   //南北方向第一位数码管
  39. sbit CK4 = P2^0;   //南北方向第二位数码管

  40. sbit key2 = P3^0;
  41. sbit key3 = P3^1;
  42. sbit key4 = P3^2;

  43. void delay(u16 i)
  44. {
  45.         while(i--);       
  46. }

  47. void display(u8 time1,u8 time2,u8 time3,u8 time4);
  48. /*******************************************************************************
  49. * 函 数 名         : Timer1Init
  50. * 函数功能                   : 定时器1初始化
  51. * 输    入         : 无
  52. * 输    出         : 无
  53. *******************************************************************************/
  54. void Timer1Init()
  55. {
  56.         TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

  57.         TH1=0X3c;        //给定时器赋初值,定时50ms
  58.         TL1=0Xb0;       
  59.         ET1=1;//打开定时器1中断允许
  60.         EA=1;//打开总中断
  61.         TR1=1;//打开定时器                       
  62. }

  63. /*******************************************************************************
  64. * 函 数 名       : main
  65. * 函数功能                 : 主函数
  66. * 输    入       : 无
  67. * 输    出             : 无
  68. *******************************************************************************/
  69. void main()
  70. {       
  71.         CK1=0;
  72.         CK2=0;
  73.         led2=0;
  74.         led3=0;
  75.         Timer1Init();  //定时器1初始化
  76.         while(1)
  77.         {
  78. //*******************************************************************************
  79.                 if(key3==0&&count%2==0){          //当按下key3并且状态为运行状态时有效
  80.                         delay(1000);
  81.                         if(key3==0&&count%2==0)
  82.                         {       
  83.                                 TR1=0;        //关闭定时器,防止切换时仍然计时
  84.                                 count1++;
  85.                                 if(count1%2==1){        //(非红灯状态下允许执行)
  86.                                         TR1=1;        //打开定时器
  87.                                         changeEWpass();
  88.                                         }
  89.                                 if(count1%2==0){
  90.                                         TR1=1;
  91.                                         changeNSpass();
  92.                                         }
  93.                         }
  94.                         while(!key3);
  95.                    }
  96. //*******************************************************************************
  97.                 if(key2==0){
  98.                         delay(1000);
  99.                         if(key2==0)
  100.                         {
  101.                                 count++;
  102.                         }
  103.                         while(!key2);
  104.                 }

  105.                 if(count%2==0){                         //为0则将状态恢复为运行状态
  106.                         if(ledset==0){                //判断上次是否为紧急状态
  107.                                 ledset=1;               
  108.                                 ledInit();
  109.                                 templed=2;                //东西方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非0或1就行)
  110.                                 templed1=5;                //南北方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非3或4就行)
  111.                                 }
  112.                         TrafficStart();                //正常状态下while会死循环该语句,该语句为动态显示数字函数
  113.                 }
  114.                 if(count%2==1){                                        //为1将状态修改为紧急状态
  115.                         ledset=0;                                       
  116.                         TrafficStop();
  117.                 }
  118.        
  119.         }                       
  120. }

  121. /*******************************************************************************
  122. * 函 数 名         : void Timer1() interrupt 3
  123. * 函数功能                   : 定时器1中断函数
  124. * 输    入         : 无
  125. * 输    出         : 无
  126. *******************************************************************************/
  127. void Timer1() interrupt 3
  128. {
  129.         static u16 i;
  130.         TH1=0X3c;        //给定时器赋初值,定时50ms
  131.         TL1=0Xb0;
  132.         i++;
  133.         if(i==20)           //i等20时为1秒
  134.         {
  135.                 i=0;
  136. //-------------------------------------东西  方向-------------------------------------
  137.                 time2--;
  138.                 if(time2==-1&&time1!=0){               
  139.                         time1--;
  140.                         time2=9;
  141.                 }
  142.                 if((time2==0&&time1==0)){
  143.                         if(change==0){        //东西方向  如果为红灯
  144.                                 change=1;        //下次为绿灯
  145.                                 time1=5;
  146.                                 time2=0;
  147.                                 led2=1;
  148.                                 led1=1;
  149.                                 led0=0;                //绿灯亮
  150.                                 count1++;  //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
  151.                         }
  152.                         else if(change==1){          //东西方向  如果为绿灯
  153.                                 change=2;                  //下次为黄灯
  154.                                 time1=1;
  155.                                 time2=0;
  156.                                 led2=1;
  157.                                 led1=0;
  158.                                 led0=1;
  159.                         }
  160.                         else if(change==2){  //东西方向  如果为黄灯
  161.                                 change=0;                 //下次为红灯
  162.                                 time1=3;
  163.                                 time2=0;
  164.                                 led2=0;
  165.                                 led1=1;
  166.                                 led0=1;
  167.                                
  168.                         }
  169.                 }
  170. //-------------------------------------南北  方向-------------------------------------
  171.                 time4--;
  172.                 if(time4==-1&&time3!=0){
  173.                         time3--;
  174.                         time4=9;

  175.                 }
  176.                 if(time4==0&&time3==0){
  177.                         if(change1==2){          //南北方向  如果为绿灯
  178.                                 change1=1;          //下次为黄灯
  179.                                 time3=0;
  180.                                 time4=5;
  181.                                 led3=1;
  182.                                 led4=0;
  183.                                 led5=1;        
  184.                         }
  185.                         else if(change1==1){  //南北方向  如果为黄灯
  186.                                 change1=0;                  //下次为红灯
  187.                                 time3=6;
  188.                                 time4=0;
  189.                                 led3=1;
  190.                                 led4=1;
  191.                                 led5=0;
  192.                         }
  193.                         else if(change1==0){   //南北方向  如果为红灯
  194.                                 change1=2;                   //下次为绿灯
  195.                                 time3=2;
  196.                                 time4=5;
  197.                                 led3=0;
  198.                                 led4=1;
  199.                                 led5=1;
  200.                                 count1++;  //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
  201.                                
  202.                         }
  203.                 }
  204. //------------------------------------------------------------------------------------
  205.         }
  206. }

  207. void display(u8 time1,u8 time2,u8 time3,u8 time4)        //显示程序
  208. {  
  209.         P0=table[time1];
  210.         CK1=0;
  211.         delay(100);
  212.         CK1=1;

  213.         P0=table[time2];
  214.         CK2=0;
  215.         delay(100);
  216.         CK2=1;

  217.         P0=table[time3];
  218.         CK3=0;
  219.         delay(100);
  220.         CK3=1;

  221.         P0=table[time4];
  222.         CK4=0;
  223.         delay(100);
  224.         CK4=1;
  225. }

  226. void TrafficStart()
  227. {
  228.         TR1=1;//打开定时器
  229.         display(time1,time2,time3,time4);
  230. }

  231. void TrafficStop()
  232. {   
  233.         TR1=0;//关闭定时器
  234.         CK1=CK2=CK3=CK4=0;
  235.         P0=stop[0];
  236.         if(led0==0){
  237.                 templed=0;        //记录当前灯状态  东西方向
  238.                 led0=1;                //将原来灯熄灭
  239.                 led2=0;                //亮红灯
  240.                 }
  241.         if(led1==0){
  242.                 templed=1;
  243.                 led1=1;
  244.                 led2=0;
  245.                 }
  246.         if(led3==0){
  247.                 templed1=3;        //记录当前灯状态  南北方向
  248.                 led3=1;
  249.                 led5=0;
  250.                 }
  251.         if(led4==0){
  252.                 templed1=4;
  253.                 led4=1;
  254.                 led5=0;
  255.                 }
  256. }

  257. void ledInit()
  258. {
  259.         if(templed==0){         //恢复紧急状态前时的灯状态  东西方向
  260.                 led2=1;                 //熄灭其他灯
  261.                 led1=1;                 //熄灭其他灯
  262.                 led0=0;                 //恢复灯的状态
  263.                 }
  264.         if(templed==1){
  265.                 led2=1;
  266.                 led1=0;
  267.                 led0=1;
  268.                 }
  269.         if(templed1==3){ //恢复紧急状态前时的灯状态  南北方向
  270.                 led5=1;                 //熄灭其他灯
  271.                 led4=1;                 //熄灭其他灯
  272.                 led3=0;                 //恢复灯的状态
  273.                 }
  274.         if(templed1==4){
  275.                 led5=1;
  276.                 led4=0;
  277. ……………………

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

所有资料51hei提供下载:
单片机大作业.rar (3.65 MB, 下载次数: 46)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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