数码管实验报告
篇一:实验八 数码管led 实验报告
苏州大学实验报告
院、系 年级专业 姓名 学号课程名称 成绩指导教师同组实验者实验日期
实验名称: 数码管led 实验
一.实验目的
理解8段数码管的基本原理,理解8段数码管的显示和编程方法,理解4连排共阴极8段数码管lg5641ah 与mcu 的接线图。 二.实验内容
理解8段数码管原理,运行与理解各子程序,编制一个4连排8段数码管程序,mcu 的排8段数码管显示mcu 复位后的开始到现在的运行时间。由于只有四个数码管,所以只显示mcu 运行到目前为止的分钟和秒,当计时达到一个小时,就重新从00:00开始计时。另外,也可以通过pc 方的串口通信程序,指定计时的开始值。三.实验过程 (一)原理图
图8-2数码管外形
dp
a b c
e f g dp
图8-1 数码管(二)接线图
图8-3 mcu与4连排8段数码管的连接第1页
(三)基本原理
8段数码管一般由8个发光二极管(llight-emitting diode,led )组成,每一个位段就是一个发光二极管。一个8段数码管分别由a 、b 、c 、d 、e 、f 、g 位段,外加上一个小数点的位段h (或记为dp )组成。根据公共端所接电平的高低,可分为共阳极和共阴极两种。有时数码管不需要小数点,只有7个位段,称7段数码管。共阴极8段数码管的信号端高电平有效,只要在各个位段上加上相应的信号即可使相应的位段发光,比如:要使a 段发光,则在发光。
四.编程
(一)流程图
图8-4 数码管led 显示流程图(及其中断子程序)
(二)所用寄存器名称及其各个位
程序中没有使用与led 显示相关的控制和状态寄存器,仅仅使用了通用i/o口a 口和b 口。
(三)主要代码段
1第2页第3页
2.c
第4页
第5页
篇二:数码管实验报告
单片机实验报告
一、实验名称
数码管动态扫描显示01234567(实验五)
二、实验目的
(1)掌握数码管显示数字的原理。
(2)通过不同的编程实现灵活运用数码管。
三、实验原理
四、相关原理图
五、实验内容
数码管显示12345678
c 程序:
#include <reg51.h>
#include <intrins.h>
unsigned char data dis_digit;
unsigned char code dis_code[11]={ 0x28, 0x7e, 0xa2, 0x62, 0x74, 0x61, 0x21, 0x7a, 0x20, 0x60,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表
unsigned char data dis_buf[8];// 显示缓冲区
unsigned char data dis_index;
char code sst516[3] _at_ 0x003b;
void main()
{
p0 = 0xff;
p2 = 0xff;
tmod = 0x01;
th0 = 0xfc;
tl0 = 0x17;
ie = 0x82;
dis_buf[0] = dis_code[0x1];
dis_buf[1] = dis_code[0x2];
dis_buf[2] = dis_code[0x3];
dis_buf[3] = dis_code[0x4];
dis_buf[4] = dis_code[0x5];
dis_buf[5] = dis_code[0x6];
dis_buf[6] = dis_code[0x7];
dis_buf[7] = dis_code[0x8];
dis_digit = 0xfe;
dis_index = 0;
tr0 = 1;
while(1);}
void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到p2口用于选通当前数码管的数值, 如等于0xfe 时, // 选通p2.0口数码管
// dis_buf--- 显于缓冲区基地址
{
th0 = 0xfc;
tl0 = 0x17;
p2 = 0xff;// 先关闭所有数码管
p0 = dis_buf[dis_index]; // 显示代码传送到p0口
p2 = dis_digit;//
dis_digit = _crol_(dis_digit,1);// 位选通值左移, 下次中断时选通下一位数码管 dis_index++;//
dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描 }汇编程序:
code_seg segment code
data_seg segment data
rseg data_seg
dis_digit: ds 1
dis_index: ds 1
dis_buf: ds 8
stack: ds 20
;===========================================================
cseg at 00000h ; reset向量
ljmp main
cseg at 0000bh ; 定时器0中断向量
ljmp timer0
;===========================================================
rseg code_seg
org0080h
main:
mov sp,#(stack-1); 初始化堆栈指针
movp0,#0ffh; 初始化i/o口
movp2,#0ffh
movtmod,#01h; 初始化timer0
movth0,#0fch
movtl0,#017h
movie,#082h
mov dptr, #dis_code; 设定显示初值
mov a,#1
movc a,@a+dptr
movdis_buf,a
mov a,#2
movc a,@a+dptr
movdis_buf+01h,a
mov a,#3
movc a,@a+dptr
movdis_buf+02h,a
mov a,#4
movc a,@a+dptr
movdis_buf+03h,amov a,#5
movc a,@a+dptr
movdis_buf+04h,a
mov a,#6
movc a,@a+dptr
movdis_buf+05h,a
mov a,#7
movc a,@a+dptr
movdis_buf+06h,a
mov a,#8
movc a,@a+dptr
movdis_buf+07h,a
movdis_digit,#0feh; 初始从第一个数码管开始扫描
movdis_index,a
setb tr0 ; 启动定时器0,开始动态扫描显示
main_lp:
; 主程序循环,增加其它代码
sjmp main_lp
;===========================================================
using 0
timer0:
; 定时器0中断服程序, 用于数码管的动态扫描
; dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
; dis_digit --- 位选通值, 传送到p2口用于选通当前数码管的数值, 如等于0xfe 时, ; 选通p2.0口数码管
; dis_buf--- 显于缓冲区基地址
push acc
push psw
push ar0
movth0,#0fch
movtl0,#017h
movp2,#0ffh ; 先关闭所有数码管
mova,#dis_buf ; 获得显示缓冲区基地址
adda,dis_index ; 获得偏移量
movr0,a; r0 = 基地址 + 偏移量
mova,@r0; 获得显示代码
movp0,a; 显示代码传送到p0口
movp2,dis_digit ;
mov a,dis_digit ; 位选通值左移, 下次中断时选通下一位数码管
rl a篇三:数码管动态显示实验报告
实验四 数码管动态显示实验一
一、实验要求
1. 在proteus 软件中画好51单片机最小核心电路,包括复位电路和晶振电路
2. 在电路中增加四个7段数码管(共阳/共阴自选), 将p1口作数据输出口与7段数码管数据引脚相连 ,p2.0~p2.3引脚输出选控制信号
3. 在keil 软件中编写程序, 采用动态显示法, 实现数码管分别显示数字1,2,3,4
二、实验目的
1.
2.
3.
4. 巩固proteus 软件和keil 软件的使用方法 学习端口输入输出的高级应用 掌握7段数码
管的连接方式和动态显示法 掌握查表程序和延时等子程序的设计
三.实验说明
本实验是将单片机的p1口做为输出口,将四个数码管的七段引脚分别接到p1.0至p1.7。由于电路中采用共阳极的数码管,所以当p1端口相应的引脚为0时,对应的数码管段点亮。程序中预设了数字0-9的段码。由于是让四个数码管显示不同的数值,所以要用扫描的方式来实现。因此定义了scan 函数,接到单片机的p2.0至p2.3
在实验中,预设的数字段码表存放在数组tab 中,由于段码表是固定的,因此存储类型可设为code 。
在proteus 软件中按照要求画出电路,再利用keil 软件按需要实现的功能编写c 程序,生成hex 文件,把hex 文件导到proteus 软件中进行仿真。为了能够更好的验证实验要求,在编写程序时需要延时0.5s ,能让人眼更好的分辨;89c51的一个机器周期包含12个时钟脉冲,而我们采用的是12mhz 晶振,每一个时钟脉冲的时间是1/12us,所以一个机器周期为1us 。在keil 程序中,子函数的实现是用void delay_ms(int x),其中x 为1时是代表1ms 。
四、硬件原理图及程序设计
(一)硬件原理图设计
电路中p1.0到p1.7为数码管七段端口的控制口,排阻rp1阻值为220ω,p2.0到p2.3为数码管的扫描信号。at89c51单片机的9脚(rst )为复位引脚,当rst 为高电平的时间达到2个机器周期时系统就会被复位;31引脚(ea )为存取外部存储器使能引脚,当ea 为高电平是使用单片机内部存储器,当ea 为低电平时单片机则使用外部存储器。18、19引脚是接晶振脚。而接地和电源端在软件中已经接好,所以不用在引线。 如下图所示:(二)流程图与程序设计(三)程序设源代码
#include <reg51.h> //定义8051寄存器头文件 #define seg7p p1 //定义扫描信号的位置 #define scanp p2 //定义数码管的位置
char code tab[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, //数字0~4的码值
0x92, 0x83, 0xf8, 0x80, 0x98 }; //数字5~9的码值
char disp[4]={1,2,3,4};//定义要显示的数值
void delay_ms(int x); //声明延时函数
char scan[4]={0xfe,0xfd,0xfb,0xf7}; //定义扫描
char i,j; //定义变量i ,j
main() //主函数的开始
{
while(1) //无限循环
{for(i=0;i<4;i++) //从
{j=disp[3-i]; //取出显示的数值
scanp =scan[i]; //扫描的顺序
seg7p =tab[j]; //将tab 的数值赋给数码管delay_ms(4);//延时4ms
}
}
}
void delay_ms(int x)
{ int i,j;
for (i=0;i<x;i++)
for (j=0;j<120;j++);
}
五.实验总结
问题一:运行电路时,数码管乱码
解决的方法:检查电路,发现程序中扫描信号端口错误,将扫描信号的端口顺序调换,重新运行。
问题二:重新运行后,数码管只显示其中的一部分。
解决的方法:检查程序,发现是延时时间的问题,在改动延时时间后,重新编译后在次运行电路,电路正常显示,符合要求。
通过本次的实验,在前两个实验的基础上让我复习了知识点,也让我在次掌握了新的知识。在完成这次实验后,让我想到可以用多个按键控制多个数码管实现加减和暂停和开始。我觉得这次的课程实验让我知道,一次次的失败,并不会让我放弃去追求,相反它会引领着我去发现问题,从而解决问题,完成更深入的探索。也让我明白理论知识的重要性,并且与实际相结合,多动手,在实践中成长。所以我会很重视每一次的实验。我坚信:每次实验都会给我自身很大帮助。慢慢的积累点滴的知识,到最后就会多的。