标题: 基于Protues的十字路口交通灯设计 数码管显示乱码 求帮助 [打印本页]

作者: LLL燦    时间: 2019-9-16 12:21
标题: 基于Protues的十字路口交通灯设计 数码管显示乱码 求帮助
这是六月份做的设计实现的功能是十字路口的交通灯在设定时间进行红绿黄的切换,并设有数码管显示时间
主要用到的工具是Protues,原理图绘制以及最终仿真都是在上面进行
程序撰写用到的是keil,附件中有具体的原理图文件及实现的程序


1、进行东西方向、南北方向秒计时倒数(分红绿灯)
2、实现时间的LED数码管显示
3、具有手动输入的时间调整功能
4、具有黄灯3秒计时功能

设计流程图
        
明确电路实现的功能

分模块画出电路

将各模块连接起来

使用Keil C51编写控制程序

将程序Hex文件导入Proteus实现仿真

将仿真结果与设计要求进行对比

改进

设计所需器件:
  (1)共阴数码管4个(两位)
  (2)红黄绿LED灯各4个
  (3)AT89C51芯片1块
  (4)晶振1个
(5)电阻2个
(6)电容3个
(7)按键4个
(8)排阻1个
实现的程序如下:

#define shuma P0
#include "reg52.h"   
#define ON 0
#define OFF 1
typedef unsigned int u16;   //对数据类型进行声明定义
typedef unsigned char u8;

sbit  NS_G=P1^5;    // 南北绿灯
sbit  NS_Y=P1^4;    // 南北黄灯
sbit  NS_R=P1^3;    // 南北红灯
sbit  EW_G=P1^2;    // 东西绿灯
sbit  EW_Y=P1^1;    // 东西黄灯
sbit  EW_R=P1^0;    // 东西红灯
sbit  LED_D1=P2^3;    //  南北方向数码管位控制
sbit  LED_C1=P2^2;    //  南北方向数码管位控制
sbit  LED_B1=P2^1;    //  东西方向数码管位控制
sbit  LED_A1=P2^0;    //  东西方向数码管位控制

u8 count;

void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器   
}

void Delay10us(u8 z)
{
  u8 x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}

unsigned table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
     0x7f,0x6f};//显示0~9的值

void display1(u8 num1,u8 num2) //控制东西方向数码管显示
{
  shuma=table[num1];
  LED_A1=ON;
  Delay10us(1);
  LED_A1=OFF;
  shuma=table[num2];
  LED_B1=ON;
  Delay10us(1);
  LED_B1=OFF;
}

void display2(u8 num3,u8 num4)  //控制南北方向数码管显示
{
  shuma=table[num3];
  LED_C1=ON;
  Delay10us(1);
  LED_C1=OFF;
  shuma=table[num4];
  LED_D1=ON;
  Delay10us(1);
  LED_D1=OFF;
}  

void main()
{
    count=0;
    Timer0Init();//初始化计数器
   NS_R=OFF; //南北方向红灯关闭
   EW_R=OFF;  //东西方向红灯关闭
   while(1)
   {
    if(count==46)  //重新计数
    {
    count=0;
    }
    if(count<20)
    {
    display1((20-count)/10,(20-count)%10);//东西方向绿灯(20s)
    display2((23-count)/10,(23-count)%10);//南北方向红灯(23s)
    EW_G=ON;
        NS_R=ON;
        EW_R=OFF;
        NS_Y=OFF;
    }
    else if(count<23)
    {
    display1((23-count)/10,(23-count)%10);//东西方向黄灯(3s)
    display2((23-count)/10,(23-count)%10);//南北方向红灯倒计时(3s)
           EW_Y=ON;
         NS_R=ON;
         EW_G=OFF;
    }
    else if(count<43)
    {
    display1((46-count)/10,(46-count)%10);//东西方向红灯(23s)
    display2((43-count)/10,(43-count)%10);//南北方向绿灯(20s)
          EW_R=ON;
         NS_G=ON;
         EW_Y=OFF;
        NS_R=OFF;
    }
    else
    {
    display1((46-count)/10,(46-count)%10);//东西方向红灯倒计时(3s)
    display2((46-count)/10,(46-count)%10);//南北方向黄灯(3s)
     NS_Y=ON;
         EW_R=ON;
         NS_G=OFF;  
    }
}
}   

void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i==1000)
{
  i=0;
  count ++;
}
}


仅供有需要的师兄学习参考,请不要有其他用途,谢谢!

交通灯3.zip

104.76 KB, 下载次数: 187


作者: 你好,世界!    时间: 2019-9-29 09:06
优秀,必须得赞一个
作者: 小明同    时间: 2019-10-4 18:40
为什么数码管乱码了?
作者: 别欺负小爷    时间: 2019-10-23 13:30
真棒 必须得赞一个
作者: 2052077866    时间: 2019-11-3 16:50
我下载了 不知道怎么用 点哪个啊 能救救我吗 555555
作者: 潘宇航LYF    时间: 2019-11-11 20:31
为啥编译不出来
作者: 2156727542    时间: 2019-11-20 16:38
解了燃眉之急,很好,感谢
作者: GW-HUHUER    时间: 2019-11-22 10:20
你的那三个按钮有什么用,有按键,不写程序
作者: 11444507240    时间: 2019-12-7 11:09
程序有问题。。。
作者: 18337280540    时间: 2020-4-8 16:38
有按键没有程序,怀疑不是原创


作者: 五散温柔    时间: 2020-12-19 10:22
手动输入时间怎么输入




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1