找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于Protues的十字路口交通灯设计 数码管显示乱码 求帮助

  [复制链接]
跳转到指定楼层
#
ID:611977 发表于 2019-9-16 12:21 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
这是六月份做的设计实现的功能是十字路口的交通灯在设定时间进行红绿黄的切换,并设有数码管显示时间
主要用到的工具是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

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

使用道具 举报

10#
ID:862340 发表于 2020-12-19 10:22 | 只看该作者
手动输入时间怎么输入
回复

使用道具 举报

9#
ID:719349 发表于 2020-4-8 16:38 | 只看该作者
有按键没有程序,怀疑不是原创

回复

使用道具 举报

8#
ID:657999 发表于 2019-12-7 11:09 | 只看该作者
程序有问题。。。
回复

使用道具 举报

7#
ID:643415 发表于 2019-11-22 10:20 | 只看该作者
你的那三个按钮有什么用,有按键,不写程序
回复

使用道具 举报

6#
ID:643563 发表于 2019-11-20 16:38 | 只看该作者
解了燃眉之急,很好,感谢
回复

使用道具 举报

5#
ID:639969 发表于 2019-11-11 20:31 | 只看该作者
为啥编译不出来
回复

使用道具 举报

地板
ID:632779 发表于 2019-11-3 16:50 | 只看该作者
我下载了 不知道怎么用 点哪个啊 能救救我吗 555555
回复

使用道具 举报

板凳
ID:628474 发表于 2019-10-23 13:30 | 只看该作者
真棒 必须得赞一个
回复

使用道具 举报

沙发
ID:615240 发表于 2019-10-4 18:40 | 只看该作者
为什么数码管乱码了?
回复

使用道具 举报

楼主
ID:617818 发表于 2019-9-29 09:06 | 只看该作者
优秀,必须得赞一个
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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