一、实验目的与要求
能在数码管上显示数字(数码管静态显示)
二、实验环境
硬件环境:实验盒;软件环境:keil
三、实验原理
当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选信号都是相同的,那么它们显示的数字必定一样,数码管的这种显示方法叫做静态显示。
静态数码管是一种电子显示器件,其显示原理是,每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可以一直保持,直到送入新的字形码为止。
静态显示方式的优点在于占用CPU时间少,显示便于监测和控制。然而,其缺点在于硬件电路相对复杂,成本较高。
在实际应用中,静态数码管常用于需要长时间显示固定信息的场合,如电子表、计时器等。同时,它也可以与其他电子元件配合使用,实现更为复杂的功能。
请注意,使用静态数码管时需要了解其具体的驱动方式和电气参数,以确保正常工作并避免损坏。同时,在安装和使用过程中,应遵循相关的安全规范,确保人身和设备的安全。
四、实验内容
实验步骤:先用数据线接上电脑和实验盒子,然后在软件中添加对应的源程序编译后的pro.hex文件,断电添加,然后运行一瞬间打开电源。
连线图:
实验程序:
#include<reg51.h>
//--定义你要使用的IO口--//
#define GPIO_DIG P0
//--声明全局函数--//
void Delay10ms(unsigned int c); //误差 0us
//--定义全局变量--//
//RAM,ROM
unsigned char code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
//0~F段码
//0:0011_1111
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
unsigned char i = 0;
while(1)
{
GPIO_DIG = ~DIG_CODE[i];
i++;
if(i == 16)
{
i = 0;
}
Delay10ms(50);
}
}
/*******************************************************************************
* 函 数 名 : Delay10ms
* 函数功能 : 延时函数,延时10ms
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
输入数据:按键输入
输出数据:数码管显示对应的数字
实验结果:
五、实验分析
本次实验通过两条八孔线链接前来,使得数码管可以显示按键对应按的数字。
六、思考题
1.利用定时器中断实现实时时钟,显示“时:分:秒”。
实验程序:
#include <reg51.h>
#include <stdio.h>
unsigned char n=20;
unsigned int num=0;
unsigned int hour=0;
unsigned int minute=0;
void main()
{
//-----------------------------------------
//定义虚拟标准输入/输出设备(利用串口)
SCON=0x50; //mode 1, 8-bit
TMOD=0x20; //timer 1, mode 2, 8-bit reload
TH1=221;
TR1=1; //timer 1 run
TI=1;
//-----------------------------------------
TMOD=1;
TH0=0x3c;
TL0=0xb0;
ET0=1;
EA=1;
TR0=1;
while(1);
}
void intt0() interrupt 1
{n--;
if(n==0) {n=20;
if(num<=59&&minute<=59){
printf("Timer is %u:%u:%u \n",hour,minute,num++);}
else if(num>59&&minute<=59){
num=0;
minute++;
printf("Timer is %u:%u:%u \n",hour,minute,num++);}
else if(num>59&&minute>59){
hour++;
minute=0;
num=0;
printf("Timer is %u:%u:%u \n",hour,minute++,num++);}
}
TH0=0x3c;
TL0=0xb0;
TR0=1;
}
运行结果:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。