51单片机数码管显示0-99的问题

作者&投稿:里剑 (若有异议请与网页底部的电邮联系)
C51单片机:用数码管显示0到999的值。求c语言程序和原理图~


#include
#define uchar unsigned char
uchar temp;
int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char ledx[8];
bit s0,s1;
void delay(uchar z)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<z;j++);
}
void scan() //要是按键了,扫描键盘编码值
{
P1=0xF0;
delay(1);
temp=P1;
switch(temp)
{
case 0xe0: key1=0;
break;
case 0xd0: key1=1;
break;
case 0xb0: key1=2;
break;
case 0x70: key1=3;
break;
}
P1=0x0f;
delay(1);
temp=P1;
switch(temp)
{
case 0x0E: key=key1+0;
break;
case 0x0D: key=key1+4;
break;
case 0x0B: key=key1+8;
break;
case 0x07: key=key1+12;
break;
default : key=-1;
}
if((key1+1)&&(key+1)) disbuf=key;
}
void ejjc() //判断是否按键
{
P1=0xF0;
if(P1!=0xF0) { scan();s0=1;}
else { s0=0; s1=1;}
}
void main()
{
uchar i;
while(1)
{
ejjc();
if(s0==1 && s1==1)
{
s0=0;s1=0;
for(i=0;i<8;i++)
{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }
}
P0=0xff;
P2=LED7Code[ledx[0]];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[ledx[1]];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[ledx[2]];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[ledx[3]];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[ledx[4]];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[ledx[5]];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[6]];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[7]];
P0=0x7f;
delay(5);
}
}

可以通过代码优化的方式来简化代码。
一、设置延时函数
延时函数在单片机中有着让现实延时的能力,本程序中可以通过采用for循环方式进行延时,具体代码如下:
void delay()

uinti,j;
for(i=100;i>0;i--)
for(j=1000;j>0;j--);

二、设置数码管显示数组
数组定义简单,而且访问很方便。所有元素类型相同,在数码管显示程序中可以让程序代码减少。数组代码如下:
chara[10]={0xff,0x3,0x9f,0x25,0xd,0x99,0x49,0x41,0x1f,0x1,0x9};

三、设置数码管显示循环
数码管显示循环可以不用编写一次又一次的数码管显示代码,既方便又简洁。具体代码如下:
for(int i=0;i<10;i++)

P0=a[i];
delay();

扩展资料
单片机程序进行简化可以查看是否有反复出现的代码序列,整合成循环进行更改。同一类型且用法相同的变量可以整合成数组,方便对各个内容进行访问。有特定功能的代码段可以定义一个函数进行访问。
注意:用C51语言编辑的单片机程序与普通C语言不同,C51语言中的数据类型和标准c中的数据类型不同。

那个lalala有什么用?看程序是在P0口接一个共阳数码管。那同样在P2口再接一个数码管。这样,P0口的数码管显示十位数,P2口的数码管显示个位数。或在P2,P3口各接一个数码管。见下图。


这种接法属于静态显示电路。这个学会后,再练习动态显示电路。




怎样用单片机控制数码管显示0或者1?
1、LS147优先编码器的输入端和输出端都是低电平有效,即当某一个输入端低电平0时,4个输出端就以低电平0的输出其对应的8421BCD编码。当9个输入全为1时,4个输入出也全为1,代表输入十进制数0的8421BCD编码输出。2、不用单片机,用数字电路实现很容易呀。用一片10线-4线编码器,接10个按键,输...

单片机数码管显示
设计用PLC控制数码管循环显示数字0-9,控制要求如下(1)按下启动按钮后,数码管从0开始显示,1s后显示1,再过1s后显示2,…,显示9,1s后再重新屏示0.如此循环。(2)当按下停止孩钮后,数码管烟灭。7数码营实际上是由7只发光二极管组成,要显示0-9数字,首先确定数字与7只发光管(即PC的输出控制点)的...

单片机数码管如何从1显示到9
把 数码管的 1-9 的 对应的码算出来就好了 例如:#include <AT89X51.H>\/\/数字0-9的字形码unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};unsigned char dispcount;void delay02s(void);void main(void){ P1_0=0;\/\/选通第一位数码管 while(...

怎么的单片机一位数码管输入0xbe就可以显示1
这个取决于数码管引脚与单片机IO口的连接,0xbe显示1,说明数码管右边的两划(笔画段b和c)接在单片机某个端口的第0脚和第6脚,因为0xbe的二进制是10111110,两个0就是两个被点亮的笔画段,这是共阴数码管

单片机控制数码管1 按键控制开始、数码管循环显示0-F.时间间隔为1s的程...
P1口外接共阳极的8段数码显示器。P3.2外接一个按键,按下后,接地,用来起动.ORG 0000H JB P3.2,MOV R2, #0 LOOP:INC R2 MOV A, R2 ANL A, #0FH MOV DPTR, #TAB MOVC A, @A+DPTR MOV P1, A LCALL DL500MS LCALL DL500MS SJMP LOOP TAB:D...

单片机中数码管怎样显示
h> define uchar unsigned char define uint unsigned int void delay(uint x){ uchar j;while(x--){ for(j=0;j<125;j++)} } sbit wei=P1^0;void main(void){ wei=1;while(1){ P2=0x3f;\/\/显示数字0 delay(3000);P2=0x06;\/\/显示数字1 delay(3000);} } 这是共阴数码管的 ...

单片机菜鸟求高人指点 矩阵键盘 数码管,怎么实现:按1显示1,再按2显示1...
void scan();void disp_led(unsigned long int dat);void delay(unsigned int dly);void main(){for(k=0;k<=7;k++){SBUF=str[10];while(TI==0);TI=0;} while(1){scan();count=key_num;sum=sum*10+count;scan();while(key_num!=16)scan();disp_led(sum);delay(1);scan();...

让单片机中数码管显示“1”,若果显示“1”了,则一个灯亮起。依次,如果...
这个不可能需要外部检测,如果需要外部检测就需要有一个电流检测电路,就是检测每一路LED的电流是否正常,这种是专门为LED的ICT制具用的。另外一种就是采用光检测,即对每一段LED进行光采样,亮了才算OK。反正是三种方式,一种是非闭环测量,一种是电路闭环,一种是光闭环!

本人初学单片机,求第一个数码管显示1,1S后第二个数码管 显示2以此类推...
uchar code wema[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7}; \/\/位选,0-7位数码管 \/*延时子程序*\/ void delay(uint time){ while(--time);\/\/当time的值为非0时,执行空语句。当time为0时,跳出while语句。} \/*主程序*\/ void main(){ uchar i;\/\/定义一个无符号字符...

关于单片机输出数码管显示的问题?
这个对软件编程的确麻烦,想要改变的话,可以只取两个引脚,做串行输出,然后外加个串行转并行的芯片,如74HC595芯片,这样编程上就直观了;

环县13420019630: 51单片机数码管后两位!用动态显示从00到99编程那个地方错啦! -
豫霞更昔: 你只关闭的段选,位选没有关闭再打开,送入时候回出现重影,所以显示不正常

环县13420019630: 51单片机,数码管循环显示0 - 9,当每按一次中断,数码管显示0,延时一段时间后恢复之前中断时的显示 -
豫霞更昔: 单片机有很多种,编程要根据不同单片机进行. 编程思想为: main{ 设置单片机上与数码管相连的引脚为输出, 设置单片机中断接口(即中断按钮)的中断控制寄存器里的中断使能, 设置整体中断使能, 循环子程序xunhuan(); 显示0到9, } ...

环县13420019630: 1602显示数字0 - 99循环,求例子啊,最好是51单片机的噢~~ -
豫霞更昔: 给你写一个参考程序 /***************************************** * * * 显示0-99 * * ******************************************/ #include "REG52.H" sbit LCD_RS = P2^0;sbit LCD_EN = P2^1; #define LCD_DATA P0 unsigned char INT_TEMP; unsigned char ...

环县13420019630: AT98C51单片机数码管显示0.0秒到9.9秒循环计时C语言程序 -
豫霞更昔: #include<reg51.h>#define uchar unsigned char uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9 unsigned char times=0,sec=0,sec01,scanled; unsigned char disdat[2]; void dischg() { disdat[0]=sec01; disdat[1]=sec; } ...

环县13420019630: 求用51单片机接两个数码管,0 - 99动态显示程序(用C语言) -
豫霞更昔: #include #define uchar unsigned char #define uint unsigned int uchar DSY_CODE[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f }; void delay(uint x) { uchar i; while(x--)for(i=0;i<120;i++); } void main() { uchar i; P0 = 0x00; P2 = 0x00; while(1)...

环县13420019630: AT89S51单片机怎么用汇编语言让数码管从0到9显示 -
豫霞更昔: START:MOV R5,#00H ;次数计数单元R5,后面的程序应该看得懂了,都是教科书式的 MAIN: MOV A,R5 MOV DPTR,#TAB MOV A,@A+DPTR LCALL DISPLAY CJNE,R5,#10,START ;次数到,从头再来 LJMP MAIN DISPLAY: ;数码管显示...

环县13420019630: 51单片机c语言编程序让两位数码管显示0 - 99,求指导!!急用! -
豫霞更昔: 参考下网上的程序,只要明白两个问题就不难了,第一是数码管的结构及显示原理;第二是动态显示

环县13420019630: 在学习51单片机:s1,s2,控制加减,在数码管显示0 - 99的程序怎么写? 谢谢 -
豫霞更昔: ORG 0000H AJMP MAINORG 30H MAIN: MOV R1,#0 XUNH: LCALL DISP LCALL DELAY INC R1 CJNE R1,#100,XUNH AJMP MAIN ;显示P1口十位P2口个位,这样做就怎么也不会闪烁了把 DISP: MOV DPTR,#TAB ;共阴 MOV A,R1 MOV ...

环县13420019630: 51单片机控制单个数码管显示0 - 9,,,,请帮忙看看的的程序为什么不能实现效果 -
豫霞更昔: while (1) { dula=1; P0=0x3f; P0=0xff; //这行,应该删除 dula=0; delayms(200);……下面的,仿照这一行,都应该...

环县13420019630: 单片机 c语言 数码管两个计数 0 - 99 -
豫霞更昔: a代表十位数,b代表个位数 比如68这个数, 1:先定义赋值int a,b,c=68; 2:a=c/10 //因为是int型结果是6 3:b=c%10 //68取余10等于8 所以a就是6给数码管十位 b就是8给数码管个位

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网