怎么用C语言程序使双位数码管显示出稳定的数字

怎么用C语言程序使双位数码管显示出稳定的数字,第1张

可能原因:1你的延时时间可能太短,超过人眼视觉暂留时间,你可以改你的delayms(3)或者直接把delay 函数里的110改小一些(当然改了110就不是1ms一次了,不过本身就不是精确计时无所谓)

2你的数码管开关顺序不对,不知道你用的是共阴还是共阳,不过一般是写完数据后再开数码管控制位,如果你的程序里1是开,0是关的话,那么这个程序相当于是两个数码管在P1=table之后会有一个同时工作的时间,之后才关断其中一个,这时数码管的显示会受到影响。推荐编写顺序是shu12=0;

shu11=1;

P1=table[shi1];

delayms(5);

shu11=0;

shu12=1;

P1=table[ge1];

delayms(5);这样保证一个时间内只有一个数码管工作,新写入的数据不会对另一个数码管造成影响。下面的程序同样采用这种顺序。

3虽然可能性不大,不过也有可能是硬件电路的连接接触不良导致的信号跳变,这个万用表测下就能知道了

如果你的硬件已连接完善,那编程需:

1、动态扫描:在已个 t 时间内(可以是几个ms)选中 1 位数码管,以亮点该位数码管对应的码段,其他关断(不亮);而下一个 t 时间需点亮下一位数码管以此类推,循环起来。这个 t 可以用定时器准确控制。当然,如果你只是为了实现单纯的3个数码管显示,可以不精确时间,循环起来就是了(只要保证耽搁的显示时间少于肉眼识别时间,就是看起来不会一闪一闪的就行);

2、显示内容:多数情况下,待显示的字符/数字先按数码定义编码,存放在表格中。按自己的编程需要,在显示的时候从表格中提取。当然,如果只是简单实验,显示的内容是固定的,也可以程序里用立即数。

多试一试吧。

说明:主程序中的循环语句反复将 0~9 的段码送至 P0 口,使数字 0~9 循环显示

/

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};

//延时

void DelayMS(uint x)

{

uchar t;

while(x--) for(t=0;t<120;t++);

}

//主程序

void main()

{

uchar i=0;

P0=0x00;

while(1)

{

P0=~DSY_CODE[i];

i=(i+1)%10;

DelayMS(300);

}

}

/实验名称:定时中断0

功能:利用定时器,产生秒计数器,使数码管显示时间和年月日,还有跑表。

05-02-01

/

#include <reg51h>

//LCD的口线

sbit E=P3^5;

sbit RW=P3^6;

sbit RS=P3^7;

//8字LED的连接方法

//P07,P06,P05,P04,P03,P02,P01,P00

//G, F A E B H C D

sbit l1=P2^7;

sbit l2=P2^6;

sbit l3=P2^5;

sbit l4=P2^4;

sbit l5=P2^3;

sbit l6=P2^2;

sbit l7=P2^1;

sbit l8=P2^0;

sbit j1=P1^1;

sbit j2=P1^2;

unsigned char code ledcode[]={0x84,0xf5,0x46,0x54,0x35,0x1c,0x0c,0xd5,

0x04,0x14,0x05,0x2c,0x8e,0x64,0x0e,0x0f}; //数码管段码表

unsigned char ms,s,min,hour,t0100ms,t0101ms,t0sm,s0,s1,mi0,mi1,h0,h1,dsm,dsh,dsm0,dsm1,dsh0,dsh1;

unsigned int year,mouch,date,y3,y2,y1,y0,m1,m0,d1,d0,leap,bz,bz1,bz0,pb0,pb1,pb2,pb00,pb10,pb20,pb,cs;

void time0(void);

void delay();

void main(void)

{

E=0; //取消LCD对LED的影响

RW=0;

RS=1;

year=2009, mouch=10, date=18,leap=0;

y3=0, y2=0, y1=0, y0=0;

m1=0, m0=0, d1=0, d0=0;

bz=0,bz1=0,bz0=0;

pb0=0,pb1=0,pb2=0,cs=1;

ms=0,min=30,hour=12,s=50;

s0=0x00,s1=0x00;

mi0=0,mi1=0,h0=0,h1=0;

t0100ms=0x14;

t0101ms=0x14;

t0sm=0x01; //从第一个LED开始显示

TH0=0xee;

TL0=0x00;

TMOD=0x01;

TR0=1;

IE=0x82;

while(1)

{ if((year%4==0&&year%100!=0)||(year%400==0)) //判断是平年还是闰年

{leap=1;}

else

{leap=2;}

do

{

if(j1==0){delay(), bz++;}

if(bz==8){bz=0;}

switch(bz)

{ case 0:{ bz1=0;} break;

case 1:{ bz1=0;if(j2==0){delay(), min++;}} break;

case 2:{ bz1=0;if(j2==0){delay(), hour++;}} break;

case 3:{ bz1=1;if(j2==0){delay(), date++;}} break;

case 4:{ bz1=1;if(j2==0){delay(),mouch++;}} break;

case 5:{ bz1=1;if(j2==0){delay(), year++;}} break;

case 6:{ bz1=2;if(j2==0){delay(), dsm++;}} break;

case 7:{ bz1=2;if(j2==0){delay(), dsh++;}} break;

default:break; }

}

while(bz);

do

{

if(j2==0) {delay(),bz0++;}

if(bz0==5){bz0=0;}

switch(bz0)

{ case 0:{ bz1=0;} break;

case 1:{ bz1=1;if(j1==0){delay(),bz0=0;}} break;

case 2:{ bz1=3,pb=0,pb0=0,pb1=0,pb2=0;} break;

case 3:{ bz1=3;if(j1==0){cs=2,pb00=pb0,pb10=pb1,pb20=pb2;}} break;

case 4:{ bz1=3;if(j1==0){pb=1;}} break;

// case 2:{ bz1=0;if(j2==0){delay(), hour++;}} break;

// case 3:{ bz1=1;if(j2==0){delay(), date++;}} break;

// case 4:{ bz1=1;if(j2==0){delay(),mouch++;}} break;

// case 5:{ bz1=1;if(j2==0){delay(), year++;}} break;

default:break; }

}

while(bz0);

}

}

////////////////////////////////////

void delay()

{

unsigned int i,j,k;

for( i=10; i>0;i--)

for( j=20; j>0;j--)

for(k=100; k>0;k--);

}

///////////////////////////////////////

void time0(void) interrupt 1

{

TH0=0xee,TL0=0x00;

t0100ms--;

if(t0100ms==0x00){ t0100ms=20,ms++;

if(ms==10) { ms=0,s++;

if(s==60) { s=0,min++,m0=6;

if(min==60) { min=0,hour++;

if(hour==24) { hour=0,date++;

//

switch(mouch)

{ case 1:{if(date==32){date=0,mouch++;}}break;

case 2:{if(leap==1&&date==30){date=0,mouch++;}else{if(leap==2&&date==29){date=0,mouch++;}}}break;

case 3:{if(date==32){date=0,mouch++;}}break;

case 4:{if(date==31){date=0,mouch++;}}break;

case 5:{if(date==32){date=0,mouch++;}}break;

case 6:{if(date==31){date=0,mouch++;}}break;

case 7:{if(date==32){date=0,mouch++;}}break;

case 8:{if(date==32){date=0,mouch++;}}break;

case 9:{if(date==31){date=0,mouch++;}}break;

case 10:{if(date==32){date=0,mouch++;}}break;

case 11:{if(date==31){date=0,mouch++;}}break;

case 12:{if(date==32){date=0,mouch++;}}break;

case 13:{mouch=1,year++;}break;

default: break; }

}

}

}

}

}

if(min==60) {min=0;}

if(hour==24){hour=0;}

if((mouch==1||mouch==3||mouch==5||mouch==7||mouch==8||mouch==10||mouch==12)&&date==32){date=0;}

if((mouch==4||mouch==6||mouch==9||mouch==11)&&date==31){date=0;}

if(mouch==2&&leap==1&&date==30){date=0;}

if(mouch==2&&leap==2&&date==29){date=0;}

if(mouch==13){mouch=1;}

s0=s%10,s1=s/10%10;

mi0=min%10,mi1=min/10%10;

h0=hour%10,h1=hour/10%10;

d0=date%10,d1=date/10%10;

m0=mouch%10,m1=mouch/10%10;

y0=year%10,y1=year/10%10,y2=year/100%10,y3=year/1000;

dsm0=dsm%10,dsm1=dsm/10%10;

dsh0=dsh%10,dsh1=dsh/10%10;

if(dsm==60){dsm=0;}

if(dsh==24){dsh=0;}

//

if(bz0==4)

{}

else

if(bz0==3)

{ TH0=0xee,TL0=0x00;

t0101ms--;

if(t0101ms==0x00){ t0101ms=20,pb0++;

if( pb0==10) {pb0=0,pb1++;

if(pb1==10) {pb1=0,pb2++;

if(pb2==10) {pb2=0;}

}

}

}

}

/////////////////////////////////////////////////////////////////////////

t0sm++;

if(t0sm==9){t0sm=1; }

P0=0xff;

if(bz1==0)

{switch(t0sm)

{ case 1:{P2=0xff,l1=0;P0=ledcode[ms];} break;

case 2:{P2=0xff,l2=0;P0=ledcode[s0]&0xfb;} break;

case 3:{P2=0xff,l3=0;P0=ledcode[s1];} break;

case 4:{P2=0xff,l4=0;P0=ledcode[mi0]&0xfb;}break;

case 5:{if(bz==1){P2=0xff,l5=0;P0=ledcode[mi1]&0xfb;}else{P2=0xff,l5=0;P0=ledcode[mi1];}}break;

case 6:{P2=0xff,l6=0;P0=ledcode[h0]&0xfb;} break;

case 7:{if(bz==2){P2=0xff,l7=0;P0=ledcode[h1]&0xfb;}else{P2=0xff,l7=0;P0=ledcode[h1];}}break;

case 8:{P2=0xff,l8=0;P0=ledcode[bz]&0xfb;} break;

default:break; }

}

if(bz1==1)

{switch(t0sm)

{ case 1:{if(bz==3){P2=0xff,l1=0;P0=ledcode[d0]&0xfb;}else{P2=0xff,l1=0;P0=ledcode[d0];}} break;

case 2:{if(bz==3){P2=0xff,l2=0;P0=ledcode[d1]&0xfb;}else{P2=0xff,l2=0;P0=ledcode[d1];}} break;

case 3:{P2=0xff,l3=0;P0=ledcode[m0]&0xfb;} break;

case 4:{if(bz==4){P2=0xff,l4=0;P0=ledcode[m1]&0xfb;}else{P2=0xff,l4=0;P0=ledcode[m1];}} break;

case 5:{P2=0xff,l5=0;P0=ledcode[y0]&0xfb;} break;

case 6:{if(bz==5){P2=0xff,l6=0;P0=ledcode[y1]&0xfb;}else{P2=0xff,l6=0;P0=ledcode[y1];}} break;

case 7:{if(bz==5){P2=0xff,l7=0;P0=ledcode[y2]&0xfb;}else{P2=0xff,l7=0;P0=ledcode[y2];}} break;

case 8:{if(bz==5){P2=0xff,l8=0;P0=ledcode[y3]&0xfb;}else{P2=0xff,l8=0;P0=ledcode[y3];}} break;

default:break; }

}

if(bz1==2)

{switch(t0sm)

{ case 1:{P2=0xff;} break;

case 2:{P2=0xff;} break;

case 3:{P2=0xff;} break;

case 4:{if(bz!=6){P2=0xff,l4=0;P0=ledcode[dsm0];}else{P2=0xff,l4=0;P0=ledcode[dsm0]&0xfb;}}break;

case 5:{if(bz!=6){P2=0xff,l5=0;P0=ledcode[dsm1];}else{P2=0xff,l5=0;P0=ledcode[dsm1]&0xfb;}}break;

case 6:{P2=0xff,l6=0;P0=ledcode[dsh0]&0xfb;} break;

case 7:{if(bz!=7){P2=0xff,l7=0;P0=ledcode[dsh1];}else{P2=0xff,l7=0;P0=ledcode[dsh1]&0xfb;}}break;

case 8:{P2=0xff;} break;

default:break; }

}

if(bz1==3)

{switch(t0sm)

{ case 1:{if(pb==1){P2=0xff,l1=0;P0=ledcode[pb00];}else{P2=0xff,l1=0;P0=ledcode[pb0];}}break;

case 2:{if(pb==1){P2=0xff,l2=0;P0=ledcode[pb10]&0xfb;}else{P2=0xff,l2=0;P0=ledcode[pb1]&0xfb;}} break;

case 3:{if(pb==1){P2=0xff,l3=0;P0=ledcode[pb2];}else{P2=0xff,l3=0;P0=ledcode[pb2];}} break;

case 4:{P2=0xff;}break;

case 5:{P2=0xff,l5=0;P0=ledcode[cs];}break;

case 6:{P2=0xff;}break;

case 7:{P2=0xff;}break;

case 8:{P2=0xff;}break;

default:break; }

}

}

以上就是关于怎么用C语言程序使双位数码管显示出稳定的数字全部的内容,包括:怎么用C语言程序使双位数码管显示出稳定的数字、本人在用C语言编一段三位一体数码管动态显示程序,求高手指点、利用C语言编程在单只静态数码管循环显示0~9的10个数字。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9837511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存