找回密码
 立即注册

QQ登录

只需一步,快速开始

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

keil编程+51单片机仿真交通灯

[复制链接]
跳转到指定楼层
楼主
使用的Proteus软件来实现交通灯的仿真变化,系统的软件设计分为三个模块:动态显示模块、 交通灯工作模块、定时/计数器模块,初次实验有些问题,再次仿真又ok了,各位大佬看看什么问题。
以单片机AT89C51为核心,12 个发光二极管分成 4 组红绿黄三色灯构 成交通信号灯指示模块,4 个 LED 以西北方向各 1个分成 2 组构成倒计时显示模块选型如下

使用keil 4编程

结果如下
还望各位大佬指正,小白一枚,共同学习进步!

#include <reg51.h>       //51单片机头文件
#define uint unsigned int
#define uchar unsigned char     //定义数据类型
#define ON 0         //定义状态开
#define OFF 1
char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};     //共阴极数码管赋值
sbit N_R=P3^7;     //输出端口定义//南北红灯
sbit N_G=P3^6;    //南北绿灯
sbit N_Y=P3^4;    //南北黄灯

sbit W_R=P3^3;    //东西红灯
sbit W_G=P3^2;    //东西绿灯
sbit W_Y=P3^0;    //东西黄灯

sbit LED_C1=P2^0;   //南北方向数码管个位控制端口
sbit LED_D1=P2^1;
sbit LED_A1=P2^2;    //东西方向数码管个位控制端口
sbit LED_B1=P2^3;
uchar EW=30,NS=25,X=30,Y=25,Z=30,SHU=30;
uchar flag;
void init(void)    //定时器 T0初始化
{
TMOD=0x01;
TH0=0x3C;
TL0=0xB0;
EA=1;      //开总中断
ET0=1;
TR0=1;       //启动T0
}
void timer0() interrupt 1     //倒计时函数
{ TMOD=0x01;    //设置 T0定时方式1
  TH0=0x3C;         //高八位初值    5ms 初值
  TL0=0xB0;        //低八位初值
  EA=1;
  ET0=1;
  TR0=1;
  flag++;
  if(flag==20)     //1秒计时每1s时间减一
  {
    EW--;
  NS--;
  X--;
  Y--;
  Z--;   SHU--;
  flag=0;
  }
}
void delay(uchar z)     //延时函数
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display1(uchar num1,uchar num2)  //南北数码管显示函数
{
P0=led_mod[num1];     //显示
LED_C1=ON;        //个位显示开
delay(1);         //延时
LED_C1=OFF;         //个位显示关
P0=led_mod[num2];
LED_D1=ON;       //十位显示开
delay(1);
LED_D1=OFF;
}
void display2(uchar num3,uchar num4)   //东西数码管显示函数
{
P1=led_mod[num3];
LED_A1=ON;
delay(1);
LED_A1=OFF;
P1=led_mod[num4];
LED_B1=ON;
delay(1);
LED_B1=OFF;
}
void main()            //主函数
{
int i;
N_R=ON;W_R=ON;         //初始南北东西红灯均亮
for(i=0;i<210;i++)
{
   delay(10);
}
N_R=OFF;W_R=OFF;    //南北东西红灯关
  while(1)
  {
  while(1)   { init();
   N_G=ON;W_R=ON;       //开始南北绿灯亮 东西红灯亮
   while(EW!=0)
   {
   display1(EW/10,EW%10);     //东西方向红灯 20s
   display2(NS/10,NS%10);      //南北方向绿灯 25s
   while(EW==5)
    {
     while(X!=0)
     {
       display1(EW/10,EW%10);    //东西方向红灯 5s
    display2(X/10,X%10);     //南北方向黄灯 5s
    N_G=OFF;N_Y=ON;     //南北红灯关,黄灯开
     }
    }
     }
  W_R=OFF;N_G=OFF;N_Y=OFF;   //东西方向红灯关闭 南北方向绿灯关 南北方向黄灯关
闭  
  EW=30,NS=25,X=30,Y=25,Z=30,SHU=30;    //计数重新赋值
  while(1)
  { init();
   N_R=ON;W_G=ON;  //南北红灯开 东西绿灯开 kai
   while(Z!=0)
   {
   display1(Z/10,Z%10);      //东西方向红灯 30s
   display2(Y/10,Y%10);    //南北方向绿灯25s
   while(Z==5)
    {
     while(SHU!=0)
     {
       display1(Z/10,Z%10);     //东西方向红灯 5s
    display2(SHU/10,SHU%10);     //南北方向黄灯 5s
    W_G=OFF;W_Y=ON;        //东西红灯关闭 东西黄灯打开
     }
    }
     }
  N_R=OFF;W_G=OFF;W_Y=OFF;
  EW=30,NS=25,X=30,Y=25,Z=30,SHU=30;
  break;   //跳出当前循环语句
   }
}
}
}

51hei图片20231229152233.png (9.27 KB, 下载次数: 26)

51hei图片20231229152233.png

51hei录屏20231229151202.gif (744.85 KB, 下载次数: 32)

51hei录屏20231229151202.gif

下载.png (51.23 KB, 下载次数: 31)

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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