数码管显示时间
- 格式:docx
- 大小:15.97 KB
- 文档页数:10
计算机科学与工程系实验报告实验题目:制作一个LED数码管显示的秒表班级:姓名:学号:日期:一、实验目的掌握单片机使用定时计数器控制LED数码管的设计与软件编程二、实验要求1、用2位数码管显示计时时间,最小计时单位为“百毫秒”,计时范围0.1~9.9s;2、当第1次按下并松开计时功能键时,秒表开始计时并显示时间;3、第2次按下并松开计时功能键时,停止计时,计算两次按下计时功能键的时间,并在数码管上显示;4、第3次按下计时功能键,秒表清0,再按1次计时功能键,重新开始计时。
5、如果计时到9.9s时,将停止计时,按下计时功能键,秒表清零,再按下重新开始计时。
三、实验要求提交的实验报告中应包括:电路原理图、实验设计思路、C51源程序(含注释语句)、运行效果(含运行截图与说明)、实验小结三、硬件电路原理图的设计四、编程思路及C51源程序编程思路:使用外中断服务处理程序处理按键,内部设计一个计数器,记录按键按下的次数,根据按键次数完成相应的功能。
用数码管显示计时时间,根据按键的次数以及其功能来显示数字。
#include<reg51.h> //包含8051单片机寄存器定义的头文件unsigned char code discode1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef} unsigned char code discode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char timer=0; //记录中断次数unsigned char second; //存储秒数unsigned char key=0; //记录按键次数main() //主函数{TMOD=0x01; //定时器T0方式1定时ET0=1; // 允许定时器T0中断EA=1; // 总中断允许second=0; //设初始值P0=discode1[second/10]; //显示秒位P2=discode2[second%10]; //显示0.1S位while(1) //循环{if((P3&0x80)==0x00) //当按键被按下时{key++; //按键次数加一switch(key) //根据按键次数分三种情况{case 1: //第一次按下为启动秒表表示TH0=0xee; //TL0=0x00; //TR0=1; //break; //case 2: //按下两次暂停秒表TR0=0; //break; //case 3: //按下三次秒表清零key=0; //second=0; //P0=discode1[second/10]; //P2=discode2[second%10]; //break;}while((P3&0x80)==0x00); //如果按键时间过长在此循环}}}}void int_t0() interrupt 1 using 0 //定时器T0中断子程序{TR0=0; //停止计时,执行以下操作(计时出现误差)TH0=0xee; //向TH0写入初值的高8位TL0=0x00; //向TL0写入初值的低8位,定时5mstimer++; //记录中断次数if (timer==20) //中断20次,20*5ms=100ms=0.1s{timer=0; //中断次数清0second++; //加0.1sP0=discode1[second/10]; //根据计时时间,即时显示秒位P2=discode2[second%10]; //根据计时时间,即时显示0.1s位}if(second==99) //当计时到9.9s时{TR0=0; //停止计时second=0; //秒数清0key=2; //按键数置2,当再次按下按键时,key++,即key=3,秒表清0复原}else //计时不到9.9s时{TR0=1; //继续计时}}五、仿真运行效果展示1、第一次按键,秒表开始计时,并计时到9.92、2次按键,停止计时,将计时的时间值送到数码管显示3、第3次按下计时功能键,秒表清零六、实验小结在实验的过程中,出现过几次错误,自己对理论知识了解的还不够透彻,所幸,通过自己思考解决了。
Arduino驱动MAX7219四位数码管显示时间Arduino驱动MAX7219四位数码管显示时间默认使用Pin 2为MOSI(数据发送)引脚,Pin 3为CS(片选)引脚,Pin 4为SCLK(时钟)引脚,如有需要请修改代码前三行的define。
#define MO 2#define CS 3#define CLK 4static int time_h = 21, time_m =25, time_s = 30; //此刻时间:时,分,秒int alarm_clock_h = 8, alarm_clock_m = 00; //闹钟时间unsigned long time = 0;unsigned char buffer_led[5] = { 0x00,};//缓存void SPI_init(void) //初始化SPI引脚{pinMode(CLK, OUTPUT);pinMode(MO, OUTPUT);pinMode(CS, OUTPUT);digitalWrite(CS, HIGH);digitalWrite(CLK, LOW);digitalWrite(MO, HIGH);}void SPI_send(unsigned char reg, unsigned char data) //spi 单向16位数据发送{int x;/*Serial.print("reg = ");Serial.print(reg, HEX);Serial.print(" data = ");Serial.println(data, HEX);*/digitalWrite(CS, LOW);for (x = 0; x < 8; x++){digitalWrite(MO, 0x80 & (reg << x)); //高位在前digitalWrite(CLK, HIGH);digitalWrite(CLK, LOW);}for (x = 0; x < 8; x++){digitalWrite(MO, 0x80 & (data << x)); //高位在前digitalWrite(CLK, HIGH);digitalWrite(CLK, LOW);}digitalWrite(CS, HIGH);}void lcd_init(void)//初始化Max7219配置{SPI_send(0x0b, 0x07); //scan-limitSPI_send(0x09, 0xff); //decode mode allSPI_send(0x0c, 0x01); //shutdown offSPI_send(0x0f, 0x00); //off display testSPI_send(0x0a, 0x04); //intensitydelay(100);}void clear(void)//清除显示{for (int i = 1; i <= 8; i++){SPI_send(i, 0x0F);}}void led_display(void)//显示时间{char cache = 0x00;if ((time_h / 10) == 0)buffer_led[0] = 0x00;else buffer_led[0] = time_h / 10;buffer_led[1] = time_h % 10 | 0x01;buffer_led[2] = time_m / 10;buffer_led[3] = time_m % 10;SPI_send(8, buffer_led[0]);SPI_send(7, buffer_led[1]);SPI_send(6, 0x0a);SPI_send(5, buffer_led[2]);SPI_send(4, buffer_led[3]);SPI_send(3, 0x0a);SPI_send(2, time_s / 10);SPI_send(1, time_s % 10);}void get_time()//获取时间并更新显示{static char ss = 1;static unsigned long time_cc = 0;if ((millis() - time_cc) > 1000 | millis() < 150)//秒{if (millis() <= 200) //若系统计时器溢出时时间,time_cc重计{time_cc = millis();time_s ++;delay(150);}else if (millis() > 200)//秒{time_s += (millis() - time_cc) / 1000;// time_cc = millis()-990; //时间快进time_cc = millis();buffer_led[4] = (0x01 & ss) << 5;ss = ~ss;}if (time_s > 59) //分{if (time_s - 60 > 1)//如果有延时间隔导致秒钟大于60秒,进行分钟缺失补偿 {time_m += time_s / 60;if (time_s % 60 == 0)time_m--;time_s = time_s - (time_s / 60) * 60;}else time_s = 0;time_m++;buffer_led[4] = 0x80;if (time_m > 59)//时{time_h++;time_m = (time_m - 60);buffer_led[4] = 0xf0;}if (time_h > 23){time_h = 0;time_s += 5; //时间误差补偿}}// Serial.print("millis="); // Serial.print(time_cc);// Serial.print(" time="); // Serial.print(time_h);// Serial.print(":");// Serial.print(time_m);// Serial.print(":");// Serial.println(time_s); led_display();//刷新数码管显示}}void setup(){Serial.begin(9600);SPI_init();lcd_init();clear();}void loop(){get_time();}。
时钟教学重点:多种时钟类型的介绍和应用。
一、不同种类的时钟1.1 指针时钟指针时钟是我们日常生活中最常见的时钟类型,它通常由时针、分针和秒针构成,用于显示时间。
指针时钟通常有两种形式:12小时制和24小时制。
12小时制指针时钟用于表示上午和下午,分别用 am 和 pm 表示,而24小时制指针时钟则显示24小时的全天时间。
1.2 数码时钟数码时钟是一种数字显示式的时钟,采用LED数码管来显示时间。
数码时钟的优点是精度高,易于读取。
数码时钟通常采用24小时制,但也有些数码时钟采用12小时制。
1.3 壁挂时钟壁挂时钟是一种特殊的时钟,主用于在墙上挂装来显示时间。
这种时钟通常设计精美,可以作为家居装饰之一。
壁挂时钟的形式也各异,可以是指针时钟,也可以是数码时钟。
1.4 双钟时钟双钟时钟是一种特殊的时钟,常用于学校和办公场所。
它具有两个时钟机芯和两组独立的指针系统,用于显示两个不同的时区时间。
例如,在一个学校中,学生和老师可能来自不同的城市或国家,双钟时钟可以用于显示两个时区的时间。
二、时钟的应用2.1 时间概念教学时钟在小学的数学教学中占有重要的地位。
通过时钟的展示,可以让学生了解时间的概念和意义。
学生可以逐步学会使用指针和数字时钟来读取时间,并将时间和日常生活相联系,体会时间的价值和意义。
时钟还可以用于学生的计时和几何学习中。
2.2 其他学科的教学除了数学教学,时钟也可以应用于其他学科的教学中。
在科学课上,时钟可以用于学习地球自转和公转;在语言课上,时钟可以用于学习一般现在时和一般过去时;在历史课上,时钟可以用于学习时间的演变和历史事件的发生时间。
2.3 日常生活中的应用时钟在日常生活中也有很多应用。
我们可以用时钟来安排日程和时间表,提醒自己按时完成工作和学习任务。
时钟还可以用于控制家庭设备的开关,例如吊扇、烤箱、洗衣机等等。
时钟在教学和生活中都有着广泛的应用。
不同种类的时钟可以满足不同的需求,而时钟的应用也不仅限于数学教学。
数码管动态显示原理
数码管的动态显示原理是通过快速地切换数字的显示段来实现连续的数字显示。
数码管通常由7个显示段构成,分别代表数字0-9的不同显示形式。
这些段也被称为a、b、c、d、e、f和
g段。
在动态显示过程中,每个数字被逐个切换显示的时间非常短,通常为几毫秒。
这个时间非常短,以至于人眼无法察觉数字的切换。
因此,当多个数码管以高速切换显示数字时,人眼会感觉到所有数码管上的数字同时显示。
要实现动态显示,需要使用一个计数器来控制切换显示的时间。
这个计数器通常是一个定时器,它会以一定的频率触发中断,每次中断时触发一次显示切换。
通过不断增加计数值,可以控制不同数字的显示时间。
为了显示一个多位数,需要使用多个数码管并连接到控制器上。
控制器会根据待显示的数字,将适当的段信号发送到对应的数码管上。
通过在不同的数码管上切换显示,就可以实现多位数的动态显示。
动态显示的基本原理如下:
1. 设置初始的数码管选择位,使其对应第一个数码管。
2. 将第一个数码管对应的段信号置为显示的数字。
3. 延时一段时间,使人眼无法察觉到数字的切换。
4. 将第一个数码管的段信号置为低电平(或不显示的状态)。
5. 设置下一个数码管的选择位,使其对应下一个数码管。
6. 重复2-5步骤,直至所有数码管都完成一轮显示。
7. 返回第一步,重复整个过程,以实现连续的动态显示。
通过以上步骤的循环,不断切换显示的数字会给人一种连续而平滑的显示效果。
这就是数码管动态显示的基本原理。
单片机数字钟工作原理
单片机数字钟是一种通过单片机控制数字时钟的设备。
单片机是一种高度集成的电子芯片,具有非常强大的计算和控制能力。
在数字钟中,单片机负责控制时间数码管的显示和计时功能。
具体来说,单片机数字钟的工作原理如下:
1. 时钟电路:单片机数字钟中使用的时钟电路通常是晶体振荡器。
晶体振荡器会产生非常稳定的频率,用于单片机的计时和控制。
2. 计时功能:单片机通过时钟电路来计时。
当单片机启动时,它会从时钟电路中读取当前的时间,然后根据程序中设定的规则不停地更新时间。
单片机数字钟通常会具有秒、分、时等多个计时功能,可以显示当前的精确时间。
3. 显示功能:单片机数字钟通过数码管来显示时间。
数码管是一种常见的显示器件,可以显示数字、字母等信息。
单片机通过控制数码管的亮灭来显示当前时间。
4. 控制功能:单片机数字钟还具有控制功能。
例如,可以通过按钮来调整时间、闹钟等功能。
单片机还可以控制数码管的亮度、闪烁等效果,以及声光报警等功能。
综上所述,单片机数字钟是一种功能强大、精确可靠的电子设备,广泛应用于家庭、办公室、实验室等场合。
- 1 -。
数码管功能数码管是一种常见的显示元件,由许多发光二极管(LED)组成,常用于显示数字和字符等信息。
在我们的日常生活中,数码管被广泛应用于各种设备中,如电子钟、电子秤、温度计、计时器等。
数码管的功能主要体现在以下几个方面:1. 数字显示:数码管最基本的功能就是显示数字。
它由七个发光二极管组成,用来表示不同的数字。
每个发光二极管代表一个数字,通过控制电流的通断来显示特定的数字。
数码管可以显示0-9的数字,通过不同的组合方式还能显示英文字母和特殊字符。
2. 字符显示:除了显示数字,数码管还可以显示一些英文字母和特殊字符。
通过特定的电流通断组合,数码管可以显示A-F的英文字母,以及一些特殊字符如"-"、"."等。
这样就可以在数码管上显示更多的信息,方便用户获取更多的信息。
3. 多位显示:常见的数码管有单位数码管和多位数码管。
单位数码管只能显示一个数字或字符,而多位数码管可以同时显示多个数字或字符。
多位数码管通常由4位或6位单元组成,每个单元可以显示一个数字或字符。
通过控制不同单元的电流通断,多位数码管可以显示更多的数字或字符,提供更多的信息。
4. 时钟显示:数码管可以用于显示时间。
通过在数码管上显示不同的数字,就可以构成一个时钟。
通常使用4位数码管,前两位显示小时,后两位显示分钟。
通过不断刷新数码管上的数字,就可以实现实时的时钟显示。
5. 其他应用:除了上述常见的功能,数码管还可以用于其他许多应用。
比如在电子秤上,数码管可以显示重量;在温度计上,数码管可以显示温度;在计时器上,数码管可以显示计时的时间等等。
这些应用都将数码管的显示功能发挥到了极致,提供了更多的信息和便利。
总之,数码管作为一种常见的显示元件,具有多种功能。
它可以显示数字、字符和一些特殊字符,可以单独显示一个数字或字符,也可以通过多位数码管同时显示多个数字或字符。
数码管还可以用于显示时间、重量、温度等信息,满足不同设备的需求。
数字钟实验报告引言:数字钟是一种使用数字显示时间的时钟,它已经成为我们日常生活中不可或缺的一部分。
通过数字钟,我们可以准确地了解当前的时间,从而更好地安排自己的生活。
本实验旨在探究数字钟的原理和制作过程,并通过实际的制作过程加深对数字钟的了解。
一、原理介绍数字钟的原理基于电子技术和计时器的结合。
其中,主要包括以下几个部分:时钟芯片、数码管、控制电路以及电源等。
1.时钟芯片:时钟芯片是数字钟的核心部件,它内置了计时器和时钟功能。
通过时钟芯片,我们可以实现时间的自动更新和准确显示。
2.数码管:数码管是数字钟的显示部分,它由数根发光二极管组成,能够显示0-9的数字。
通过不同的控制电流和电压,数码管可以根据时钟芯片的指令来显示相应的数字。
3.控制电路:控制电路是连接时钟芯片和数码管之间的桥梁,它负责将时钟芯片输出的信号转换为数码管可识别的信号。
控制电路可以通过编码器、解码器和集线器等元件来实现。
4.电源:电源为数字钟提供所需的电能,将电能转换为供时钟芯片和数码管正常工作所需的电流和电压。
二、实验准备在进行实验之前,我们需要准备以下实验器材:晶体管、电阻器、电容器、发光二极管、电线、焊接工具等。
1.选择晶体管:在制作数字钟的过程中,我们需要选择合适的晶体管来实现数字的显示。
常见的晶体管有阳极、阴极共阳、阴极共阴等。
根据所需的显示效果选择不同类型的晶体管。
2.电阻器和电容器:电阻器和电容器是控制电路的重要组成部分,它们能够限制电流和调节电压,从而保证数字钟的正常工作。
3.焊接工具:焊接工具是将各个器材连接在一起的关键。
使用焊接工具进行焊接时,需要注意操作安全,确保焊点牢固。
三、实验步骤通过以下步骤,我们可以逐步完成数字钟的制作:1.划定电路板:首先,我们需要在电路板上进行标记,划定数字钟的各个部分的位置。
这一步骤旨在确保各个元件的安装位置准确无误。
2.安装元件:接下来,我们可以一步步安装各个元件。
首先,焊接晶体管和电阻器等固定元件,然后进行焊接。
四位数码管显示时间的原理
四位数码管是一种常见的显示器件,用于显示数字。
它由四个七段数码管组成,每个数码管有七个段(a-g)用于显示数字0-9。
通过控制这些段的亮灭,可以显示不同的数字。
数码管显示时间的原理如下:
1. 时钟信号:时钟信号是一个周期性的信号,用于控制数码管的刷新频率。
通常,数码管的刷新频率为几十赫兹,即每秒刷新几十次。
2. 数字转换:将当前的时间转换为需要显示的数字。
例如,将小时、分钟和秒分别转换为四个数字。
3. 数字显示:将转换后的数字依次显示在四位数码管上。
通过控制数码管的七段,可以让特定的段亮起,显示对应的数字。
4. 刷新:由于刷新频率较高,每个数码管只能持续亮起很短的时间,然后迅速切换到下一个数码管。
通过快速刷新,人眼会感觉到所有数码管都同时亮起。
这样,通过不断地刷新和更新显示的数字,就可以实现数码管显示时间的功能。
需要注意的是,数码管只能显示数字,不能直接显示字母和其他符号。
如果需要显示字母、符号或者更复杂的信息,可能需要使用其他类型的显示器件。
单片机实验报告,数码管显示实验目的1、掌握数码管动态扫描显示的原理和编程实现方法;2、掌握软件延时程序的使用。
实验任务利用数码管动态显示,设计一个两位秒表,计时0-59,时间到了显示“FF”,使用软件延时实现。
实验原理数码管动态显示的连接方式是将所有数码管的段码a、b、c、d、e、f、g、dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制。
所谓动态扫描显示,即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
具体过程是:当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以只要将需要显示的数码管的位选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中每位数码管的点亮时间为2ms左右,由于人的视觉暂留现象及发光极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
实现延时通常有两种方法:一种是硬件延时,这需要用到单片机的定— 1 —时器,这种方法可以提高CPU的工作效率,也能做到精确控制时间,此方法将在实验四中再学习;另一种方法是软件延时,这种方法主要采用循环体进行。
可以采用for循环以及for循环嵌套的方式达到粗略的长时间延时,利用Keil软件可以调试和观察for语句的延时时间。
实验结果:总结:本次实验我很好的复习了有关C语言的相关语句知识点,合理的运用到了单片机的程序编码中去,但实验过程中,也出现了很多问题。
比如在运行过程中,数码管会乱码,检查后发现是扫描信号端口错误,将扫描信号端口顺序调换,重新运行则解决了乱码问题。
共阴数码管电路0到15的显示参数代码表要记清楚。