51单片机怎么让数码管显示学号?用汇编语言

作者&投稿:弥放 (若有异议请与网页底部的电邮联系)
AT89C51单片机怎么用汇编语言让数码管显示学号?最好有电路图~

数码管连接电路如图1所示,P0口输出码型,P2口输出位选。锁存器74HC573起驱动作用,提供驱动电流供数码管发光。译码器74HC138将位选地址转换成位选信号,例如当前是第5个数码管显示,那么P2口输出位选地址05H,译码器输入CBA=110,输出位选信号Y7-Y0=11101111,其中Y5=0,第5个数码管选通并显示,其它数码管不显示。实验时将J6的左边两个引脚针(1和2)用跳冒连接,锁存器11脚接VCC,关闭锁存功能。
数码管显示方式为动态扫描方式,当P0口送第一个数0的码型到锁存器时,P2送位选地址01H,即Y0=0,只有第一个数码管亮,显示0,其他数码管不显示。当P0口送第二个数1的码型到锁存器时,P2送位选地址02H,即Y1=0,只有第二个数码管亮,显示1,其他数码管不显示。即每次只有一个数码管点亮,8个数码管是轮流被点亮的,轮流点亮的间隔时间很短(一般用延时程序延时几个毫秒),由于视觉的暂留现象,看到的却好象全都点亮着,这就是动态扫描。
数码管显示数字的码型由数码管的数据脚a~dp决定,图2为数码管的笔段分布图,由于是共阴极的,所以当a~dp为高电平时相应的笔段会亮,电路中P1.0~P1.7分别接数码管的a.b.c.d.e.f.g.dp,得到0~9这10个数字的码型如表1所示。
图2 数码管的笔段分布图
引脚P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0数字 码型
笔段dpgfedcb a
0011111 10 3FH
0000011 01 06H
0101101 12 5BH
0100111 13 4FH
0110011 04 66H
0110110 15 6DH
0111110 16 7DH
0000011 17 07H
0111111 18 7FH
0110111 19 6FH
1000000 0小数点80H
只要把上面的相关数,改成学好就可以了。

1、首先我们先打开keil。

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

3、接着,我们加上一条循环语句。delay(5);//显示5毫秒P0=0XFF;//消影P0=smg[2];P1=0xbf;delay(5);P0=0XFF;P0=smg[3]。

4、最后,我们把先前定义的延时语句delayms写好。

5、最后,点击这里进行编译,生成一个hex文件。

6、如果这里无错误警告的话,就说明我们的程序写对了,那我们就可以点亮动态数码管了。

数码管连接电路如图1所示,P0口输出码型,P2口输出位选。锁存器74HC573起驱动作用,提供驱动电流供数码管发光。译码器74HC138将位选地址转换成位选信号,例如当前是第5个数码管显示,那么P2口输出位选地址05H,译码器输入CBA=110,输出位选信号Y7-Y0=11101111,其中Y5=0,第5个数码管选通并显示,其它数码管不显示。实验时将J6的左边两个引脚针(1和2)用跳冒连接,锁存器11脚接VCC,关闭锁存功能。

    数码管显示方式为动态扫描方式,当P0口送第一个数0的码型到锁存器时,P2送位选地址01H,即Y0=0,只有第一个数码管亮,显示0,其他数码管不显示。当P0口送第二个数1的码型到锁存器时,P2送位选地址02H,即Y1=0,只有第二个数码管亮,显示1,其他数码管不显示。即每次只有一个数码管点亮,8个数码管是轮流被点亮的,轮流点亮的间隔时间很短(一般用延时程序延时几个毫秒),由于视觉的暂留现象,看到的却好象全都点亮着,这就是动态扫描。

  数码管显示数字的码型由数码管的数据脚a~dp决定,图2为数码管的笔段分布图,由于是共阴极的,所以当a~dp为高电平时相应的笔段会亮,电路中P1.0~P1.7分别接数码管的a.b.c.d.e.f.g.dp,得到0~9这10个数字的码型如表1所示。

图2 数码管的笔段分布图

引脚 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1P0.0数字  码型

笔段 dp g f e d c b   a

0 0 1 1 1 1 1   1 0     3FH

0 0 0 0 0 1 1    0 1     06H

0 1 0 1 1 0 1   1 2      5BH

0 1 0 0 1 1 1  1 3      4FH

0 1 1 0 0 1 1   0 4      66H

0 1 1 0 1 1 0   1 5      6DH

0 1 1 1 1 1 0  1 6     7DH

0 0 0 0 0 1 1  1 7      07H

0 1 1 1 1 1 1  1 8       7FH

0 1 1 0 1 1 1  1 9       6FH

1 0 0 0 0 0 0  0 小数点80H

只要把上面的相关数,改成学好就可以了。



ORG 00H
AJMP MAIN
ORG 30H

MAIN: MOV 20H,#2 ;把你的学号的10位送到相应单元
MOV 21H,#8
MOV 22H,#3
MOV 23H,#0
MOV 24H,#8
MOV 25H,#5
MOV 26H,#0
MOV 27H,#4
MOV 28H,#0
MOV 29H,#7
LCALL DISP ;显示子程序
AJMP MAIN

DISP: MOV A,20H ;送最高位到A
ACALL SEG7 ;取码指针子程序
MOV P0,A ;段码送P0口
CLR P2.0 ;位选
ACALL DLY ;延时1MS,即显示1MS
SETB P2.0 ;关显示。 动态显示的方法就是 :取优码,送段码,位选,延时1MS,关显示.
MOV A,21H ;下一位
ACALL SEG7
MOV P0,A
CLR P2.1
ACALL DLY
SETB P2.1
MOV A,22H
ACALL SEG7
MOV P0,A
CLR P2.2
ACALL DLY
SETB P2.2
MOV A,23H
ACALL SEG7
MOV P0,A
CLR P2.3
ACALL DLY
SETB P2.3
MOV A,24H
ACALL SEG7
MOV P0,A
CLR P2.4
ACALL DLY
SETB P2.4
MOV A,25H
ACALL SEG7
MOV P0,A
CLR P2.5
ACALL DLY
SETB P2.5
MOV A,26H
ACALL SEG7
MOV P0,A
CLR P2.6
ACALL DLY
SETB P2.6
MOV A,27H
ACALL SEG7
MOV P0,A
CLR P2.7
ACALL DLY
SETB P2.7
MOV A,28H
ACALL SEG7
MOV P0,A
CLR P3.0
ACALL DLY
SETB P3.0
MOV A,29H
ACALL SEG7
MOV P0,A
CLR P3.1
ACALL DLY
SETB P3.1
RET

DLY: MOV R7,#10 ;延时1MS子程序。12M晶振,粗略算法:2X R7 X R6
D1: MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET

SEG7: INC A
MOVC A,@A+PC
RET

DB 03FH;0 共阴管段码
DB 006H;1
DB 05BH;2
DB 04FH;3
DB 066H;4
DB 06DH;5
DB 07DH;6
DB 007H;7
DB 07FH;8
DB 06FH;9

数码管连接电路如图1所示,P0口输出码型,P2口输出位选。锁存器74HC573起驱动作用,提供驱动电流供数码管发光。译码器74HC138将位选地址转换成位选信号,例如当前是第5个数码管显示,那么P2口输出位选地址05H,译码器输入CBA=110,输出位选信号Y7-Y0=11101111,其中Y5=0,第5个数码管选通并显示,其它数码管不显示。实验时将J6的左边两个引脚针(1和2)用跳冒连接,锁存器11脚接VCC,关闭锁存功能。
数码管显示方式为动态扫描方式,当P0口送第一个数0的码型到锁存器时,P2送位选地址01H,即Y0=0,只有第一个数码管亮,显示0,其他数码管不显示。当P0口送u全都点亮着,这就是动态扫描。

#include <REG52.H>
#include <intrins.h>
#include "absacc.h"
void time(unsigned int ucMs); /*延时单位: ms*/
void display(void); /*显示0, 1,..,7*/
/*********************************************************/
void main (void)
{
while(1)
{
display();
}
}
void display(void) /*显示0, 1, ,7*/
{
unsigned char code LEDValue[8]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
unsigned char i;
unsigned char position=0x01;
for (i=0; i<8; i++)
{
XBYTE[0x0FFF8] = LEDValue[i]; /*显示内容*/
XBYTE[0x0FFF9] = position; /*位译码输入*/
position = position<<1;
time(1); /*状态维持*/
}
}
/*********************************************************
* 函数说明:延时5us,晶振改变时只用改变这一个函数!
1、对于11.0592M晶振而言,需要2个_nop_();
2、对于22.1184M晶振而言,需要4个_nop_();
*********************************************************/
void delay_5us(void) //延时5us,晶振改变时只用改变这一个函数!
{
_nop_();
_nop_();
}
/************ delay_50us ***************/
void delay_50us(void) //延时50us
{
unsigned char i;
for(i=0;i<4;i++)
{
delay_5us();
}
}
/******** 延时100us ******************/
void delay_100us(void) //延时100us
{
delay_50us();
delay_50us();
}
/*********** 延时单位:ms *******************/
void time(unsigned int ucMs)//延时单位:ms
{
unsigned char j;
while(ucMs>0){
for(j=0;j<10;j++) delay_100us();
ucMs--;
}
}

共阳极接法。

abcdefg 为 P0 口,位选端为 P2 口。

八个数码管同时显示 01234567。

电路与程序,如下所示:




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

单片机中,使用定时器让数码管从1一秒加一,变化到100.我写的程序在下面...
这个呀,你要看看你的中断函数,aa,temp的变化。aa应该是中断20次才加1,而,temp是在aa加一以后再加一。所以就会一秒钟走好几十个数。还有,像你这么display,数码管肯定会有阴影,因为你没有清零的过程。

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

单片机没1毫秒进进一次怎么让数码管跳动
可以使用定时器来实现1毫秒进一次数码管跳动,具体步骤如下:1、设置定时器的工作模式:将定时器的工作模式设为定时模式,并设置定时器的计数值和时钟源。2、定时器中断处理函数:编写定时器中断处理函数,在每次定时器计数到指定值时,将需要显示的数码管数据更新,并将计数器清零,从而实现数码管的跳动...

单片机一个引脚怎么控制数码管一个数字?引脚才一位,而数字需要8位控制...
使用8位串入并出的移位寄存器,比如74ls164,串入数据完毕后同时输出到7段数码管 像下面这个 用74ls164做的五环,省了很多引脚

如何让单片机按下键时数码管显示的值和点阵屏显示一致的数字_百度知 ...
1、定义数码管和点阵屏的接口。2、定义按键和数码管、点阵屏驱动的接口。3、编写按键按下的处理函数。4、编写数码管和点阵屏驱动的函数。5、在主程序中调用按键按下的处理函数和数码管、点阵屏驱动的函数。

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

如何使用单片机的数码管显示0?
1、首先,要把代码写好,点亮数码管。2、代码写完后,要确认原先写好的代码是不是正确的。3、确认代码无误后,进入下一步,就是在这一行代码(箭头所指)的地方,将这四个字删去。4、然后如图所示,四个字已经删去,只要改成数字相应的代码即可。5、这里改成的是代表数字0的代码,如图所示。6、...

单片机数码管 我写了一个程序 想要让数码管加1,蜂鸣器响一声的程序...
TR0=1;TR1=1;} void main(void){ t0intinit();while(1){disp();if(a==10)a=0;} } void disp( ){ P0=tab[a];P2=0;delay_ms(1);P2=1;} void t0int(void) interrupt 1 { \/\/uchar time;TH0=0x3c;TL0=0xb0;time++;if(time==40){ flag=1;a++;time=0;} if(time==20...

单片机:如何让数码管闪烁?
已经用动态扫描的方式让它显示了,那么后面就后简单了;动态扫描的时候是一直给两个数码管点亮的,如果需要让某一位闪烁,只需要在一段时间内不点亮这个LED即可;具体一点,动态扫描的时候是A AC B BC 表示选择A 和赋A的编码这样循环的,扫描的时候是一直这样交替的,现在改为for(){A AC B BC} ...

五家渠市18164213603: 用51单片机的数码管显示学号《20104561》的程序的怎么表示? -
屠媚松奇: 简单啊.先把0-9的显示码做个数组.再去调用数组的显示码就行了啊,也就是数码管的动态显示的原理实验了.不知道你的数码管是共阴还共阳.我有的是共阴的程序.

五家渠市18164213603: AT89C51单片机实现4位数码管显示学号后四位,谢谢 -
屠媚松奇: #include<reg52.h> #define uchar unsigned char #define uint unsigned int //共阴数码管七段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77}; uchar code table2[]={5,4,3,2};//这就是学号的后4位,自行修改 void ...

五家渠市18164213603: 急急急,单片机控制2个数码管(共阳),设置两个按键,开机数码管显示自己学号的后两位(学号24号). -
屠媚松奇: 两个共阳数码管,分别接在P0口和P2口,接成静态显示电路.两按键分别接在P3.2和P3.3两个脚上.仿真图如下,开机就显示24.

五家渠市18164213603: 用单片机c51编出程序,显示两位学号 -
屠媚松奇: 如果是静态数码管,那么可以通过锁存器来分别控制数码管显示,如果是动态的,那么只能扫描控制两位及两位以上的数码管.

五家渠市18164213603: 单片机C51编程(C语言):实现学号的显示(学号是10位数字) -
屠媚松奇: 你用什么驱动数码管呢?不同的驱动,程序写法不同.如果直接用I/O口驱动,8位数码管就这样写: wei=位选 duan=段选//断码表uchar code shuzi[12]={0xc0,0xf9,0xa4,0xb0,0x99,//0,1,2,3,4,0x92,0x82,0xf8,0x80,0x90,//5,6,7,8,9,0x00,0xff}; ...

五家渠市18164213603: 求问,在ATC89C51单片机,四位数码管,显示学号1308010123,C语言程序怎么写? -
屠媚松奇: 参考:http://hi.baidu.com/do_sermon/item/8176362f549ffd896f2cc32a

五家渠市18164213603: 求单片机数码管显示学号如(07091140)的程序及protues的图~ 共阴极.. -
屠媚松奇: #include#define uchar unsigned char#define uint unsigned int sbit DATA=P3^0;sbit CLK=P3^1;sbit EN=P1^3; uchar code seg_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay10ms(uint x);void send_hc164(uchar dat);...

五家渠市18164213603: 单片机开发板STC89C52..想要在四个数码管显示自己的学号 -
屠媚松奇: 不熟悉你所说的单片机 我告诉你理论吧 我先虚拟你所使用的数码显示位最高4位 且单片机位数是8位 AHH=10 AH=90 AL=62 ALL=31 首先注意表格制作0-9 对应的数据 不显示的数据为00H应该 那么放在 0A位上0--1 -- 2 -- 3---4---5---6---7--8---9---...

五家渠市18164213603: 用单片机89C51实现数码管的显示,要求0 - F任意按下一个键,用4个数码管显示它的二进制值,并滚动显示 -
屠媚松奇: 这个很容易,我不给你程序,给你 个建议吧,设置是十六个键,设一个变量'i'每个键按下要存储'i'值,分别为0000,0001......1111.按下k1之后判断前面所存储的值是多少然后给显示出来 显示数码应该会的吧,用动态扫描数码管,四个就可以了,k2更好办,按k2之后执行将i值清零.这个是入门,入门之后你就会喜欢编程了

五家渠市18164213603: 怎么样利用单片机用数码管输出本人学号;用1602液晶显示器显示本人姓名的拼音字母 -
屠媚松奇: 参考: http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/a0c99e2343b541844423e865.html

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