找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简易交通灯[c语言+仿真图]完整注释

[复制链接]
跳转到指定楼层
楼主
简易交通灯【c语言+仿真图】完整注释


单片机源程序:
  1. #include<reg51.h>
  2. #include<absacc.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define PA XBYTE[0xf8ff]                                //定义A口
  6. #define PB XBYTE[0xf9ff]                                //定义B口
  7. #define PC XBYTE[0xfaff]                            //定义C口
  8. #define CTRL XBYTE[0xfbff]                                //ctrol简写为CTRL 定义控制口

  9. uint i = 0, cnt = 120, flag=0;
  10. uchar table[]={                                                                        //共阴极
  11. 0x3f,0x06,0x5b,0x4f,
  12. 0x66,0x6d,0x7d,0x07,
  13. 0x7f,0x6f,0x77,0x7c,
  14. 0x39,0x5e,0x79,0x71
  15. };

  16. void display(int x, int y, int m, int n, int a, int  b, int c, int d);
  17. void delay(int);
  18. void main()
  19. {
  20.     CTRL = 0x80;                           //1000 0000B        方式选择控制字: A口方式0 A口位输出 C口高4位输出 B口方式0 B口输出 C口低4位输出
  21.         IP = 0x05;
  22.         TMOD = 0x01;                      //方式寄存器TMOD    0000 0001B 定时器0,方式1
  23.     TH0 = (65536-50000)/256;                          
  24.     TL0 = (65536-50000)%256; //定时50ms
  25.     EA = 1;                                         //开总中断
  26.     ET0 = 1;                                 //允许定时器0中断
  27.     TR0 = 1;                                 //开启定时器0
  28.     while(1)
  29.         {
  30.                 if(cnt > 65)                   //120-cnt 小于55
  31.                 {                                                                                   
  32.                           XBYTE[PA] = 0x33;  //0011 0011B PA2绿灯亮 PA3红灯亮
  33.                         display(0xfe ,0xfd, 0xfb, 0xf7, (cnt-65)/10, (cnt-65)%10, (cnt-60)/10, (cnt-60)%10);
  34.                 }  //1111 1110B,(P1.0) 1111 1101B,(P1.1) 1111 1011B,(P1.2) 1111 0111B,(p1.3)假设cnt=70即计数50次此时南北绿灯显示05 东西红灯显示10;
  35.                   else if(cnt > 60 && cnt <= 65)        //120-cnt介于 55与60之间
  36.                   {
  37.                     if(flag == 0)                           
  38.                         {
  39.                           XBYTE[PA] = 0x35;//0011 0101B  PA1黄灯亮  PA3红灯亮  
  40.                           display(0xff ,0xff, 0xfb, 0xf7, (cnt-60)/10,(cnt-60)%10, (cnt-60)/10,(cnt-60)%10);
  41.                         } //1111 1111B,1111 1111B 1111 1011B 1111 0111B 假设cnt=62 即计数120-62=58次,此时南北黄灯显示数字02 东西显示红灯02;
  42.                     if(flag == 1)                           
  43.                         {
  44.                           XBYTE[PA] = 0x35;//0011 0101B         PA1黄灯亮 PA3红灯亮
  45.                           display(0xfe ,0xfd, 0xfb, 0xf7, (cnt-60)/10,(cnt-60)%10, (cnt-60)/10,(cnt-60)%10);
  46.                         }//1111 1110B,1111 1101B,1111 1011B,1111 0111B 假设cnt=62 即计数120-62=58次,此时南北红灯显示数字02,东西显示绿灯02;
  47.                   }
  48.                 else if(cnt <= 60 && cnt > 5) //120-cnt介于 60与115之间
  49.                   {
  50.                         XBYTE[PA] = 0x1e; //0001 1110B   PA0红灯亮 PA5绿灯亮
  51.             display(0xfe ,0xfd, 0xfb, 0xf7, (cnt)/10,(cnt)%10, (cnt-5)/10,(cnt-5)%10);
  52.                   }//1111 1110B,1111 1101B,1111 1011B,1111 0111B    假设cnt=40 即计数120-40=80次,此时南北红灯显示数字40,东西绿灯显示35;
  53.                 else if(cnt > 0 && cnt <= 5) //120-cnt 介于 115与120之间
  54.             {
  55.                         if(flag == 0)
  56.                         {
  57.                           XBYTE[PA] = 0x2e;//0010 1110B        PA0红灯亮 PA4黄灯亮
  58.                           display(0xfe ,0xfd, 0xff, 0xff, (cnt)/10,(cnt)%10, (cnt)/10,(cnt)%10);
  59.                         }//1111 1110B,1111 1101B,1111 1111B,1111 1111B 假设cnt=3即计数120-3=117次,此时南北红灯显示数字03,东西黄灯显示数字03
  60.                     if(flag == 1)
  61.                         {
  62.                           XBYTE[PA] = 0x2e;//0010 1110B         PA0红灯亮 PA4黄灯亮
  63.                           display(0xfe ,0xfd, 0xfb, 0xf7, (cnt)/10,(cnt)%10, (cnt)/10,(cnt)%10);
  64.                         }//1111 1110B,1111 1101B,1111 1101B,1111 0111B 假设cnt=3即计数120-3=117次,此时南北红灯显示数字03,东西黄灯显示数字03
  65.                 }
  66.         }
  67. }

  68. void display(int x, int y, int m, int n, int a, int  b, int c, int d)                           //数码管
  69. {
  70.     P1 = x;                                  //P1.0
  71.         PB = table[a];                  //南北方向高位数码管显示数字
  72.         delay(1);                          //调用延时函数
  73.     P1 = y;                                  //P1.1
  74.         PB = table[b];                  //南北方向低位数码管显示数字
  75.         delay(1);                          //调用延时函数
  76.                                                 
  77.         P1 = m;                                  //P1.2
  78.         PC = table[c];                  //东西方向高位数码管显示数字
  79.         delay(1);                          //调用延时函数
  80.     P1 = n;                                  //P1.3
  81.         PC = table[d];                  //东西方向低位数码管显示数字
  82.         delay(1);                      //调用延时函数
  83. }

  84. void delay(int z)                         //延时子程序
  85. {
  86. uint x,y;
  87. for(x=z;x>0;x--)
  88. for(y=110;y>0;y--);
  89. }

  90. void mytimer0() interrupt 1                 //定时器中断0
  91. {
  92.   TH0 = (65536-50000)/256;
  93.   TL0 = (65536-50000)%256;                 //定时50ms

  94.   i++;
  95.   if(i >= 10)                                         //T=50ms*10=500ms
  96.   {
  97.     flag ++;                                        //flag每0.5秒加1
  98.     i = 0;
  99.   }

  100.   if(flag > 1)                                                
  101.   {
  102.           flag=0;
  103.         cnt --;                                                 //cnt每秒减1
  104.   }


  105. …………限于本文篇幅 余下代码请从51hei下载附件…………
复制代码

下载:
NO.3.rar (60.16 KB, 下载次数: 80)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:259641 发表于 2017-12-10 10:29 | 只看该作者
没有黑币啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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