找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C51单片机交通灯程序Proteus仿真 四个干道的初始值可变

[复制链接]
跳转到指定楼层
楼主
四个干道的初始值可变

单片机源程序如下:
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ON 0
  5. #define OFF 1
  6. sbit Z_G=P1^2; // 主干道绿灯
  7. sbit Z_Y=P1^3; // 主干道黄灯
  8. sbit Z_R=P1^4; // 主干道红灯

  9. sbit F_G=P1^5; // 支干道绿灯
  10. sbit F_Y=P1^6; // 支干道黄灯
  11. sbit F_R=P1^7; // 支干道红灯

  12. sbit wei_Z1=P2^0; // 主干道数码管位控制
  13. sbit wei_Z2=P2^1; // 主干道数码管位控制

  14. sbit wei_F1=P2^2; // 支干道数码管位控制
  15. sbit wei_F2=P2^3; // 支干道数码管为控制


  16. sbit key1=P1^0;                                //开关位定义
  17. sbit key2=P1^1;

  18. sbit buzzer=P3^7;    //蜂鸣器定义

  19. uchar count; //定时器中断计数值

  20. /********* 倒计时赋初值 *************/
  21. int T_Z_G=60,T_F_G=30,T_F_R=60,T_Z_R=30,T_Y=3;//T_Z_G主干道的绿灯初始值为60,T_F_G支干道的绿灯为30,T_Y黄灯都为3
  22. //T_F_R为支干道的红灯值60,T_Z_R为主干道的红灯值30

  23. void init(void)
  24. {
  25.         TMOD=0x01;
  26.         TH0=(65536-50000)/256;
  27.         TL0=(65536-50000)%256;
  28.         EA=1;
  29.         ET0=1;
  30.         TR0=1;       
  31. }


  32. /****************** 延时 **********************/
  33. void delay(uchar z)
  34. {
  35.                 uchar x,y;
  36.                 for(x=z;x>0;x--)
  37.                 for(y=110;y>0;y--);
  38. }

  39. /******************seg 控制 *******************/
  40. unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 共阴极数码管赋值
  41. void display1(uchar num1,uchar num2) //控制支干道数码管倒计时显示
  42. {
  43.         P3=table[num1];
  44.         wei_F1=ON;
  45.         delay(1);
  46.         wei_F1=OFF;

  47.         P3=table[num2];
  48.         wei_F2=ON;
  49.         delay(1);
  50.         wei_F2=OFF;

  51.         if(key1==0)//主干道紧急制动
  52.         {
  53.                 delay(2);
  54.                 if(key1==0)
  55.                 {
  56.                         while(1)
  57.                         {
  58.                                 P0=0x00;
  59.                                 P3=0x00;
  60.                                 F_G=OFF;
  61.                                 F_Y=OFF;
  62.                                 F_R=ON;
  63.                        
  64.                                 Z_G=OFF;
  65.                                 Z_Y=OFF;
  66.                                 Z_R=ON;
  67.                                 buzzer=~buzzer;//蜂鸣器叫
  68.                                 if(key2==0)
  69.                                 {
  70.                                         delay(2);
  71.                                         if(key2==0)
  72.                                         {
  73.                                                 F_R=OFF;
  74.                                                 Z_R=OFF;
  75.                                                 buzzer=OFF;
  76.                                                 break;
  77.                                         }
  78.                                 }
  79.                        
  80.                         }
  81.                 }
  82.           
  83.         }
  84. }
  85. void display2(uchar num3,uchar num4) //控制主干道数码管倒计时显示
  86. {
  87.         P0=table[num3];
  88.         wei_Z1=ON;
  89.         delay(1);
  90.         wei_Z1=OFF;

  91.         P0=table[num4];
  92.         wei_Z2=ON;
  93.         delay(1);
  94.         wei_Z2=OFF;
  95.        
  96.         if(key1==0)//主干道紧急制动
  97.         {
  98.                 delay(2);
  99.                 if(key1==0)
  100.                 {
  101.                         while(1)
  102.                         {
  103.                                 P0=0x00;
  104.                                 P3=0x00;
  105.                                 F_G=OFF;
  106.                                 F_Y=OFF;
  107.                                 F_R=ON;
  108.                        
  109.                                 Z_G=OFF;
  110.                                 Z_Y=OFF;
  111.                                 Z_R=ON;
  112.                                 buzzer=~buzzer;//蜂鸣器叫
  113.                                 if(key2==0)
  114.                                 {
  115.                                         delay(2);
  116.                                         if(key2==0)
  117.                                         {
  118.                                                 F_R=OFF;
  119.                                                 Z_R=OFF;
  120.                                                 buzzer=OFF;
  121.                                                 break;
  122.                                         }
  123.                                 }
  124.                        
  125.                         }
  126.                 }
  127.           
  128.         }
  129. }

  130. void main()
  131. {
  132.         int i;
  133.         buzzer=OFF;//关闭蜂鸣器
  134.         //初始状态支干道主干道禁止通行
  135.         Z_R=ON; //主干道红灯打开
  136.         F_R=ON; //支干道红灯打开
  137.        
  138.         for(i=0;i<210;i++) //延时
  139.                 {
  140.                         delay(10);
  141.                 }

  142.         Z_R=OFF;// 主干道红灯关闭
  143.         F_R=OFF;// 支干道红灯关闭       
  144.         init(); // 初始化计时器
  145.         while(1)
  146.         {
  147.                 /**************** 状态 1:支干道红灯 (30s), 主干道绿灯 (60s)************/
  148.                 /**************** 状态 2:支干道红灯 (30s), 主干道黄灯 (3s) ************/
  149.                 while(T_Z_G >= 0)
  150.                 {
  151.                         display1(T_F_R/10,T_F_R%10);// 支干道红灯 (60s)
  152.                         display2(T_Z_G/10,T_Z_G%10);// 主干道绿灯 (60s)
  153.                         Z_G=ON; // 主干道的绿灯打开
  154.                         F_R=ON; // 支干道的红灯打开
  155.                 }
  156.                 T_Y=3;// 重新赋值黄灯
  157.                 while(T_Y >= 0)
  158.                 {
  159.                         display1(T_Y/10,T_Y%10);// 支干道黄灯(3s)
  160.                         display2(T_Y/10,T_Y%10);// 主干道黄灯(3s)
  161.                         F_R=OFF; // 支干道的红灯关闭
  162.                         F_Y=ON;  // 支干道的黄灯打开
  163.                         Z_G=OFF; // 主干道的绿灯关闭
  164.                         Z_Y=ON;  // 主干道的黄灯打开
  165.                 }
  166.                 F_R=OFF; // 支干道的红灯关闭
  167.                 Z_G=OFF; // 主干道的绿灯关闭
  168.                 Z_Y=OFF; // 主干道的黄灯关闭
  169.                 F_Y=OFF; // 支干道的黄灯关闭
  170.                 T_F_G=30,T_F_R=60,T_Z_R=30;// 重新赋值
  171.                 /**************** 状态 3:支干道绿灯 (30s), 主干道红灯 (30s)**************/
  172.                 /*************** 状态 4:支干道黄灯 (3s) , 主干道红灯 (30s)***************/
  173.                 //init(); // 初始化计时器
  174.                 while(T_F_G >= 0)
  175.                 {
  176.                         display1(T_F_G/10,T_F_G%10);// 支干道绿灯 (30s)
  177.                         display2(T_Z_R/10,T_Z_R%10);// 主干道红灯 (30s)
  178.                         Z_R=ON;// 主干道的红灯打开
  179.                         F_G=ON;// 支干道的绿灯打开
  180.                 }
  181.                 T_Y=3;// 重新赋值黄灯
  182.                 while(T_Y >= 0)
  183.                 {
  184.                         display1(T_Y/10,T_Y%10);// 支干道黄灯 (3s)
  185.                         display2(T_Y/10,T_Y%10);// 主干道黄灯 (3s)
  186.                         F_G=OFF; // 支干道的绿灯关闭
  187.                         F_Y=ON;  // 支干道的黄灯打开
  188.                         Z_R=OFF; // 主干道的红灯关闭
  189.                         Z_Y=ON;  // 主干道的黄灯打开
  190.                 }
  191.                 Z_R=OFF; // 主干道的红灯关闭
  192.                 Z_Y=OFF;  // 主干道的黄灯关闭
  193.                 F_G=OFF; // 支干道的绿灯关闭
  194.                 F_Y=OFF; // 支干道的黄灯关闭
  195.                 T_Z_G=60,T_F_G=30,T_F_R=60,T_Z_R=30,T_Y=3;// 重新赋值
  196.         }
  197. }

  198. //定时器中断函数
  199. void timer1(void) interrupt 1
  200. {
  201.         //重装初值 0.05s
  202.         TH0=(65536-50000)/256;
  203.         TL0=(65536-50000)%256;  
  204.         count++;
  205.         if(count==20) //20次为1s    20*0.05=1
  206.         {
  207.                 T_Z_G--;
  208.                 T_F_G--;
  209.                 T_F_R--;
  210.                 T_Z_R--;
  211.                 T_Y--;
  212.                 count=0;
  213.         }

  214. }
复制代码

下载: C51交通灯.rar (72.37 KB, 下载次数: 6)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1064915 发表于 2024-11-8 09:54 | 只看该作者
Proteus版本高,打不开
回复

使用道具 举报

板凳
ID:986591 发表于 2024-11-14 22:36 | 只看该作者
joyb 发表于 2024-11-8 09:54
Proteus版本高,打不开

去下一个8.13版本的就行了
回复

使用道具 举报

地板
ID:1140081 发表于 2024-12-17 15:22 | 只看该作者
精品
回复

使用道具 举报

5#
ID:1142693 发表于 2025-1-14 13:56 | 只看该作者
麻烦问一下,为什么我的keil运行后有这些问题?
20.c(14): error C202: 'P2': undefined identifier
20.c(15): error C202: 'P2': undefined identifier
20.c(17): error C202: 'P2': undefined identifier
20.c(18): error C202: 'P2': undefined identifier
20.c(56): error C202: 'wei_F1': undefined identifier
20.c(58): error C202: 'wei_F1': undefined identifier
20.c(61): error C202: 'wei_F2': undefined identifier
20.c(63): error C202: 'wei_F2': undefined identifier
20.c(102): error C202: 'wei_Z1': undefined identifier
20.c(104): error C202: 'wei_Z1': undefined identifier
20.c(107): error C202: 'wei_Z2': undefined identifier
20.c(109): error C202: 'wei_Z2': undefined identifier
回复

使用道具 举报

6#
ID:986591 发表于 2025-3-26 15:03 | 只看该作者
mrj_142378 发表于 2025-1-14 13:56
麻烦问一下,为什么我的keil运行后有这些问题?
20.c(14): error C202: 'P2': undefined identifier
20.c ...

如果是用的是我的完整代码,我觉得是你编译器问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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