1、首先我们先打开keil。2、接着,我们要定义好库函数,void main(){while(1)//不断循环显示{dispaly();}}void dispaly(){P0=smg[1];//选择显示数字几,P1=0x7f;//控制是否点亮数码管。3、接着,我们加上一条

d = 0;//显示567- for(d = 0;d<20;d++){

按键静态显示不同数字,即按1键显示1 动态显示:数字移动显示 / include define uint unsigned int define uchar unsigned char sbit Dp=P0^6;sbit d1=P2^4;sbit d2=P2^5;sbit d3=P2^6;sbit d4=P2

1.仿真用的可能是CC共阴型数码管,你改成共阳(CA)试一试。2.程序中0~9的译码应该段码是低电平点亮,针对的是CA数码管,所以位选应该是高电平才能点亮,a=0;b=0;c=0;d=1时点亮第一位,程序中a,b,c,d全都要

} P2用共阳的数码管。单片机c51 用四位七段数码管动态显示一个数字。

求救,单片机at89c51 用四位七段数码管怎么样动态显示一个数字,我的不能得到结果1234

没有先后顺序,只有位选信号和段选信号都有打开效时,数码管才亮

1、数字显示不同 段选用于控制数码管的笔画,也就是数码管显示数字内容,字母也可以显示。位选用于控制多个数码管中的一个或几个数码管是否显示数字或字符。2、关闭是否显示内容不同 位选如果关闭就不会显示任何内容。3、

数码管不是一定要先段选再位选的,输出以后要有一定的时间延时才行,这样人才看得见,还有段选的时候是排它的,不然就会在两个管子上显示相同的内容,一般多个数码管都是用动态扫描,就是说一个管子显示一般几十个ms再显示

运行这两段程序请前先将数码管的位和段进行合理的初始化,然后再试试.

你的电路是什么样子的啊,有没有用到锁存器啊,要是有的话怎么写都行,但是要是没有的话就不可以了啊,因为你是用的一个口来控制段选和位选的,

单片机段选程序和位选程序的书写顺序不一样时LED显示的就不一样是怎么回事啊?

1、按键子程序:实现按第一个键使键值keyvalue=1,第二个键使键值keyvalue=2,第三个键使键值keyvalue=3 2、显示子程序 定义3个字节的显示缓存,如dispbuf1,dispbuf2,dispbuf3 使dispbuf1的数字显示在第一个数码管上

没有按键按下时原值不变---*/#include//包

51单片机用一个按键,定义一个位变量,或一个8位的变量,按一下键变量为1,再按一下变量为0。然后显示时,再根据变量值来决定显示内容,变量为1,显示123456,变量为0显示321456。

5. [问答题] [技能题画10配线图写出程序]按下按钮S1,数码管显示1;按下按钮S2,数码管显示2;按下按钮S3,数码管显示3;按下按钮S4,数码管显示4;能互相直接切换。按下停止按钮后,数码管熄灭。。

51单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示

char #define uint unsigned int // 加黑的都是定义头文件sbit led0=P2^0;sbit led1=P2^1;sbit led2=P2^2;sbit led3=P2^3;sbit led4=P2^4;sbit led5=P2^5;sbit led6=P2^6;sbit led7=P2^7;

init();//初始化子程序 miao=0;shi=0;fen=0;while(1){ display(miao,fen,shi);} }void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar miao,uchar fen,uchar

以上为参考程序,部分需要稍作修改 数码管显示原理 数码管简介组成:LED数码管由7段或8段发光二极管组成,在平面上排成8字型。分类:有共阴极和共阳极两种。显示原理:使某些段点亮而另一些段不亮就可以显示0---9,A---

unsigned int b;void t0()interrupt 1 using 1 /*中断程序负责显示b的值 */ { unsigned char a1=0,a2=0,a3=0,a4=0;static int k=0;/*数码管扫描显示*/ a1=b/1000;/*取b的千位*/ a2=b%1000/100;/*

DJNZ R0,LD ;下一位循环 SJMP DISPLY ;显示了一遍循环 RET DTAB:DB 6FH,7FH,07H,7DH,6DH DB 66H,4FH,5BH,06H,3FH ;数字9~0 DELAY:MOV R7,#250 DELAY1:MOV R6,#250 DELAY2:MOV R5,#4 DELAY3

LedOut[3]=Disp_Tab[LedNumVal%10];LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位 LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点 LedOut[6]=Disp_Tab[LedNumVal%100/10];

段码就是0-9,位码就是每个数字的公共端点。开关位码就可以显示或关闭对应的数字。动态显示的原理就是用单片机把段码送给数码管,然后点亮相应的位码。比如你可以考虑建立一个数组放090601,然后由程序先送出0,然后点亮第

高分悬赏 89C51 LED显示数字程序?

修改显示函数如下:void smg_display(uchar FirstBit, uchar Num){ uchar i;for(i = 0; i < Num; i++) { P1 = smg_wei[i + FirstBit]; wei = 1; wei = 0;P1 = temp[i]; duan = 1;

告诉你原因了 你要自己分析,学这个东西就是要自己钻研 ,实在不会再求教,我感觉 你能看到这里,以你自己的能力可以找到这个原因的,你太过于要结果了,而不注意单片机的意义,以上,知悉

没看到电路、程序,完全是猜测:通常现在点亮数码管都用分时电路,也就是跟总线制的数据交换类似的,共用数据线+单独的片选信号构成分时复用。这种分时方式,适应高速CPU跟低速外围输入输出接口,可以减少I/O口的占用,是比较划

你这个代码.只会导致最后一个脚也就是6脚的led亮.其他的都不亮了..因为..显示led后面肯定还有其他代码.那些代码在运行的时候只有6脚的公共端选通了.因为前面的5个led都是只通电一下.很短时间..根本没用..要实现数码

单片机数码管显示。为什么会一个亮其他的都暗呢?+100

你这么问,谁能知道是什么原因。问是神马玩意?是仿真图?具体情况都 不知道,怎么知道为什么? 还是自己焊接的板子?还这买的开发板?还是什么板子? 是你写程序后,就亮一个,还是什么时候亮一个? 具体情况说明白。
长期点亮就是 数码管最亮 的时候。 但动态显示中做不到长期点亮,那么就要换种说法:最大可能让它长期亮,就是 数码管最亮的时候。也就是说,数码管亮的时间越长,它就越亮。 又但是,动态显示中,数码管亮的时间越长,几个数码管就会变得一闪一闪的,甚至是,一个亮完另一个亮,跟流水灯似的。这就是所谓的:刷屏! 因此,又得换一种说法:在保证不闪的情况下,最大可能让它长期亮。 这就是主题了——刷新率。这个名词不陌生,以前的显示器,特别是台式显示器上就要调这个参数。调高了(75Hz),显示器支持不了,调低了(50Hz),屏幕忽闪忽闪的。但用在数码管上,估计比较难入座。 从以前的显示器上,可以得到经验,50Hz对人而言,会闪烁。75Hz已经完全看不出来了。降低一点要求,60Hz绝大多数人已经感觉不到闪烁了。这个刷新率怎么用在数码管上? 为了方便计算,以50Hz为例,则周期T=1/F=20ms,也就是20ms重复一周。假设你有4个数码管,则每个数码管有 5ms 的时间。也就是说,这就是“最大可能的时间”了。每隔这“最大时间”切换一位数码管,就能让数码管到达 最大辉度(亮度)了。 当然,最大亮度也不可能超出硬件设计范围,如果硬件设计驱动电流不够,那么软件怎么弄都是白扯!
#include #include void delay(unsigned int i); //函数声名 char DelayCNT;//定义变量 //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制 //此表为8个数码管位选控制, 共阴数码管 1-8个 - unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制 /************主函数**********************/ main() { unsigned int i,LedNumVal=1 ; //变量定义 unsigned int LedOut[10]; //变量定义 DelayCNT=0; while(1) { if(++DelayCNT>=20) //控制数字变化速度 { DelayCNT=0; //20个扫描周期清零一次 ++LedNumVal; //每隔20个扫描周期加一次 } LedOut[0]=Disp_Tab[LedNumVal%10000/1000]; LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80; LedOut[2]=Disp_Tab[LedNumVal%100/10]; LedOut[3]=Disp_Tab[LedNumVal%10]; LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位 LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点 LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位 LedOut[7]=Disp_Tab[LedNumVal%10]; //个位 for( i=0; i<9; i++) { P0 = LedOut[i]; P1 = dispbit[i]; //使用查表法进行位选 /* switch(i) //使用switch 语句控制位选 { case 0:P1 = 0x7F; break; case 1:P1 = 0xbF; break; case 2:P1 = 0xdF; break; case 3:P1 = 0xeF; break; case 4:P1 = 0xf7; break; case 5:P1 = 0xfb; break; case 6:P1 = 0xfd; break; case 7:P1 = 0xfe; break; } */ delay(150); //扫描间隔时间 太长会数码管会有闪烁感 } } } void delay(unsigned int i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); }
  #include   #define uchar unsigned char   #define uint unsigned int   sbit dula=P2^6;   sbit wela=P2^7;   void delay(uint z);   void display(uchar num1,uchar num2,uchar num3);   uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //uchar code tablewe[]={0xfe,0xfd,0xfb};   uchar num1,num2,num3,num,aa;   void init();   void display(uchar num1,uchar num2,uchar num3);   void main()   {   init();   while(2)   {   if(aa==1)   {   aa=0;   num++;   num2=num/10;   num3=num%10;   if(num==100)   {   num=0;   num1++;   if(num1==9)   num1=0;   }   }   display(num1,num2,num3);   }   }   void display(uchar num1,uchar num2,uchar num3)   {   dula=1;   P0=tabledu[num1];   dula=0;   P0=0xff;   wela=1;   P0=0xff;   wela=0;   delay(1);   dula=1;   P0=tabledu[num2];   dula=0;   P0=0xff;   wela=1;   P0=0xfd;   wela=0;   delay(1);   dula=1;   P0=tabledu[num3];   dula=0;   P0=0xff;   wela=1;   P0=0xfb;   wela=0;   delay(1);   }   void delay(uint z)   {   uint x,y;   for(x=z;x>0;x--)   for(y=110;y>0;y--);   }   void timer1()interrupt 3   {   TMOD=0x10;   TH1=(65536-10000)/256;   TL1=(65536-10000)%256;   aa++;   }   void init()   {   TH1=(65536-10000)/256;   TL1=(65536-10000)%256;   EA=1;   ET1=1;   TR1=1;   wela=0;   dula=0;   aa=0;   num=0;   num1=0;   num2=0;   num3=0;   }   这是我以前编的一个简单计数程序,显示三个数码管的。没有按你的要求修改   显示六个数码管,直接加几个参量就行了,一样的,自己动手修改下吧。   good luck!
1、首先,要把代码写好,点亮数码管。 2、代码写完后,要确认原先写好的代码是不是正确的。 3、确认代码无误后,进入下一步,就是在这一行代码(箭头所指)的地方,将这四个字删去。 4、然后如图所示,四个字已经删去,只要改成数字相应的代码即可。 5、这里改成的是代表数字0的代码,如图所示。 6、最后写好代码后,将生成的hex文件写进单片机,数码管显示的数字就变成0了。
段选就是让数码管里的八段里的哪一段亮,位选就是让一些数码管里的哪一个数码管亮,你程序应该是四个数码管的。 通过位选,段选来达到让不同的数码管显示不同的字符
建议 用图上的 如果用你自己写的这个代码,因为有时候(不是经常),打开段选后,以前的P0之前的数据就会进来,影响实际效果 但是截图上,是先改变数据,后打开,就避免了这个问题
1.仿真用的可能是CC共阴型数码管,你改成共阳(CA)试一试。 2.程序中0~9的译码应该段码是低电平点亮,针对的是CA数码管,所以位选应该是高电平才能点亮,a=0;b=0;c=0;d=1时点亮第一位,程序中a,b,c,d全都要取反。
程序错了吧。看看这个程序,可以参考一下。 #include#define uchar unsigned charuchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0到9uchar num;uchar led[]={1,2,3,4}; void t0isr() interrupt 1{TH0=(65536-5000)/256;TL0=(65536-5000)%256;switch(num){case 0:P2=0x01;break;case 1:P2=0x02;break;case 2:P2=0x04;break;case 3:P2=0x08;break;default:break;}P0=~tab[led[num]];num++;num&=0x03;} main(){TMOD=0x11;TH0=(65536-5000)/256;TL0=(65536-5000)%256;TR0=1;ET0=1;EA=1;while(1);}