找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11991|回复: 4
收起左侧

51单片机实现红绿灯控制的代码+Proteus仿真

  [复制链接]
ID:436486 发表于 2018-11-30 14:08 | 显示全部楼层 |阅读模式
51实现红绿灯控制仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. #include <reg51.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. //定义共阴数码管段码0-9
  5. uchar code segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};

  6. sbit A_R = P2 ^ 0;        // 定义A路的红灯
  7. sbit A_Y = P2 ^ 1;        // 定义A路的黄灯
  8. sbit A_G = P2 ^ 2;        // 定义A路的绿灯

  9. sbit B_R = P2 ^ 3;        // 定义B路的红灯
  10. sbit B_Y = P2 ^ 4;        // 定义B路的黄灯
  11. sbit B_G = P2 ^ 5;        // 定义B路的绿灯

  12. sbit A_SEG_EN_1 = P0 ^0;        // 定义A路的数码管的第一个位的使能
  13. sbit A_SEG_EN_2 = P0 ^1;        // 定义A路的数码管的第二个位的使能
  14. sbit B_SEG_EN_1 = P0 ^2;        // 定义B路的数码管的第一个位的使能
  15. sbit B_SEG_EN_2 = P0 ^3;        // 定义B路的数码管的第二个位的使能

  16. sbit key = P0 ^ 7;        // 紧急按键

  17. bit flag = 0;        // 标志是否处于紧急状态,紧急状态flag=1

  18. //作用:延时 z ms
  19. //参数:z
  20. //返回值:
  21. void delay(uint z)        // 利用不停的运行空代码来消耗时间
  22. {
  23.         uint x, y;
  24.         for (x = z; x>0; x--)
  25.         for (y = 110; y>0; y--);
  26. }

  27. void check_buttn()
  28. {
  29.         //检测按键key
  30.         if (key == 0)                        // 如果按键被按下
  31.         {
  32.                 delay(10);                        // 消抖
  33.                 if (key == 0)                // 确认按键被按下
  34.                 {
  35.                         flag = !flag;        // 紧急标志位取反
  36.                         while (!key);        // 等待按键释放
  37.                 }
  38.         }
  39. }

  40. void seg_display(int numA, int numB)
  41. {
  42.         P0 |= 0x7F;                                // 关闭所有数码管的片选
  43.         P3 = segment[numA/10];        // 显示A路计时的十位
  44.         A_SEG_EN_1 = 0;                        // 打开A路的十位的使能
  45.        
  46.         P1 = segment[numB/10];        // 显示B路计时的十位
  47.         B_SEG_EN_1 = 0;                        // 打开B路的十位的使能
  48.         delay(5);                                // 延时,是数据在数码管上停留一段时间
  49.        
  50.        
  51.         P0 |= 0x7F;                                // 关闭所有数码管的片选
  52.         P3 = segment[numA%10];        // 显示A路计时的个位
  53.         A_SEG_EN_2 = 0;                        // 打开A路的个位的使能
  54.        
  55.         P1 = segment[numB%10];        // 显示B路计时的个位
  56.         B_SEG_EN_2 = 0;                        // 打开B路的个位的使能
  57.         delay(5);                                // 延时,是数据在数码管上停留一段时间
  58. }

  59. void display(int numA, int numB)
  60. {
  61.         int i = 0;
  62.         int temp = P2;        // 保存红绿灯的状态
  63.        
  64.         for(i=0; i<50; i++)
  65.         {
  66.                 check_buttn();        // 按键检测
  67.                 if(flag)                // 如果处于紧急状态
  68.                 {
  69.                         while(flag)        // 紧急状态中
  70.                         {
  71.                                 P2 = 0x09;        // 将AB路都变成红灯
  72.                                 seg_display(numA, numB);        // 显示计时
  73.                                 check_buttn();        // 按键检测
  74.                         }
  75.                         P2 = temp;        // 还原进入紧急之前的状态
  76.                 }
  77.                 seg_display(numA, numB);        // 显示计时
  78.         }
  79. }

  80. void main()
  81. {
  82.         int j=0;
  83.         P2 = 0;        //先关闭所有的红绿灯,为了防止刚打开仿真的时候有闪烁
  84.         while(1)
  85.         {
  86.                 A_G = 1;
  87.                 B_R = 1;
  88.                 for (j=10; j>=0; j--)
  89.                         display(j/2, j/2);
  90.                 P2 = 0;
  91.                
  92.                 for (j=5; j>=0; j--)
  93.                 {
  94.                        
  95.                 A_Y = 1;
  96.                 B_R = 1;
  97.                         display(j, j+25);
  98.                        
  99.                 A_Y = 0;
  100.                 B_R = 1;
  101.                         display(j, j+25);
  102.                 }
  103.                 P2 = 0;
  104.                
  105.                 A_R = 1;
  106.                 B_G = 1;
  107.                 for (j=25; j>=0; j--)
  108.                         display(j+5, j);
  109.                 P2 = 0;
  110.                
  111.                 A_R = 1;
  112.                 B_Y = 1;
  113.                 for (j=5; j>=0; j--)
  114.                         display(j, j);
  115.                 P2 = 0;
  116.         }
  117. }
复制代码

所有资料51hei提供下载:
交通灯.rar (48.19 KB, 下载次数: 228)

评分

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

查看全部评分

回复

使用道具 举报

ID:436768 发表于 2018-11-30 20:07 | 显示全部楼层
可以,顶一下
回复

使用道具 举报

ID:855891 发表于 2020-12-7 11:50 | 显示全部楼层
这个还是十字路口的
回复

使用道具 举报

ID:993146 发表于 2021-12-16 13:09 | 显示全部楼层
能发一下元件表吗
回复

使用道具 举报

ID:1024801 发表于 2022-5-8 15:49 | 显示全部楼层
有原件表吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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