找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红绿灯设计

[复制链接]
跳转到指定楼层
楼主
源代码
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<absacc.h>
  4. #define COM8255 XBYTE[0x70ff]    //定义并设置控制口的地址
  5. #define PA8255 XBYTE[0x70fc]     //定义并设置PA口地址
  6. #define PB8255 XBYTE[0x70fd]     //定义并设置PB口地址
  7. #define PC8255 XBYTE[0x70fe]     //定义并设置PC口地址
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. uint shi,ge,num;
  11. int temp=10;
  12. uint arrow_j,arrow_j_1;
  13. uint i_inter;
  14. uint t=4,x=1,y=1,k,m;

  15. uchar code Tab_1[]={0x7f,0xbf,0xdf,0xe0}; //arrow
  16. uchar code Tab_2[]={0x18,0x3c,0x7e,0x18}; //arrow

  17. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极0-9字形代码

  18. sbit led_1=P3^0;            //LED显示(十位)
  19. sbit led_2=P3^1;           // LED显示(个位)
  20. sbit led_3=P3^5;          //黄灯
  21. sbit led_5=P3^3;
  22. sbit led_4=P3^2;

  23. void delay(uint z)
  24. {
  25.    uint x,y;
  26.    for(x=z;x>0;x--)
  27.    for(y=10;y>0;y--);
  28. }

  29. void arrow()                       //点阵箭头显示函数
  30. {       
  31.    for(arrow_j=0;arrow_j<4;arrow_j++)
  32.    {  
  33.             PA8255=Tab_1[arrow_j];          
  34.          PB8255=Tab_2[arrow_j];
  35.          delay(1);
  36.    }   
  37.        
  38. }

  39. main()
  40. {  
  41.    P2=0x00;
  42.    COM8255=0x80;
  43.    led_3=0;        //黄灯灭
  44.    num=0;
  45.    PC8255=0x00;

  46.    IT1=1;                                                  //外部中断1的中断请求触发方式为脉冲触发
  47.    EX1=1;                                                  //开放外部中断1
  48.    IT0=1;                                                  //外部中断0的中断请求触发方式为电平方式
  49.    EX0=1;                                                  
  50.    PX1=1;                         //设置中断优先级,外部中断1优先
  51.    PX0=1;

  52.    TMOD=0x01;                                         //定时器方式,模式1,16位
  53.    TH0=15536/256;                 //设置定时起点
  54.    TL0=15536%256;
  55.    EA=1;                                                  //开放所有中断
  56.    ET0=1;                                                  //开放定时器/计数器0中断
  57.    TR0=1;
  58.                                                      //启动定时器/计数器0
  59.    while(1)                             //等待中断
  60.    {
  61.              x=1;
  62.           y=1;
  63.           shi=temp/10;
  64.           ge=temp%10;
  65.           P1=0xff;
  66.           led_1=1;
  67.           led_2=0;
  68.           P1=table[shi];
  69.           delay(15);

  70.           P1=0xff;
  71.           led_1=0;
  72.           led_2=1;
  73.           P1=table[ge];
  74.           delay(15);
  75.           arrow();
  76.    }
  77. }
  78. void T0_time() interrupt 1       //定时中断
  79. {
  80.     TH0=15536/256;               //重新设置定时起点
  81.         TL0=15536%256;
  82.         num++;
  83.         if(num==10)                                         //十秒结束,重设,可以修改倒计时
  84.         {
  85.            num=0;
  86.            temp--;
  87.            if(temp+1==0)
  88.            {
  89.                      if(PC8255<2)
  90.                   {
  91.                      PC8255=PC8255+1;
  92.                   }
  93.                   else
  94.                   {
  95.                     PC8255=0x00;
  96.                   }       
  97.                   temp=10;
  98.            }
  99.         }
  100. }  
  101. void inter() interrupt 2         //夜间行驶中断函数(外部1中断)
  102. {
  103.    delay(2000);
  104.    while(y==1)                                        //为了第二次按下按钮跳出中断
  105.    {
  106.             led_3=1;         //黄灯亮
  107.          for(i_inter=0;i_inter<150;i_inter++)    //延时显示倒计时,同时点阵扫描显示
  108.             {
  109.          P1=0xff;
  110.          led_1=1;
  111.          led_2=0;
  112.          P1=table[shi];
  113.          delay(15);
  114.          if(i_inter==75)
  115.          led_3=0;
  116.          P1=0xff;
  117.          led_1=0;
  118.          led_2=1;
  119.          P1=table[ge];
  120.          delay(15);
  121.          arrow();                        //箭头函数
  122.    }

  123.    PA8255=0xff;
  124.    PB8255=0xff;
  125.    temp--;
  126.    if(temp+1==0)
  127.    {
  128.             if(PC8255<2)
  129.          {
  130.            PC8255=PC8255+1;
  131.          }
  132.          else
  133.          {
  134.             PC8255=0x00;
  135.          }
  136.          temp=10;
  137.    }
  138.    shi=temp/10;
  139.    ge=temp%10;
  140.    if(led_5==0)                                                             //等待第二次按下按钮
  141.    {
  142.              y=0;
  143.           while(led_5==0);                            
  144.    }
  145. }
  146. }

  147. void inter1() interrupt 0                                         //紧急情况中断函数设计
  148. {
  149.    delay(1000);
  150.    k=PA8255;
  151.    m=PC8255;
  152.   while(x==1)
  153.    {
  154.              PC8255=0xff;
  155.           PA8255=0x00;
  156.           P1=0xff;
  157.           if(led_4==0)                  
  158.           {         
  159.              delay(10000);
  160.                  if(led_4==0)                                                  //等待第二次按下按钮
  161.                  {
  162.                    x=0;
  163.                    while(led_4==0);
  164.                  }
  165.           }
  166.    }

  167.    PA8255=k;
  168.    PC8255=m;
  169. }





















复制代码



360反馈意见截图1619082378116104.png (40.98 KB, 下载次数: 72)

电路图

电路图

单片机实训.rar

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

实训源码

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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