找回密码
 立即注册

QQ登录

只需一步,快速开始

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

有5个状态的单片机交通灯仿真和源代码

[复制链接]
跳转到指定楼层
楼主
我觉得,厉害的是可以直接做PCB,仿真的和真实的还是有差距的,建议升级的8.2版本哦

交通灯仿真原理图


单片机交通灯源代码:
  1. /**************************************************************

  2. **                                                                 *
  3. *第一个状态:主干道、支干道均亮红灯5S                             *
  4. *第二个状态:主干道亮绿灯30S、支干道亮红灯                        *
  5. *第三个状态:主干道绿灯闪3次转亮黄灯、支干道亮红灯3S              *
  6. *第四个状态:主干道亮红灯、支干道亮绿灯25S                        *
  7. *第五个状态:主干道亮红灯、支干道绿灯闪3次转亮黄灯3S              *
  8. *返回到第二个状态                                                 *
  9. *                                                                 *
  10. ***************************************************************

  11. /
  12. /* 11.0952M晶振*/
  13. #include<reg51.h>//头文件
  14. #include<intrins.h>//头文件
  15. #define  uchar  unsigned  char//宏定义
  16. #define  uint   unsigned   int//宏定义
  17. sbit   RED_ZHU    =  P1^0;
  18. sbit   YELLOW_ZHU =  P1^1;
  19. sbit   GREEN_ZHU  =  P1^2;
  20. sbit   RED_ZHI    =  P1^3;
  21. sbit   YELLOW_ZHI =  P1^4;
  22. sbit   GREEN_ZHI  =  P1^5;
  23. uint aa, bai,shi,ge,bb; //定义变量
  24. /*数码管显示0-9*/
  25. uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  26. /*子函数声明*/
  27. void  delay(uint z);
  28. void  delay0(uint z);
  29. //void  init(uint a);
  30. void  display(uint ge,uint shi);
  31. void  xtimer0();
  32. void  init1();
  33. void  init2();
  34. void  init3();
  35. void  init4();
  36. void  init5();
  37. void xint1();
  38. void xint0();
  39. void  LED_ON();
  40. void  LED_OFF();
  41. /*********************************************************
  42.    主函数
  43. *********************************************************/
  44. void main()
  45. {       
  46.         P0=0XFF;
  47.         P1=0xFF;
  48.            P2=0xFF;
  49.         EA=1;//打开外部中断
  50.         EX1=1;//允许外部中断1中断
  51.         IT1=0;//INT0为沿触发方式
  52.           init1();
  53.   while(1)
  54.   {
  55.                   init2();//第2个状态
  56.                 init3(); //第3个状态
  57.                 init4(); //第4个状态
  58.                  init5();//第5个状态       
  59.   }
  60. }

  61. void  init1()//第一个状态:主干道、支干道均亮红灯5S
  62. {
  63.         uint temp;
  64.         temp=6;//变量赋初值
  65.         TMOD=0x01;//定时器0工作于方式1
  66.         TH0=0x4c;
  67.         TL0=0x00;//定时器赋初值
  68.         EA=1;//开外部中断
  69.         ET0=1;//开定时中断
  70.         TR0=1;//开定时器0
  71.         while(1)
  72.         {
  73.                 RED_ZHU=0;              //第一个状态主干道、支干道均亮红灯5S
  74.                    RED_ZHI=0;
  75.                 GREEN_ZHU=1;
  76.                 GREEN_ZHI=1;
  77.                 YELLOW_ZHU=1;
  78.                 YELLOW_ZHI=1;
  79.                 if(aa==20)//定时20*50MS=1S
  80.                 {
  81.                         aa=0;//定时完成一次后清0
  82.                         temp--;//变量自增
  83.                         //delay(10);
  84.                         if(temp>250)//定时100S
  85.                         {
  86.                                 temp=6;//变量清0
  87.                                 break;
  88.                         }
  89.                         shi=temp%100/10;//显示十位
  90.                         ge=temp%10;//显示个位         
  91.                 }
  92.                 display(ge,shi);
  93.         }
  94. }

  95. void  init2()//第二个状态:主干道亮绿灯30S、支干道亮红灯
  96. {
  97.         uint temp;
  98.         temp=31;//变量赋初值
  99.         TMOD=0x01;//定时器0工作于方式1
  100.         TH0=0x4c;
  101.         TL0=0x00;//定时器赋初值
  102.         EA=1;//开外部中断
  103.         ET0=1;//开定时中断
  104.         TR0=1;//开定时器0
  105.         while(1)
  106.         {         
  107.                 RED_ZHU=1;
  108.                 RED_ZHI=0;
  109.                 GREEN_ZHU=0;
  110.                 GREEN_ZHI=1;
  111.                 YELLOW_ZHU=1;//第二个状态:主干道亮绿灯30S、支干道亮红灯
  112.                    YELLOW_ZHI=1;
  113.                
  114.                 if(aa==20)//定时20*50MS=1S
  115.                 {
  116.                         aa=0;//定时完成一次后清0
  117.                         temp--;//变量自增
  118.                         if(temp==3)//定时100S
  119.                         {
  120.                                 temp=30;//变量清0
  121.                                 break;
  122.                         }
  123.                         shi=temp%100/10;//显示十位
  124.                         ge=temp%10;//显示个位
  125.                 }
  126.                 display(ge,shi);
  127.         }
  128. }

  129. void  init3() //第三个状态:主干道绿灯闪3次转亮黄灯、支干道亮红灯3S
  130. {
  131.         uint temp;
  132.         temp=4;//变量赋初值
  133.         TMOD=0x01;//定时器0工作于方式1
  134.         TH0=0x4c;
  135.         TL0=0x00;//定时器赋初值
  136.         EA=1;//开外部中断
  137.         ET0=1;//开定时中断
  138.         TR0=1;//开定时器0
  139.         while(1)
  140.         {
  141.                 RED_ZHI=0;
  142.                 GREEN_ZHU=1;
  143.                 //YELLOW_ZHU=~YELLOW_ZHU;
  144.                 if(aa==20)//定时20*50MS=1S
  145.                 {
  146.                         aa=0;//定时完成一次后清0
  147.                         temp--;//变量自增
  148.                         YELLOW_ZHU=~YELLOW_ZHU;
  149.                         if(temp>200)//定时100S
  150.                         {
  151.                                 temp=4;//变量清0
  152.                                 break;
  153.                         }
  154.                         shi=temp%100/10;//显示十位
  155.                         ge=temp%10;//显示个位         
  156.                 }
  157.                 display(ge,shi);;
  158.         }
  159. }
  160. void  init4()//第四个状态:主干道亮红灯、支干道亮绿灯25S
  161. {
  162.         uint temp;
  163.         temp=26;//变量赋初值
  164.         TMOD=0x01;//定时器0工作于方式1
  165.         TH0=0x4c;
  166.         TL0=0x00;//定时器赋初值
  167.         EA=1;//开外部中断
  168.         ET0=1;//开定时中断
  169.         TR0=1;//开定时器0
  170.         while(1)
  171.         {       
  172.                 RED_ZHU=0;
  173.                 RED_ZHI=1;
  174.                 YELLOW_ZHU=1;//第一个状态主干道、支干道均亮红灯5S
  175.                    GREEN_ZHI=0;
  176.                 if(aa==20)//定时20*50MS=1S
  177.                 {
  178.                         aa=0;//定时完成一次后清0
  179.                         temp--;//变量自增
  180.                         if(temp==3)//定时100S
  181.                         {
  182.                                 temp=25;//变量清0
  183.                                 break;
  184.                         }
  185.                         shi=temp%100/10;//显示十位
  186.                         ge=temp%10;//显示个位         
  187.                 }
  188.                 display(ge,shi);
  189.         }
  190. }

  191. void  init5()//第五个状态:主干道亮红灯、支干道绿灯闪3次转亮黄灯3S
  192. {
  193.         uint temp;
  194.         temp=4;//变量赋初值
  195.         TMOD=0x01;//定时器0工作于方式1
  196.         TH0=0x4c;
  197.         TL0=0x00;//定时器赋初值
  198.         EA=1;//开外部中断
  199.         ET0=1;//开定时中断
  200.         TR0=1;//开定时器0
  201.         while(1)
  202.         {
  203.                 RED_ZHI=1;
  204.                 RED_ZHU=0;
  205.                 GREEN_ZHU=1;
  206.                 GREEN_ZHI=1;
  207.                 //YELLOW_ZHI=~YELLOW_ZHI;
  208.                 if(aa==20)//定时20*50MS=1S
  209.                 {
  210.                         aa=0;//定时完成一次后清0
  211.                         temp--;//变量自增
  212.                         YELLOW_ZHI=~YELLOW_ZHI;
  213.                         if(temp>200)//定时100S
  214.                         {
  215.                                 temp=4;//变量清0
  216.                                 break;
  217.                         }
  218.                         shi=temp%100/10;//显示十位
  219.                         ge=temp%10;//显示个位         
  220.                 }
  221.                 display(ge,shi);
  222.         }
  223. }               
  224. /*显示子函数*/
  225. void  display(uint ge,uint shi)
  226. {
  227.         P0=0xfd;
  228.         P2=table[shi];//显示十位
  229.         delay0(5);
  230.         P0=0xfe;
  231.         P2=table[ge];//显示个位
  232.         delay0(5);

  233. }
  234. void  xint0()  interrupt  2 //外部中断1,这里用2是INT1的优先级为0
  235. {
  236.         LED_ON();
  237.        
  238. }

  239. void  LED_ON()//外部中断0显示子程序
  240. {
  241.                         RED_ZHI=0;
  242.                         RED_ZHU=0;
  243.                         GREEN_ZHI=1;
  244.                         GREEN_ZHU=1;
  245.                     YELLOW_ZHI=1;
  246.                         YELLOW_ZHU=1;
  247.                         delay0(1000);
  248.                         return ;
  249.        
  250. }
  251. /*定时中断子函数*/
  252. void  xtimer0()  interrupt 1
  253. {
  254.         TH0=0x4c;
  255.         TL0=0x00;
  256.         aa++;
  257. }
  258. /*延时子函数*/
  259. void  delay0(uint z)
  260. {
  261.         uint i,j;
  262.         for(i=0;i<z;i++)
  263.                 for(j=0;j<110;j++);
  264. }

  265. /*********************************************************
  266.    500ms延时函数
  267.    晶振:11.0592MHz
  268. *********************************************************/
  269. void delay(unsigned char j)
  270. {
  271.    unsigned char k;
  272.    unsigned int i;
  273.    for(;j>0;j--)
  274.   {
  275.      for(i=1250;i>0;i--)
  276.      {
  277.        for(k=180;k>0;k--);
  278.      }
  279.    }
  280. }
复制代码




51Protues.rar (64.1 KB, 下载次数: 31)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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