51单片机数码管0到F动态显示
- 格式:doc
- 大小:20.00 KB
- 文档页数:5
51单片机动态数码管实验报告一、背景动态数码管是一种常见的显示装置,它由多个LED组成,可以显示数字、字母和符号等信息。
在嵌入式系统中,动态数码管常用于显示各种信息,如温度、湿度、时间等。
本次实验旨在通过学习51单片机动态数码管的使用方法,了解动态数码管的工作原理和使用技巧。
二、分析动态数码管由多个共阴极或共阳极LED组成,每个LED都可用于显示一个数字或字符。
动态数码管的显示是通过快速切换数码管的管脚电平实现的,每个数码管显示部分的亮度和显示时间取决于刷新速度。
本次实验涉及到四位数码管,所以需要控制四个共阳极或共阴极数码管,通过快速切换显示四个数码管的方式实现动态显示效果。
实验所需要的材料有:51单片机开发板、数码管模块、面包板、杜邦线等。
以下是步骤:1.将数码管模块的共阳极或共阴极连接到51单片机开发板的IO口。
根据数码管模块的引脚连接方式,选择合适的IO口。
2.在51单片机开发板上搭建实验电路。
首先将开发板的VCC引脚连接到面包板的正电源线上,GND引脚连接到面包板的地线上。
然后将数码管模块的VCC引脚连接到面包板的正电源线上,GND引脚连接到面包板的地线上。
最后将数码管模块的信号引脚连接到51单片机开发板选择的IO口上。
3.编写程序。
使用C语言编写代码,通过控制IO口的电平和延时实现数码管的动态显示功能。
根据所需显示的数字和字符,选择合适的代码逻辑。
4.将编写好的程序下载到51单片机开发板上。
使用USB转串口工具将开发板与电脑连接,使用相应的下载软件将程序下载到开发板。
5.执行程序。
将开发板上的动态数码管模块打开,观察数码管的显示效果。
根据实际需求,调整程序中的显示内容和显示速度。
三、结果经过以上步骤,可以成功实现51单片机动态数码管的显示功能。
根据编写的程序和韦氏编码表,可以显示各种数字、字母和符号等信息。
通过调整程序中的显示内容和显示速度,可以实现不同的显示效果。
四、建议在进行实验过程中,需要注意以下几点:1.确保电路连接正确。
动态显示1.掌握LED数码管显示及其一般电路结构;2.掌握LED动态显示程序的一般设计方法。
一、实验内容动态显示,也称为扫描显示。
显示器由6个共阴极LED数码管构成。
单片机的P0口输出显示段码,由一片74LS245输出给LED管;由P1口输出位码,经74LS04输出给LED显示。
二、实验步骤1、打开Proteus ISIS编辑环境,按下表所列的元件清单添加元件。
图1 动态显示实验电路原理图2、按实验要求在KeilC中创建项目,编辑、编译程序。
3、将编译生成的目标码文件(后缀为.Hex)传入Proteus的实验电路中。
4、在Proteus ISIS仿真环境中运行程序,观察实验运行结果并记录。
三、实验要求1.编写一显示程序显示201071;2.显示特殊字符good;3.调整软件延时子程序的循环初值,逐渐加大每一位LED点亮的时间,观察程序运行结果。
四、参考程序dbuf equ 30h ;置存储区首址temp equ 40h ;置缓冲区首址org 00hmov 30h,#2 ;存入数据mov 31h,#0mov 32h,#1mov 33h,#0mov 34h,#7mov 35h,#1mov r0,#dbufmov r1,#tempmov r2,#6 ;六位显示器mov dptr,#segtab ;段码表首地址dp00: mov a,@r0 ;取要显示的数据movc a,@a+dptr ;查表取段码mov @r1,a ;段码暂存inc r1inc r0djnz r2,dp00disp0: mov r0,#temp ;显示子程序mov r1,#6 ;扫描6次mov r2,#01h ;从第一位开始dp01: mov a,@r0mov p0,a ;段码输出mov a,r2 ;取位码mov p1,a ;位码输出acall delay ;调用延时mov a,r2rl amov r2,ainc r0djnz r1,dp01sjmp disp0segtab: db 3fh,06h,5bh,4fh,66hdb 6dh,7dh,07h,7fh,6fhdelay: mov r4,#03h ;延时子程序aa1: mov r5,0ffhaa: djnz r5,aadjnz r4,aa1retend实验原理MCS-51单片机内设置了两个可编程的16位定时器T0和T1,通过编程,可以设定为定时器和外部计数方式。
实验名称一位数码管显示变化数字一、实验目的1.通过AT89C52单片机控制数码管显示数字0到9。
2.用Protues设计、仿真以AT89C52为核心的数码管变化数字显示电路。
3.理解led七位数码管的显示控制原理。
二、实验任务让一位数码管能够从0不断显示到9。
三、实验设备微机1台、Proteus软件1套、GL10型51单片机学习开发板1台。
四、实验电路绘制五、汇编语言程序设计1.设计原理该led数码管为8段显示,每一段对应一个发光二极管,根据查询发现GL10给力者单片机是共阴数码管,当某个发光二极管的阳极为高电平时,发光二极管点亮相应的段被显示。
2.程序框图3.汇编程序$NOMOD51$INCLUDE (8051.MCU)ORG 0000HAJMP MAINORG 0030HMAIN:MOV R4, #00H ;记录码表的值MOV DPTR, #TABLE ;把地址送DPTRSTRAT:MOV A, R4MOVC A, @A+DPTR ;取码MOV P2, A ;显示INC R4 ;自增,取下个值做准备CALL DELAY ;调用CJNE R4, #16, STRAT ;判断是否显示完16个数值AJMP MAINDELAY: MOV R6, #1DELAY4:MOV R1, #10DELAY3:MOV R2, #100DEALY1:MOV R3, #250DEALY2:NOPNOPDJNZ R3,DEALY2DJNZ R2, DEALY1DJNZ R1, DELAY3DJNZ R6, DELAY4RET;码表TABLE:DB<span style="white-space:pre"></span>0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6FEND六、Proteus软件模拟仿真七、GL10单片机仿真系统1.实验板连线2.实验操作步骤先用杜邦线连接一位数码管模块和89c51芯片的p2口,然后用usb连接线将整个单片机与电脑相连,打开烧录软件,选中数码管动态显示变化数字的hex 文件,点击下载,按下单片机的电源开关,程序将烧录到单片机中,数码管就会从0显示到9,并循环。
33第2卷 第22期产业科技创新 2020,2(22):33~34Industrial Technology Innovation 基于51单片机实现LED数码管静态与动态显示的设计浅析龙 志(广州大学松田学院,广州 增城 511370)摘要:随着社会的发展,在我们日常的生活中,数码管的应用随处可见,尤其是在电子应用设计显示等方面常常发挥着非常重要的作用,因此研究数码管的显示有非常重要的现实意义。
数码管我们可以分为静态显示和动态显示,这两种显示有着本质的区别,静态显示的特点是占用CPU 时间少,显示便于监测和控制,显示字形稳定,而动态数码管的显示,效果相对静态显示亮度差少许,但成本较低。
本设计主要是基于51单片机,先通过结合集成芯片74HC573对LED 数码管静态显示的硬件电路设计与分析,进一步拓展到采用芯片74HC138与LED 数码管动态显示的硬件电路设计与分析,最终实现两种不同的电路设计显示的方法。
关键词:LED 数码管;静态显示;动态显示;51单片机中图分类号:TP368.12 文献标识码:A 文章编号:2096-6164(2020)22-0033-02随着电子应用技术的不断发展,显示电路在电子设计应用方面更加广泛,尤其是LED 数码管显示在各行各业中的应用更加重要,如红绿交通灯显示,电子时钟显示,家电产品功能显示等方面都需要用到LED 数码管作为显示。
因此,对LED 数码管的显示控制有着非常重要的现实意义。
因此我们要实现LED 数码管的熟练显示控制,我们必须要根据数码管的特点来进行分析和设计,数码管有静态显示和动态显示的两种方法,接下对这两种电路作详细的分析与设计,最终实现对LED 数码管静态与动态的两种不同显示设计方法。
1 数码管静态显示电路设计数码管静态显示设计是利用MCS-51单片机结合两片集成芯片74HC573,实现对4个LED 数码管的显示控制。
具体设计如图1所示:图1 数码管静态显示设计电路图本电路设计主要是利用单片机的P0口来实现对数码管的位选控制与段选的控制,P0口之所以能够正确的对数码管进行位选与段选的控制,关键是在于设计中使用了芯片74HC573。
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
51单片机数码管显示及矩阵键盘扫描程序硬件实验十一八段数码管实验一、实验任务1、在静态数码管上轮流显示数字0-9。
2、在两个4位数码管上动态显示数字0-9二、流程图及程序静态显示:流程图:程序代码:#include#define uchar unsigned chucharcodevalue[10]={0xC0,0xF9,0xA4,0xB0,0X99,0x92,0x82,0xF8,0 x80,0x90};//0 -9数码管显示段码void delay(char x) //延时子程序{uchar i;for(i=0;i<200;i++);}main() //主函数{int i;while(1){for(i=0;i<10;i++) //显示0-9{P0=codevalue[i];delay(500); //延时1秒}}}动态显示:#include#includetab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,0x7f,0x6f}; //数码管显示数字字段unsigned char tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//片选字段unsigned char i,k,j,x;void delay(x); //声明延时子函数void main() //主函数{while(1){for(i=0;i<8;i++) //显示0-7{ P1=tab1[i];P0=tab2[i];delay(5); //延时}P1=tab1[8]; P0=tab2[0]; delay(5); //显示8-9P1=tab1[9]; P0=tab2[1]; delay(5);}}void delay(x) //延时函数定义{do{for(j=0;j<250;j++)for(k=0;k<250;k++);}}硬件实验十二矩阵键盘扫描显示一、实验任务1、把矩阵键盘上的按键输入的键码在静态数码管上显示出来。
51单片机电机控制输入速度七段数码管
显示汇编程序
简介
本文档介绍了使用51单片机控制电机的方法,以及如何通过输入设置速度,并使用七段数码管显示相关信息的汇编程序。
电机控制
在使用51单片机控制电机之前,需要连接合适的电机驱动模块,并将其与单片机进行连接。
通过控制电机驱动模块的引脚,可以实现电机的正转、反转、停止等功能。
输入速度
可以通过外部的输入设备(如按键、旋钮等)来设置电机的速度。
通过读取输入设备的状态,可以在程序中动态地调整电机的速度。
七段数码管显示
可以通过七段数码管来显示相关信息,如电机的速度、转速等。
通过控制七段数码管的引脚,可以实现在数码管上显示相应的数字
或字符。
汇编程序
使用51汇编语言编写程序,通过设置相应的控制寄存器和引
脚状态,可以实现电机的控制和数码管的显示。
汇编程序需要包括
以下几个方面的功能:
- 初始化相关引脚和寄存器
- 读取输入设备的状态
- 根据输入设备的状态设置电机的速度
- 控制电机的正转、反转、停止等操作
- 更新七段数码管显示的内容
总结
本文档介绍了51单片机控制电机的方法,以及通过输入设备
设置速度和使用七段数码管显示信息的汇编程序。
通过合理地编写
汇编程序,可以实现电机的精确控制和相关信息的显示。
以上是本文档的大致内容,希望对您有所帮助。
51单片机数码管动态显示分析51单片机数码管动态显示是一种常见的数字显示方式,其主要通过控制不同位数的数码管,使其依次显示数字,从而实现数字动态显示的效果。
以下将从原理和实现两个方面对51单片机数码管动态显示进行分析。
一、原理分析51单片机数码管动态显示的原理主要分为两部分,分别为定时器控制和位选控制。
定时器控制:在51单片机中使用定时器是为了保证数字动态显示的稳定性。
通过定时器中断的方式来控制数码管的显示时间,使得每个数字都有足够的时间显示,并且切换速度平稳。
位选控制:在数码管动态显示过程中,需要依次控制不同位数的数码管显示数字。
这是通过位选控制器实现的,它会依次选中各位数码管,并显示出要显示的数字。
这个过程会不停地重复,从而实现数字的动态显示。
二、实现分析51单片机数码管动态显示的实现需要以下几个步骤:1. 确定使用的数码管数量及其接口:需要确定使用几个数码管以及它们的引脚分别对应的单片机IO口。
2. 编写显示函数:编写一个函数来控制数码管的动态显示,其中需要实现定时器中断以及位选控制的功能。
3. 循环调用显示函数:将编写好的显示函数放到主函数中进行调用,并不断地循环执行,从而实现数字的动态显示。
需要注意的是,在编写显示函数的过程中,需要确定定时器中断的时间间隔、位选控制的顺序以及每个数码管对应的IO口。
这些因素会直接影响到数字的显示效果,因此需要仔细调试以达到最佳的显示效果。
在实现过程中,还需要考虑到如何读取用户输入并将其显示在数码管上。
一种常见的方式是通过外部按键来读取用户输入,然后通过数码管动态显示的方式,将输入的数字依次显示出来。
总之,51单片机数码管动态显示是一种常见的数字显示方式,其实现原理和步骤相对比较简单。
需要注意的是,在实际应用中还需要结合实际需求进行相应的调整,以达到最佳的显示效果。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit du=P2^6;sbit we=P2^7;uchar num;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delays(uint);void main(){we=1;//打开U2锁存器P0=0xc0;//送入位选信号we=0;while(1){du=1;P0=table[0];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xfe;we=0;delays(500);du=1;P0=table[1];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xfd;we=0;delays(500);du=1;P0=table[2];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xfb;we=0;delays(500);du=1;P0=table[3];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xf7;we=0;delays(500);du=1;P0=table[4];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xef;we=0;delays(500);du=1;P0=table[5];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xdf;we=0;delays(500);du=1;P0=table[6];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xfe;we=0;delays(500);du=1;P0=table[7];P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xfd;we=0;delays(500);du=1;P0=table[8];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xfb;we=0;delays(500);du=1;P0=table[9];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xf7;we=0;delays(500);du=1;P0=table[10];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xef;we=0;delays(500);du=1;P0=table[11];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;we=0;delays(500);du=1;P0=table[12];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xfe;we=0;delays(500);du=1;P0=table[13];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xfd;we=0;delays(500);du=1;P0=table[14];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xfb;we=0;delays(500);du=1;P0=table[15];du=0;P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱we=1;P0=0xf7;we=0;delays(500);}}void delays(uint xs){uint i,j;for(i=xs;i>0;i--)for(j=110;j>0;j--);//延时x秒}。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit du=P2^6;
sbit we=P2^7;
uchar num;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delays(uint);
void main()
{
we=1;//打开U2锁存器
P0=0xc0;//送入位选信号
we=0;
while(1)
{
du=1;
P0=table[0];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xfe;
we=0;
delays(500);
du=1;
P0=table[1];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xfd;
we=0;
delays(500);
du=1;
P0=table[2];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xfb;
we=0;
delays(500);
du=1;
P0=table[3];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xf7;
we=0;
delays(500);
du=1;
P0=table[4];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xef;
we=0;
delays(500);
du=1;
P0=table[5];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xdf;
we=0;
delays(500);
du=1;
P0=table[6];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xfe;
we=0;
delays(500);
du=1;
P0=table[7];
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xfd;
we=0;
delays(500);
du=1;
P0=table[8];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xfb;
we=0;
delays(500);
du=1;
P0=table[9];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xf7;
we=0;
delays(500);
du=1;
P0=table[10];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xef;
we=0;
delays(500);
du=1;
P0=table[11];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
we=0;
delays(500);
du=1;
P0=table[12];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xfe;
we=0;
delays(500);
du=1;
P0=table[13];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xfd;
we=0;
delays(500);
du=1;
P0=table[14];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xfb;
we=0;
delays(500);
du=1;
P0=table[15];
du=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱
we=1;
P0=0xf7;
we=0;
delays(500);
}
}
void delays(uint xs)
{
uint i,j;
for(i=xs;i>0;i--)
for(j=110;j>0;j--);//延时x秒}。