找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于stc89c52单片机的人工可控交通灯

[复制链接]
跳转到指定楼层
楼主




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

  2. typedef unsigned int u16;   //对数据类型进行声明定义
  3. typedef unsigned char u8;
  4. sbit L1=P0^7;
  5. sbit L2=P0^6;
  6. sbit k1=P0^5;

  7. //--定义使用的IO口--//
  8. #define GPIO_DIG   P1
  9. #define GPIO_TRAFFIC P2

  10. sbit RED11   = P2^0;
  11. sbit YELLOW11= P2^1;
  12. sbit GREEN11 = P2^2;
  13. sbit RED01   = P2^5;
  14. sbit YELLOW01= P2^4;
  15. sbit GREEN01 = P2^3;
  16. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  17.      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
  18. u8 DisplayData[2];
  19. u8 Second;
  20. u16 temp;

  21. void delay(u16 i)
  22. {
  23. while(i--);
  24. }

  25. void DigDisplay()
  26. {
  27. u8 i;
  28. for(i=0;i<2;i++)
  29. {
  30.   switch(i)  //位选,选择点亮的数码管,
  31.   {
  32.    case(0):
  33.     L1=0;L2=1; break;//显示第0位
  34.    case(1):
  35.     L2=0;L1=1; break;//显示第1位
  36.    
  37.   }
  38.   GPIO_DIG=DisplayData[i];//发送段码
  39.   delay(100); //间隔一段时间扫描
  40.   GPIO_DIG=0x00;//消隐
  41. }
  42. }


  43. void Timer0Init()
  44. {
  45. TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
  46. TH0=0XFC; //给定时器赋初值,定时1ms
  47. TL0=0X18;
  48. ET0=1;//打开定时器0中断允许
  49. EA=1;//打开总中断
  50. TR0=1;//打开定时器   
  51. }


  52. void Timer0() interrupt 1
  53. {
  54. static u16 i;
  55. TH0=0XFC; //给定时器赋初值,定时1ms
  56. TL0=0X18;
  57. i++;
  58. if(i==1000)
  59. {
  60.   i=0;
  61.   Second ++;
  62. }
  63. }  
  64. void main()
  65. {
  66. Second = 1;

  67. k1=0;
  68. Timer0Init();
  69. while(1)
  70. {
  71.   if(Second == 70)
  72.   {
  73.    Second = 1;
  74.   }
  75.   //--宝田路通行,30秒--//
  76.   if(Second < 31)
  77.   {
  78.    
  79.    DisplayData[0] = smgduan[(30 - Second) % 100 / 10];
  80.    DisplayData[1] = smgduan[(30 - Second) %10];
  81.    
  82.    DigDisplay();
  83.    //--宝田路通行--//
  84.    GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  85.    GREEN11 = 0;    //宝田路绿灯亮   
  86.   
  87.    RED01 = 0;      //前进路红灯亮
  88.   }
  89.   //--黄灯等待切换状态,5秒--//
  90.   else if(Second < 36)
  91.   {
  92.   
  93.    DisplayData[0] = smgduan[(35 - Second) % 100 / 10];
  94.    DisplayData[1] = smgduan[(35 - Second) %10];
  95.   
  96.    DigDisplay();
  97.    //--黄灯阶段--//
  98.    GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  99.    YELLOW11 = 0;    //宝田路黄灯亮   
  100.    YELLOW01 = 0;    //前进路红灯亮
  101.   }
  102.   //--前进路通行--//
  103.   else if(Second < 66)
  104.   {
  105.    
  106.    DisplayData[0] = smgduan[(65 - Second) % 100 / 10];
  107.    DisplayData[1] = smgduan[(65 - Second) %10];
  108.    
  109.    DigDisplay();
  110.    //--黄灯阶段--//
  111.    GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  112.   
  113.    RED11 = 0;       //宝田路红灯亮   
  114.   
  115.    GREEN01 = 0;     //前进路绿灯亮
  116.   
  117.   }
  118.   //--黄灯等待切换状态,5秒--//
  119.   else
  120.   {
  121.   
  122.    DisplayData[0] = smgduan[(70 - Second) % 100 / 10];
  123.    DisplayData[1] = smgduan[(70 - Second) %10];
  124.    DigDisplay();
  125.    //--黄灯阶段--//
  126.    GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  127.   
  128.    YELLOW11 = 0;    //宝田路黄灯亮   
  129.    YELLOW01 = 0;    //前进路红灯亮
  130.   
  131.   }
  132.    
  133.   if(k1==1)    //检测按键K1是否按下
  134.   {
  135.    delay(1000);   //消除抖动 一般大约10ms
  136.    if(k1==1)  //再次判断按键是否按下
  137.    {
  138.     temp=0x1E;
  139.     P2=temp;
  140.     L1=0;L2=0;
  141.    
  142.    }
  143.    while(!k1);  //检测按键是否松开
  144.   }  
  145. }
  146.       
  147. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:189362 发表于 2017-8-7 12:21 | 只看该作者
好东西,值得学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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