找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机交通灯程序

[复制链接]
跳转到指定楼层
楼主
ID:993164 发表于 2022-11-21 16:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能:Proteus模拟运行,南北亮绿灯,东西亮红灯,南北绿灯亮8s后,南北绿灯闪烁2s,接着南北黄灯常亮1s,东西依然红灯,南北黄灯熄灭后,东西亮纣灯,南北亮红灯,东西绿灯亮8s后,开始闪烁2s,之后黄灯亮1s,然后南北亮绿灯......程序开始循环。


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char

  3. #define uint unsigned int
  4. //东西
  5. sbit GR_1=P1^5;        //位定义

  6. sbit YELLOW_1=P1^4;

  7. sbit RED_1=P1^3;

  8. sbit RED_2=P1^0;

  9. sbit YELLOW_2=P1^1;

  10. sbit GREEN_2=P1^2;
  11. //北南


  12. uchar times = 1;
  13. uint sess=0,  ses=0;  //毫秒   秒
  14. /*******************************************************************************
  15. * 函 数 名         : delay
  16. * 函数功能                   : 延时函数,i=1时,大约延时10us
  17. *******************************************************************************/
  18. void delay(uint i)
  19. {
  20.         while(i--);       
  21. }
  22. /*******************************************************************************
  23. * 函 数 名         : Timer0Init
  24. * 函数功能                   : 定时器0初始化
  25. * 输    入         : 无
  26. * 输    出         : 无
  27. *******************************************************************************/
  28. void Timer0Init()
  29. {
  30.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。


  31.         TH0=0XfC;        //给定时器赋初值,定时1ms
  32.         TL0=0X18;
  33.         ET0=1;//打开定时器0中断允许
  34.         EA=1;//打开总中断
  35.         TR0=1;//打开定时器                       
  36. }

  37. /*******************************************************************************
  38. * 函 数 名         : void Timer0() interrupt 1
  39. * 函数功能                   : 定时器0中断函数
  40. * 输    入         : 无
  41. * 输    出         : 无
  42. *******************************************************************************/
  43. void Timer0() interrupt 1
  44. {

  45.         TH0=0XfC;        //给定时器赋初值,定时1ms
  46.         TL0=0X18;
  47.     sess++;         //毫秒
  48.         if(sess==1000) //1000毫秒 =1s
  49.         {
  50.            ses++; //s 加1
  51.            sess=0;        //ms 等于0
  52.         if(ses==8)times=5;         //亮8s南北绿灯后跳到5语句
  53.         if(ses==10)times=2;         //亮2s南北闪烁绿灯后跳到2语句
  54.         if(ses==11)times=3;          //跳到3语句
  55.         if(ses==19)times=6;          //跳到3语句
  56.         if(ses==21)times=4;          //跳到4语句
  57.         if(ses==22){times=1;ses=0;}    //s 等于0   而且回答 跳到1语句
  58.         }


  59.        
  60.                
  61. }


  62. /*******************************************************************************
  63. * 函 数 名         :main
  64. * 函数功能                   : 主函数
  65. *******************************************************************************/

  66. void main()
  67. {         

  68. Timer0Init();//定时器初始化
  69.    
  70.        
  71.         while(1)
  72.    {
  73.    
  74.            switch(times) //一开始times=1
  75.       {
  76.           case 1:   GR_1=1;         RED_1=0;                 //东西的红绿灯
  77.                                 RED_2=1;        GREEN_2=0;                //南北的红绿灯
  78.                                         YELLOW_1=1;                                        //东西的黄灯
  79.                                       YELLOW_2=1;                                         //南北的黄灯
  80.                                break;

  81.         case 2:
  82.                                               GREEN_2=1;                  //南北的绿灯   高电平灭
  83.                                        YELLOW_1=1;                  //东西的黄灯
  84.                                             YELLOW_2=0;                 //南北的黄灯                 
  85.                   
  86.                      break;

  87.         case 3:     GR_1=0;         RED_1=1;                 //东西的红绿灯
  88.                                 RED_2=0;        GREEN_2=1;                //南北的红绿灯
  89.                                         YELLOW_1=1;                                        //东西的黄灯
  90.                                       YELLOW_2=1;                                         //南北的黄灯
  91.                                break;

  92.             case 4:
  93.                                               GR_1=1;                  //南北的绿灯   高电平灭
  94.                                        YELLOW_1=0;                  //东西的黄灯
  95.                                             YELLOW_2=1;                 //南北的黄灯                 
  96.                   
  97.                      break;

  98.                   case 5:   GR_1=1;         RED_1=0;                 //东西的红绿灯
  99.                                 RED_2=1;        GREEN_2=~GREEN_2;                //南北的红绿灯
  100.                                         YELLOW_1=1;                                        //东西的黄灯
  101.                                       YELLOW_2=1;                                         //南北的黄灯
  102.                                          delay(50000);
  103.                                break;

  104.              case 6:     GR_1=~GR_1;         RED_1=1;                 //东西的红绿灯
  105.                                 RED_2=0;        GREEN_2=1;                //南北的红绿灯
  106.                                         YELLOW_1=1;                                        //东西的黄灯
  107.                                       YELLOW_2=1;       
  108.                                          delay(50000);                                 //南北的黄灯
  109.                                break;
  110.       }

  111.    }

  112. }
复制代码

Keil代码与Proteus8.10版本的仿真下载(注意:不能兼容其他版本 只能用8.10打开):
1 交通灯(新版)定时器.rar (82.67 KB, 下载次数: 22)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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