找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机数码管显示 程序跑飞

[复制链接]
跳转到指定楼层
楼主
5黑币
尝试写交通灯的程序,下面是两边数码管的显示,每一边数码管单独运行都没有问题,一起运行数码管就会跑飞,不明白原因何在,求指导
#include <reg52.h>
#define uchar unsigned char
typedef unsigned char uint8;
typedef unsigned int  uint16;  
uint8 second=20;   
uint16  mstcnt=0;
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
uchar second,minute,hour;
unsigned int tcount;
unsigned char m;

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
                        0xf8,0x80,0x90};  //共阳极
void delay(unsigned int i);
void time_pro( void)
{     
          if(second==0)//秒钟设为59进制   
        {  second=20;
        }
}   

void display()
{
  
   P1=table[second/10];
   P2_2 = 0;
   delay(5);
   P2_2= 1;

   P1=(table[second%10]& 0x7f);
   P2_3= 0;
   delay(5);
   P2_3= 1;

      P0=table[second/10];
   P2_0 = 0;
   delay(5);
   P2_0= 1;

   P0=(table[second%10]& 0x7f);
   P2_1= 0;
   delay(5);
   P2_1= 1;


}

/*演示主程序*/
void timer0(void) interrupt 1 using 0//定时器0方式1,250us中断一次  
{
        TH0=0xff;  
        TL0=0x19;         
        TMOD = 0x01;   
        mstcnt++;   
        if(mstcnt==4000)  
        {   
                second--;
        mstcnt=0; //注意对计数单元的清零  
        }   
}  
void timer1(void) interrupt 1 using 0//定时器0方式1,250us中断一次  
{
        TH0=0xff;  
        TL0=0x19;         
        TMOD = 0x01;   
        mstcnt++;   
        if(mstcnt==4000)  
        {   
                second--;
        mstcnt=0; //注意对计数单元的清零  
        }   
}  
void main(void)  
{  
        P0=0xff;
        P1=0xff; //初始化p0口,全设为1使数码管
         P2=0xff;  //初始化p2口,全设为1使数码管  
        TMOD = 0x01; //time0为定时器,方式1  
        TH0=0xff; //预置计数初值  
        TL0=0x19;  
        EA=1;   
        ET0=1;   
        TR0=1;   
         while (1)
        {   
                time_pro( ); //时间处理
                display( ); //显示时间
        }
}
/*演示主程序*/

void delay(unsigned int i)

{
  uchar j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}

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

使用道具 举报

沙发
ID:111634 发表于 2017-5-13 08:28 | 只看该作者
本帖最后由 zl2168 于 2017-5-13 15:59 编辑

实例30  带限行时间显示的模拟交通灯
Proteus仿真一下,确认有效。
实例30 带限行时间显示模拟交通灯.rar (40.64 KB, 下载次数: 5)

缩短亮灯时间,是为了仿真演示,便于观看,否则,你等得不耐烦了,实际应用时,可可修改延长。以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1
内有常用的单片机应用
100
案例,用于仿真实验操作,电路与程序真实可靠可信可行.书中电路和程序设计有详细说明,程序语句条条有注解。
仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。













回复

使用道具 举报

板凳
ID:123289 发表于 2017-5-13 12:27 | 只看该作者
程序运行的速度很快,你当设法在某此地方让程序停一停,不就好了吗?
回复

使用道具 举报

地板
ID:200257 发表于 2017-5-13 13:03 | 只看该作者
尝试下延时看看,我还没学到交通灯,有时单片机的频率比较高,一下子就运行过去了,稍微延时一下试下
回复

使用道具 举报

5#
ID:200281 发表于 2017-5-13 14:06 | 只看该作者
加个看门狗试试
回复

使用道具 举报

6#
ID:33530 发表于 2017-5-13 15:43 | 只看该作者
两个定时器都对    second 进行 -- 操作,有可能冲突了。
改成两个参数试试。
回复

使用道具 举报

7#
ID:153108 发表于 2017-5-13 16:46 | 只看该作者
延时太短了吧  ,
回复

使用道具 举报

8#
ID:200362 发表于 2017-5-13 17:20 | 只看该作者

尝试下延时看看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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