数码管显示时间
制作一个LED数码管显示的秒表
计算机科学与工程系实验报告实验题目:制作一个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四位数码管显示时间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. 刷新:由于刷新频率较高,每个数码管只能持续亮起很短的时间,然后迅速切换到下一个数码管。
通过快速刷新,人眼会感觉到所有数码管都同时亮起。
这样,通过不断地刷新和更新显示的数字,就可以实现数码管显示时间的功能。
需要注意的是,数码管只能显示数字,不能直接显示字母和其他符号。
如果需要显示字母、符号或者更复杂的信息,可能需要使用其他类型的显示器件。
项目3数码显示时间的交通灯PLC控制
图3-3-6 指令使用举例
项目3 数码显示时间的交通灯PLC控制
2.加1指令[FNC24(INC)] 减1指令[FNC25(DEC)]
加1指令和减1指令使用时,一般采用脉冲执行方式,不宜采用连续执行方式,因为连续执行方式是每个程序扫描周期都将执行一次加1和减1的运算,所以勿必引起注意。
1.输入程序并传送到PLC,然后运行调试,看是否符合控制要求,否则要检查接线、PLC程序,直至满足控制要求方可。 (1)交通灯控制程序调试:启动运行程序,观察南北方向和东西方向的红、黄、绿灯是否按照控制的要求工作。 (2)南北方向和东西方向时间显示的调试:启动运行程序,观察南北方向和东西方向时间显示是否按要求倒计时显示;两个方向显示是否同步。 (3)时间显示和交通灯的控制同步调试:启动运行程序,观察各方向时间显示与同一方向的灯光控制是否同步。 2.由于本项目涉及红、黄、绿灯和数码显示管,为了保护好设备,也可按下面方法调试: (1)模拟调试程序。暂时切断输出端电源,观察PLC的输出指示灯是否按控制要求指示,否则,检查并修改程序,直至指示正确。 (2)系统调试。将输出端电源都接上,观察红、黄、绿灯和数码显示管是否按要求运行,否则检查接线,直至按要求运行。
项目准备
图3-3-4 加1指令格式
2.加1指令[FNC24(INC)] 减1指令[FNC25(DEC)]
(1)指令格式: ①加1指令:如图3-3-4所示。 ②减1指令:如图3-3-5所示。
项目3 数码显示时间的交通灯PLC控制
图3-3-5 减1指令格式
项目准备
项目3 数码显示时间的交通灯PLC控制
本项目要求交通灯工作时要具有倒计数并显示剩余时间功能,如图3-3-1所示。具体控制要求如下:当PLC运行时,南北方向绿灯亮,南北方向显示时间6s并倒计数,东西方向红灯亮,东西方向显示时间9s并倒计数;3s后,南北方向绿灯闪烁;3s后,南北方向黄灯亮,南北方向显示时间3s并倒记数;3s后,南北方向红灯亮,南北方向显示时间8s并倒计数,东西方向绿灯亮,东西方向显示时间5s并倒计数;2s后东西方向绿灯闪烁;3s 后,东西方向黄灯亮,东西方向显示时间3s并倒计数;3s后,又是南北方向绿灯亮,东西方向红灯亮…,如此反复循环,实现十字路口交通灯的自动控制。
单片机实验报告,数码管显示
单片机实验报告,数码管显示实验目的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的显示参数代码表要记清楚。
LED数码管秒表的制作
LED数码管秒表的制作
一、课程设计要求及原始资料:
制作一个LED数码管显示的秒表,用2位数码管显示计时时间,最小计时单位为“百毫秒”,计时范围0.1~9.9s。
当第一次按下并松开计时功能键时,秒表开始计时并显示时间;
当第二次按下并松开计时功能键时,停止计时,计算两次按下计时功能键的时间,并把时间值送入数码管显示;
当第三次按下计时功能键时,秒表清零,等待下一次按下计时功能键。
如果计时到9.9s时,将停止计时,按下计时功能键,秒表清零,再按下重新开始计时。
二、课程设计进度:
三、主要参考文献:
[1]张毅刚.单片机原理及应用[M].北京:高等教育出版社,2010
[2]张毅刚.单片机原理及接口技术[M].北京:人民邮电出版社,2008
[3]张毅刚.基于Proteus的单片机课程的基础实验与课程设计[M].北京:人民邮
电出版社,2013
专业班级学生课程设计工作起止时间
课程设计评语。
用数码管(8位)显示的数字时钟程序
用数码管(8位)显示的数字时钟程序
一、程序概述
本程序使用单片机AT89S52,通过数码管(8位)显示当前时间,支持12小时制和24小时制切换,精度为秒。
二、程序实现
程序首先定义了数码管的连接方式和每个数字的位图数据,然后定义了时间变量和函数,包括:
1.初始化函数:设置数码管端口和时钟计数器的计数方式。
2.读时钟函数:读取时钟计数器及寄存器,返回当前时间的小时、分钟和秒数。
3.显示函数:将当前时间转化为8个数码管显示的位图数据,用数字和符号映射表将数字和符号的位图数据与数码管连接方式对应起来,输出到数码管上。
在主函数中,程序初始化后循环执行读时钟函数和显示函数,实现时钟的实时显示。
三、程序特点
1.采用8位数码管显示,时间更加直观。
2.支持12小时制和24小时制切换,适用于不同场景。
3.实现精度为秒的实时显示,更加准确。
四、程序优化
1.增加闹钟功能,提醒用户打卡或者起床。
2.加入温度传感器模块,实现显示温度的功能。
3.优化显示效果,增加字体和颜色等选项。
五、程序应用
本程序可应用于家庭、办公室、学校等场合,用于显示时间,提醒用户合理安排时间和时间管理,也可作为DIY电子制作的教学和实验材料,提高学生的动手实践能力和电子信息技术水平。
实验四 数码管的动态显示实验
实验四数码管的动态显示实验班级通信1102 姓名谢剑辉学号20110803223 指导老师袁文澹一、实验目的熟悉掌握数码管动态显示的基本方法;根据已知电路和设计要求在实验板上实现数码管动态显示。
根据已知电路和设计要求在PROTEUS平台仿真实现控制系统。
二、实验内容1、在STC89C52实验平台的4位数码管上实现动态显示0123→1234→2345→3456→4567→5678→6789→7890→8901→9012→0123→不断反复,每隔2s切换显示内容。
2、思考:如何实现当4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣。
三、实验原理实验要求“4位数码管上实现动态显示0123→1234→2345→3456→4567→5678→6789→7890→8901→9012→0123→不断反复,每隔2s切换显示内容”。
动态扫描可以实现要求。
简单地说,动态扫描就是选通一位,送一位数据。
原理图中的P10~P13是位选信号,即选择哪个数码管显示数字;P00~P07是段码,即要显示的数字。
可以通过依次选通一位7段数码管并通过P0端口送出显示数据。
由于人眼的视觉残留原理,如果这种依次唯一选通每一位7段数码管的动作在0.1s内完成,就会造成多位数码管同时点亮显示各自数字的假象。
本实验使用中断,实现每2s更新一次数字。
四、实验方法与步骤设计思路和方法:1、根据电路图,分析数码管动态显示的设计思路,使用中断实现每2秒更新一次数字的设计思路,以及实现当4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣的设计思路。
(1)数码管动态显示的原理如“实验原理”里所述,不赘述;(2)使用中断实现每2s更新一次数字的设计思路:本次实验使用Timer0中断,由于其定时时间最大为65536us,不能实现2s的长延时,那么可以使用多次中断来实现,并且在中断到来时,不断地死循环显示数字,即根据动态显示原理“选通一位,来一位数据”。
由于最大的数字为9,则(x%10),(x+1)%10,(x+2)%10,(x+3)%10分别是千位,百位,十位,个位上的数字。
数字时钟的工作原理
数字时钟的工作原理数字时钟是我们日常生活中常见的一种时间显示设备,它以数字的形式直观地显示时间,方便我们快速获取时间信息。
那么,数字时钟是如何工作的呢?接下来,我们将深入探讨数字时钟的工作原理。
数字时钟的核心部件是数字显示模块,它通常由数码管组成。
数码管是一种能够显示数字和部分字母的显示器件,它由七段发光二极管组成,每个发光二极管的发光区域可以组成数字0-9和部分字母的显示。
数字时钟通过控制数码管的发光状态来显示时间。
数字时钟的工作原理可以分为两个部分,时间信号的获取和数字显示模块的控制。
首先,数字时钟需要获取时间信号,一般来说,它会通过电子时钟芯片或者接收无线信号的方式获取当前的时间信息。
电子时钟芯片内部会有一个高精度的晶体振荡器,它能够稳定地产生一个固定频率的时钟信号,这个信号会被用来计时和显示时间。
一旦获取了时间信号,数字时钟就需要将时间信息转换成数码管可以显示的形式。
这个过程涉及到时间信号的分频和数码管的控制。
时间信号通常是一个固定频率的方波信号,通过分频电路可以将它转换成年、月、日、时、分、秒等不同的时间信号。
这些时间信号经过一定的逻辑运算和数码管的控制,就能够准确地显示在数码管上了。
数码管的控制通常采用多路复用技术,即通过控制数码管的阳极和阴极来选择需要显示的数字,并且以一定的频率进行刷新,从而实现数字时钟的显示。
在刷新的瞬间,我们看到的数字是稳定的,这是因为人眼对光线的适应性,使得我们看到的数字是稳定的,而不是在不停地闪烁。
除此之外,数字时钟还可能包含闹钟、计时器等功能,这些功能都是通过控制电路和逻辑电路来实现的。
比如,闹钟功能需要设定一个特定的时间,当时间信号与设定的时间相同时,就会触发闹钟的响铃。
计时器功能则需要通过按钮来控制计时的开始、暂停和复位。
总的来说,数字时钟的工作原理涉及到时间信号的获取、分频、数码管的控制和功能模块的实现。
通过这些过程,我们能够方便地获取时间信息,提高我们的生活效率。
【单片机】c51数字时钟(带年月日显示)
【单片机】c51数字时钟(带年月日显示)集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-【单片机】c51数字时钟(带年月日显示)显示当前时间:9点58分34秒(第一个零表示闹钟未开启)当前日期:10年4月六日摘要:本设计以单片机为核心,LED数码管动态扫描显示。
采用矩阵式键盘输入能任意修改当前时间日期和设定闹钟时间。
具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能说明系统的功能选择由7个按键完成。
其中,分别对应调整当前时间的时和分,为外部中断0,控制闹钟功能的开启/关闭(开启时数码管第一位显示字母’c’)用作外部中断1,当前时间的显示与闹铃时间显示切换,闹钟显示时按,可进行闹钟时分的设定,此时,led1灯灭。
闹铃时间到切闹钟开关开启时,闹铃响一分钟。
\\对年月日进行调整(第一次按,就进入了年月日的显示,现在就可对日期进行调整)。
按回到当前时间的显示状态。
整点到时:报警对应小时的次数。
程序如下:#include<>#include<>#include<>#define uchar unsigned char#define uint unsigned intuchar data keyvalue; //查到的键值uchar data keys; //转换出的数字uchar dis[8];uchar codeseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x39,0xf7}; // 0 1 2 3 4 5 6 7 8 9 - 灭灯 cnsbit led_duan=P2^6;//段选通sbit led_wei=P2^7;//位选通sbit speaker=P2^3;//蜂鸣器sbit minitek=P3^0;//分校正按键sbit hourk=P3^1;//小时校正按键sbit p3_4=P3^4;//sbit yeark=P3^5;//年sbit monthk=P3^6;//月sbit dayk=P3^7;//日uchar data wei,i;bit leap_year;//闰年标志位bit dis_nyr;bit cal_year=1;bit calculate=1;//显示年月日与当前时间切换标志uchar data c_min;//闹钟‘分寄存单元uchar data c_hou;//闹钟、小时寄存单元uchar data second;//秒uchar data minite;//分变量uchar data hour;//小时变量uchar data year,month,day;//定义年月日变量uchar data CNTA;uchar data speaker_num; //蜂鸣次数bit beep; //整点报时标志bit run; //运行标志bit flash; //灭灯标志bit clarm_switch; //闹钟开关标志bit baoshi; //报时开关标志sbit led1=P1^6; // 按键标识指示灯sbit led2=P1^7; // 运行标志指示灯sbit P3_2=P3^2;sbit P3_3=P3^3;uint n,k;/*10微秒级延时*/void delay_10us(uchar n)?{ do{ _nop_();_nop_();_nop_();_nop_();_nop_();}while(--n);}/***毫秒级延时 ***/void delay_ms(uint n)?{ do delay_10us(131);while(--n);}/****** 当前时间转换******/clk_to_dis(){dis[0]=second%10;dis[1]=second/10;if(flash)dis[2]=10;else dis[2]=11;dis[3]=minite%10;dis[4]=minite/10;dis[5]=hour%10;dis[6]=hour/10;}/*****定时闹钟显示译码(用于七段码显示)*****/ clarm_to_dis(){dis[0]=c_min%10;dis[1]=c_min/10;if(flash)dis[2]=10;//亮灯else dis[2]=11; //灭灯dis[3]=c_hou%10;dis[4]=c_hou/10;dis[5]=10;dis[6]=13;}/***********年月日显示译码************/ nyr_to_dis(){dis[0]=day%10;dis[1]=day/10;dis[2]=10;//显示'-'dis[3]=month%10;dis[4]=month/10;dis[5]=10; // '-'dis[6]=year%10;dis[7]=year/10;}/*主函数*/void main(){P2=0xff;P1=0XFF;p3_4=0;run=1;led2=0;//运行指示灯亮led1=1;flash=0x00;dis[2]=10; //第三位显示“-”wei=0x7f;//选通低位 i=0;?second=21;minite=58;hour=9;CNTA=0x00;year=10;month=4;day=5;clk_to_dis(); TMOD=0x11;TH0=15560/256;TL0=15560%256;TH1=0xfc;TL1=0x18;EA=1;PT0=1;EX0=1; //开中断;EX1=1;?ET0=1;ET1=1;TR0=1;TR1=1;while(1){while(run==1){clk_to_dis();if(calculate){if(month==1|month==3|month==5|month==7|month==8|month==10|month==12){day++;?if(day>31){day=0x01;month++; if(month==13){month=1;year++;cal_year=1;}}led1=0; //指示灯亮}if(month==4|month==6|month==9|month==11){day++;if(day>30){day=0x01;month++;}led1=0; //指示灯亮}if(month==2) {if(leap_year==1){day++;if(day==30)day=1;}else {day++;if(day==29)day=1;}}while(cal_year){if((year+2000)%400==0) leap_year=1; // 被400整除为闰年else if((year+2000)%100==0) leap_year=0; //不能被400整除能被100整除不是闰年 else if((year+2000)%4==0) leap_year=1; //不能被400、100整除能被4整除是闰年 else leap_year=0;cal_year=0;}calculate=0;led1=1;}while(!minitek){for(n=0;n<1000;n++);if(!minitek==0)break; //延时防抖minite++;second=0x00;led1=0;for(n=0;n<20;n++){speaker=!speaker;delay_10us(50); //蜂鸣器响 }if(minite==60)minite=0x00; while(!minitek); //等待键松开led1=1;//显示灯}while(!hourk){for(n=0;n<1000;n++);if(!hourk==0)break;hour++;second=0x00;led1=0;。
数字时钟的原理
数字时钟的原理
数字时钟的原理是基于数码管显示技术和时钟芯片的运行机制。
数码管是一种能够显示数字的器件,由七段LED(Light Emitting Diode,发光二极管)组成。
每个数码管的LED段可
以发光,并且被编号为a, b, c, d, e, f, g。
通过点亮或熄灭相应
的LED段,可以显示数字0至9以及其他特殊字符,如冒号等。
时钟芯片是数字时钟的关键部件,它包含一个晶振用于产生稳定的时钟信号,并且具有计时和计算功能。
时钟芯片内部有一个计数器,根据晶振提供的时钟信号,计数器以固定频率进行加1操作。
通过对计数器进行适当的处理,时钟芯片能够精确地测量时间,并将其转换为将要显示在数码管上的数字信号。
当计数器的数值发生改变时,时钟芯片会根据特定的算法将其转换为对应的数码管段的控制信号。
这些控制信号通过驱动电路传递到每个数码管的对应LED段上,点亮相应的LED段,
从而显示出正确的数字。
在数字时钟中,通常使用四个数码管分别表示小时的十位数、小时的个位数、分钟的十位数和分钟的个位数。
时钟芯片负责根据实时时间的变化,不断更新这些数码管的显示内容,以实现时钟的功能。
总的来说,数字时钟的原理是基于数码管显示技术和时钟芯片的协同作用,通过正确定时和计时的运算,将实时时间以数字形式展示在数码管上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uchar code DIG_CODE[16]={
0x03f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79Байду номын сангаас0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
}
if( (Setshi2==2)&&(Setshi1==3) ) //即23时
{
Setshi1=0;
Setshi2=0;
}
}
void Clock()//闹铃
{
if( (Setmiao1==miao1)&&(Setmiao2==miao2)&&(Setfen1==fen1)&&(Setfen2==fen2)&&(Setshi1==shi1)&&(Setshi2==shi2) )
Setmiao2++;
}
if(Setmiao2==6)
{
Setmiao2=0;
Setfen1++;
}
if(Setfen1==10)
{
Setfen1=0;
Setfen2++;
}
if(Setfen2==6)
{
Setfen2=0;
Setshi1++;
}
if(Setshi1==10)
{
Setshi1=0;
Setshi2++;
{
Setfen1++;
while(!K2);
}
else
{
}
}
if(K3==0)
{
delayms(1);
if(K3==0)
{
Setshi1++;
while(!K3);
}
else
{
}
}
/***********时间的进位设置******************/
if(Setmiao1==10)
{
Setmiao1=0;
{
P0=0x00;
Seventh;
P0=0x00;
P0=DIG_CODE[shi1];
//P0=0x00;
}
if(shi2==2)
{
shi2=0;
}
else//显示时的十位
{
P0=0x00;
Eighth;
P0=0x00;
P0=DIG_CODE[shi2];
//P0=0x00;
}
}
void SetingClock()//闹铃时间设置
void Timer0() interrupt 1
{
TH0 = 0x3C;//设置初始值
TL0 = 0xB0;
Time++;
}
void delayms(uchar x)//x*10毫秒
{
uchar a,b,c;
for(c=x;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
sbit LSC=P2^4;
sbit Beep = P1^5 ;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
#define First LSA=0;LSB=0;LSC=0//138译码器位数设置
#define Second LSA=1;LSB=0;LSC=0
#define Third LSA=0;LSB=1;LSC=0
#define Fourth LSA=1;LSB=1;LSC=0
#define Fifth LSA=0;LSB=0;LSC=1
#define Sixth LSA=1;LSB=0;LSC=1
#define Seventh LSA=0;LSB=1;LSC=1
void delayms(uchar x);
void Timer();//时间显示
void SetingTime(); //时间设置
void Clock();//闹铃
void SetingClock();//闹铃时间设置
void SetingClockDisplay();//闹钟设置显示
void Delay(unsigned int i) ; //蜂鸣器所用延时
}
void Delay(unsigned int i)//蜂鸣器用延时函数
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
main()
{
uchar Num=1;
Beep=0;
TimerConfiguration();
while(1)
{
if(K4==0)//通过K4来选择是计时还是设置闹铃
{
delayms(1);
if(K4==0)
{
Num++;
while(!K4);
}
}
if(Num==2)
{
Num=0;
}
if(Num)
{
*
****************************************************/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
P0=0x00;
Fourth;
P0=0x00;
P0=DIG_CODE[Setfen1];
P0=0x00;
Fifth;
P0=0x00;
P0=DIG_CODE[Setfen2];
P0=0x00;
Seventh;
P0=0x00;
P0=DIG_CODE[Setshi1];
P0=0x00;
Eighth;
P0=0x00;
miao1++;
}
else//显示:在第一位显示秒的个位
{
P0=0x00;
First;
P0=0x00;
P0=DIG_CODE[miao1];
}
if(miao1==10)
{
miao1=0;
miao2++;
}
else//显示秒的十位
{
P0=0x00;
Second;
P0=0x00;
P0=DIG_CODE[miao2];
uchar Time=0;
uchar miao1=0,miao2=0,fen1=0,fen2=0,shi1=0,shi2=0;
char Setmiao1=-1,Setmiao2=0,Setfen1=0,Setfen2=0,Setshi1=0,Setshi2=0;
void TimerConfiguration();
}
/*******************************************************************************
*函数名: Timer0()
*函数功能:定时器0中断函数
*输入:无
*输出:无
*******************************************************************************/
P0=DIG_CODE[Setshi2];
}
void TimerConfiguration()//中断的设置
{
TMOD = 0x01; //选择工作方式1
TH0 = 0x3C;//设置初始值,定时50MS
TL0 = 0xB0;
EA = 1;//打开总中断
ET0 = 1;//打开定时器0中断
TR0 = 1;//启动定时器0
}
if(fen2==6)
{
fen2=0;
shi1++;
}
else//分的十位
{
P0=0x00;
Fifth;
P0=0x00;
P0=DIG_CODE[fen2];
}
P0=0x00;//显示第六位的“-”
Sixth;
P0=0x00;
P0=0x40;
if(shi1==10)
{
shi1=0;
shi2++;
}
else//显示时的个位
{
while(1)
{
Beep=1;
Delay(5);
Beep=0;
Delay(5);
}
}
}
voidSetingClockDisplay()//闹钟设置显示
{
P0=0x00;
First;
P0=0x00;
P0=DIG_CODE[Setmiao1];
P0=0x00;
Second;
P0=0x00;
P0=DIG_CODE[Setmiao2];
if(K2==0)
{
fen1++;
while(!K2);
}
else
{
}
}
if(K3==0)
{
delayms(1);
if(K3==0)
{
shi1++;