找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红绿灯程序加proteus仿真

[复制链接]
跳转到指定楼层
楼主
单片机红绿灯程序加仿真


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

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

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

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

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

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

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

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

全部资料下载:
交通红绿灯.zip (78.36 KB, 下载次数: 62)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:216620 发表于 2017-7-2 19:39 | 只看该作者
怎么改程序啊
回复

使用道具 举报

板凳
ID:246344 发表于 2017-11-6 14:09 | 只看该作者
学习一个
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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