找回密码
 立即注册

QQ登录

只需一步,快速开始

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

交通灯设计

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

  1. #include<reg51.h>

  2. //--定义使用的IO口--//
  3. #define GPIO_DIG   P0
  4. #define GPIO_PLACE P1

  5. #define GPIO_TRAFFIC P2

  6. sbit RED10   = P2^0;   //左红灯
  7. sbit GREEN10 = P2^1;   //左绿灯

  8. sbit RED11   = P2^2;   //南北红
  9. sbit YELLOW11= P2^3;   //南北黄
  10. sbit GREEN11 = P2^4;   //南北绿

  11. sbit RED00   = P3^0;        //下人行道红灯
  12. sbit GREEN00 = P3^1;        //下人行道绿灯

  13. sbit RED01   = P2^5;        //东西红
  14. sbit YELLOW01= P2^6;        //东西黄
  15. sbit GREEN01 = P2^7;        //东西绿

  16. //--定义全局变量--//
  17. unsigned char code DIG_PLACE[8] = {
  18. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制

  19. unsigned char code DIG_CODE[17] = {
  20. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  21. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  22. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

  23. unsigned char DisplayData[8];
  24. //用来存放要显示的8位数的值
  25. unsigned char Time, Second;                  //用来存放定时时间
  26. /*void main()
  27. {
  28.         P2=0x00;
  29.         RED00=0;
  30.         GREEN00=0;
  31.         GPIO_DIG=0xff;
  32.         GPIO_PLACE=0x00;
  33.         while(1);
  34. }        */

  35. //--声明全局函数--//
  36. void DigDisplay(); //动态显示函数
  37. void Timer0Cofig(void);

  38. void main(void)
  39. {
  40.         Second = 1;

  41.         Timer0Cofig(); //定时器初始化

  42.         while(1)
  43.         {
  44.                 if(Second == 70) //总时间归零
  45.                 {
  46.                         Second = 1;
  47.                 }

  48.                 //--南北通行,30秒--//
  49.                 if(Second < 31)
  50.                 {
  51.                         DisplayData[0] = DIG_CODE[(35 - Second) % 100 / 10]; //东西红灯35S
  52.                         DisplayData[1] = DIG_CODE[(35 - Second) %10];

  53.                         DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10];//南北绿灯35S
  54.                         DisplayData[3] = DIG_CODE[(30 - Second) %10];

  55.                         DisplayData[4] = DIG_CODE[(35 - Second) % 100 / 10];//下红灯35S
  56.                         DisplayData[5] = DIG_CODE[(35 - Second) %10];

  57.                         DisplayData[6] = DIG_CODE[(30 - Second) % 100 / 10];//左绿灯35S
  58.                         DisplayData[7] = DIG_CODE[(30 - Second) %10];

  59.                         DigDisplay();

  60.                         RED11 = 1;                 //南北红灯灭
  61.                         YELLOW11 = 1;        //南北黄灯灭
  62.                         GREEN11 = 0;    //南北绿灯亮
  63.                               

  64.                         RED01 = 0;      //东西红灯亮
  65.                         YELLOW01 = 1;        //东西黄灯灭
  66.                         GREEN01 = 1;        //东西绿灯灭

  67.                         RED10=1;                //左人行道红灯灭
  68.                         GREEN10        = 0;    //左人行道绿灯亮

  69.                         RED00 = 0;      //下人行道红灯亮
  70.                         GREEN00 = 1;        //下人行道绿灯灭

  71.                 }

  72.                 //--南北黄灯等待切换状态,5秒--//
  73.                 else if(Second < 36)
  74.                 {
  75.                         DisplayData[0] = DIG_CODE[(35 - Second) % 100 / 10]; //东西红灯35S
  76.                         DisplayData[1] = DIG_CODE[(35 - Second) %10];

  77.                         DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10];//南北黄灯5S
  78.                         DisplayData[3] = DIG_CODE[(35 - Second) %10];

  79.                         DisplayData[4] = DIG_CODE[(35 - Second) % 100 / 10];//下红灯5S
  80.                         DisplayData[5] = DIG_CODE[(35 - Second) %10];

  81.                         DisplayData[6] = DIG_CODE[(70 - Second) % 100 / 10];//左红灯5S
  82.                         DisplayData[7] = DIG_CODE[(70 - Second) %10];

  83.                         DigDisplay();

  84.                         RED11 = 1;                 //南北红灯灭
  85.                         YELLOW11 = 0;        //南北黄灯亮
  86.                         GREEN11 = 1;    //南北绿灯灭
  87.                               

  88.                         RED01 = 0;      //东西红灯亮
  89.                         YELLOW01 = 1;        //东西黄灯灭
  90.                         GREEN01 = 1;        //东西绿灯灭

  91.                         RED10 = 0;                //左人行道红灯亮
  92.                         GREEN10        = 1;    //左人行道绿灯灭

  93.                         RED00 = 0;      //下人行道红灯亮
  94.                         GREEN00 = 1;        //下人行道绿灯灭
  95.                 }

  96.                 //--东西通行--//
  97.                 else if(Second < 66)
  98.                 {
  99.                         DisplayData[0] = DIG_CODE[(65 - Second) % 100 / 10];
  100.                         DisplayData[1] = DIG_CODE[(65 - Second) %10];

  101.                         DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10];
  102.                         DisplayData[3] = DIG_CODE[(70 - Second) %10];

  103.                         DisplayData[4] = DIG_CODE[(65 - Second) % 100 / 10];
  104.                         DisplayData[5] = DIG_CODE[(65 - Second) %10];

  105.                         DisplayData[6] = DIG_CODE[(70 - Second) % 100 / 10];
  106.                         DisplayData[7] = DIG_CODE[(70 - Second) %10];
  107.                         DigDisplay();

  108.                         RED11 = 0;                 //南北红灯亮
  109.                         YELLOW11 = 1;        //南北黄灯灭
  110.                         GREEN11 = 1;    //南北绿灯灭
  111.                               

  112.                         RED01 = 1;      //东西红灯灭
  113.                         YELLOW01 = 1;        //东西黄灯灭
  114.                         GREEN01 = 0;        //东西绿灯亮

  115.                         RED10 = 0;                //左人行道红灯亮
  116.                         GREEN10        = 1;    //左人行道绿灯灭

  117.                         RED00 = 1;      //下人行道红灯灭
  118.                         GREEN00 = 0;        //下人行道绿灯亮
  119.                 }

  120.                 //--黄灯等待切换状态,5秒--//
  121.                 else
  122.                 {
  123.                         DisplayData[0] = DIG_CODE[(70 - Second) % 100 / 10];
  124.                         DisplayData[1] = DIG_CODE[(70 - Second) %10];

  125.                         DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10];
  126.                         DisplayData[3] = DIG_CODE[(70 - Second) %10];

  127.                         DisplayData[4] = DIG_CODE[(105 - Second) % 100 / 10];
  128.                         DisplayData[5] = DIG_CODE[(105 - Second) %10];

  129.                         DisplayData[6] = DIG_CODE[(70 - Second) % 100 / 10];
  130.                         DisplayData[7] = DIG_CODE[(70 - Second) %10];
  131.                         DigDisplay();

  132.                         RED11 = 0;                 //南北红灯亮
  133.                         YELLOW11 = 1;        //南北黄灯灭
  134.                         GREEN11 = 1;    //南北绿灯灭
  135.                               

  136.                         RED01 = 1;      //东西红灯灭
  137.                         YELLOW01 = 0;        //东西黄灯亮
  138.                         GREEN01 = 1;        //东西绿灯灭

  139.                         RED10 = 0;                //左人行道红灯亮
  140.                         GREEN10        = 1;    //左人行道绿灯灭

  141.                         RED00 = 0;      //下人行道红灯亮
  142.                         GREEN00 = 1;        //下人行道绿灯灭
  143.                 }
  144.         }                              
  145. }         

  146. void DigDisplay()
  147. {
  148.         unsigned char i;
  149.         unsigned int j;


  150.         for(i=0; i<8; i++)
  151.         {
  152.                 GPIO_PLACE = DIG_PLACE;           //发送位选                GPIO_DIG = DisplayData;     //发送段码                j = 10;                                                   //扫描间隔时间设定                while(j--);                        GPIO_DIG = 0x00;               //消隐        }}
  153. void Timer0Cofig(void){        TMOD = 0x01;     //定时器0选择工作方式1    TH0  = 0x3C;         //设置初始值,定时50MS    TL0  = 0xB0;     EA   = 1;             //打开总中断    ET0  = 1;                 //打开定时器0中断    TR0  = 1;                 //启动定时器0        }  
  154. void Timer0() interrupt 1{        TH0 = 0x3C;         //设置初始值        TL0 = 0xB0;        Time++;        if(Time == 20)        {                Second ++;                Time = 0;        }}
  155.                
复制代码


000004-交通灯设计.zip

375.78 KB, 下载次数: 4, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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