数码管显示数字钟 (定时器实现 外部中断调节)

合集下载

单片机课程设计数字钟实验报告

单片机课程设计数字钟实验报告

单片机课程设计:电子钟一、实现功能1、能够实现准确计时,以数字形式显示时、分、秒的时间。

2、小时以24小时计时形式,分秒计时为60进位,能够调节时钟时间。

3、闹钟功能,一旦走时到该时间,能以声或光的形式告警提示。

4、能够实现按键启动与停止功能。

5、能够实现整点报时功能。

6、能够实现秒表功能。

二、设计思路1、芯片介绍VCC:电源。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。

数码管动态显示实验报告

数码管动态显示实验报告

一、实验目的1. 掌握数码管动态扫描显示的原理和编程实现方法;2. 熟悉单片机与数码管之间的接口连接;3. 学会使用定时器中断控制数码管的动态显示;4. 培养动手能力和问题解决能力。

二、实验原理数码管动态显示是通过单片机控制多个数码管同时显示不同的数字或字符,利用人眼的视觉暂留效应,实现快速切换显示内容,从而在有限的引脚数下显示更多的信息。

实验中,我们采用动态扫描的方式,依次点亮数码管,通过定时器中断控制扫描速度。

三、实验器材1. 单片机开发板(如51单片机、AVR单片机等);2. 数码管(共阳/共阴自选);3. 连接线;4. 电阻;5. 实验台;6. 编译器(如Keil、IAR等)。

四、实验步骤1. 设计电路图:根据实验要求,设计单片机与数码管的连接电路图,包括数码管的段码、位选信号、电源等。

2. 编写程序:使用C语言或汇编语言编写程序,实现数码管的动态显示功能。

(1)初始化:设置单片机的工作模式、定时器模式、端口方向等。

(2)显示函数:编写显示函数,实现数码管的点亮和熄灭。

(3)定时器中断服务程序:设置定时器中断,实现数码管的动态扫描。

3. 编译程序:将编写的程序编译成机器码。

4. 烧录程序:将编译后的程序烧录到单片机中。

5. 连接电路:将单片机与数码管连接好,包括数码管的段码、位选信号、电源等。

6. 运行实验:打开电源,观察数码管的显示效果。

五、实验结果与分析1. 实验结果:数码管按照预期实现了动态显示功能,依次点亮每位数码管,并显示出不同的数字或字符。

2. 分析:(1)通过调整定时器中断的周期,可以改变数码管的扫描速度,从而控制显示效果。

(2)在编写显示函数时,要考虑到数码管的共阳/共阴特性,选择合适的点亮和熄灭方式。

(3)在实际应用中,可以根据需要添加其他功能,如显示时间、温度等。

六、实验总结1. 通过本次实验,掌握了数码管动态显示的原理和编程实现方法。

2. 熟悉了单片机与数码管之间的接口连接,提高了动手能力。

原创数码管动态显示时间(0-999秒倒计时)

原创数码管动态显示时间(0-999秒倒计时)

数码管动态显示时间(0-999秒倒计时)原理图:
控制部分
数码管时间显示,微动按键时间调整,工作手具转换,启动和复位程序。

1.待机:时间显示010秒.D6灯亮,此时ZHH,GZ无输出。

2.转换键:待机D5和D6状态可相互转换,开机常态体腔指示灯亮ZHH,GZ无输出。

按一下转换到D5状态,D5
指示灯亮ZHH输出,再按一下转换到D6状态,体腔指示灯亮ZHH无输出。

3.“加”“减”键:可调时间000-999秒,可快加和快减时间,每秒10个数变化。

慢加和慢减时间,每按一下变化1
个数。

4.复位键:工作和报警中可用,复位到设定状态。

5.手柄启动键:设定到D6状态时,按下启动键时间以设定时间倒计时工作,此时ZHH无输出GZ输出,治疗指
示灯D4亮时间减到000后,GZ断开报警5秒治疗指示灯闪烁,返回到设定状态。

设定到D5状态时,按下启动键时间以设定时间倒计时工作,此时ZHH,GZ输出,治疗指示灯亮时间减到000后,GZ断开报警5秒治疗指示灯闪烁。

工作中除复位键外其他键不能动作。

报警中可重复启动(设定状态)。

51单片机数码管时钟电路的设计

51单片机数码管时钟电路的设计

51单片机数码管时钟电路的设计设计一个51单片机数码管时钟电路,让我们开始吧。

一、设计思路该数码管时钟电路的设计主要包括以下几个方面:1.使用DS1302时钟芯片获取真实时间;2.使用I2C总线方式将DS1302时钟芯片与51单片机连接;3.使用74HC595芯片驱动数码管显示;4.使用按键控制时钟的设置和调节;5.使用蜂鸣器发出报警声;6.使用LED指示灯显示时钟状态。

二、硬件设计部分数码管显示部分:1.使用4位共阳数码管作为时分显示器,使用1位共阳数码管作为秒显示器;2.使用8片74HC595芯片级联起来,将时分秒数据传输到数码管显示;3.设置共阳数码管的通阳管为P0口,设置74HC595的DS(串行数据输入)、SH(上升沿锁存)、STCP(74HC595的8位锁存输出)引脚接到P1.2、P1.3、P1.4端口;4.设置8个控制引脚接到P1.5~P1.12端口。

实时时钟部分:1.使用DS1302时钟芯片连接到P2.0、P2.1、P2.2、P2.3、P2.4、P2.5、P2.6、P2.7端口;2.设置时钟复位引脚接到P0.1端口,时钟传输使能引脚接到P0.2端口。

按键输入部分:1.设置按键S1接到P3.2端口,按键S2接到P3.3端口;2.设置按键的上拉电阻,使其处于高电平状态;3.设置按键的下降沿触发外部中断,以便检测按键的按下事件。

其他部分:1.设置蜂鸣器接到P0.0端口,并使用普通电阻限流;2.设置LED指示灯接到P0.7端口。

三、软件设计部分1.初始化函数:初始化P0、P1、P2、P3口的状态;2.DS1302驱动函数:包括初始化DS1302芯片和读写DS1302寄存器的函数;3.74HC595驱动函数:包括初始化74HC595芯片,以及向74HC595芯片发送8位数据的函数;4.数码管显示函数:将时分秒数据按位转换为对应的数字和状态,并调用74HC595驱动函数显示;5.按键检测函数:检测按键的按下事件,并根据按键事件的不同触发不同的操作;6.报警函数:当设定时间到达时,将触发报警声,并控制LED灯闪烁;7.主函数:循环读取DS1302时间,并更新数码管显示,检测按键事件,触发报警。

数码管 动态显示原理

数码管 动态显示原理

数码管动态显示原理
数码管的动态显示原理是通过快速地切换数字的显示段来实现连续的数字显示。

数码管通常由7个显示段构成,分别代表数字0-9的不同显示形式。

这些段也被称为a、b、c、d、e、f和
g段。

在动态显示过程中,每个数字被逐个切换显示的时间非常短,通常为几毫秒。

这个时间非常短,以至于人眼无法察觉数字的切换。

因此,当多个数码管以高速切换显示数字时,人眼会感觉到所有数码管上的数字同时显示。

要实现动态显示,需要使用一个计数器来控制切换显示的时间。

这个计数器通常是一个定时器,它会以一定的频率触发中断,每次中断时触发一次显示切换。

通过不断增加计数值,可以控制不同数字的显示时间。

为了显示一个多位数,需要使用多个数码管并连接到控制器上。

控制器会根据待显示的数字,将适当的段信号发送到对应的数码管上。

通过在不同的数码管上切换显示,就可以实现多位数的动态显示。

动态显示的基本原理如下:
1. 设置初始的数码管选择位,使其对应第一个数码管。

2. 将第一个数码管对应的段信号置为显示的数字。

3. 延时一段时间,使人眼无法察觉到数字的切换。

4. 将第一个数码管的段信号置为低电平(或不显示的状态)。

5. 设置下一个数码管的选择位,使其对应下一个数码管。

6. 重复2-5步骤,直至所有数码管都完成一轮显示。

7. 返回第一步,重复整个过程,以实现连续的动态显示。

通过以上步骤的循环,不断切换显示的数字会给人一种连续而平滑的显示效果。

这就是数码管动态显示的基本原理。

数码管电子钟的设计及实现

数码管电子钟的设计及实现

数码管电子钟的设计及实现导言:一、设计思路数码管电子钟的设计分为硬件部分和软件部分。

硬件部分主要包括显示部分、时钟模块和控制模块。

显示部分使用数码管来显示时间;时钟模块为电子钟提供精确的时间基准;控制模块用于控制数码管的显示。

软件部分则负责获取时间信息,将其转换为数码管可显示的格式,并通过控制模块实现数码管的动态显示。

二、硬件设计1.显示部分数码管是电子钟的核心组成部分。

常见的数码管有共阳极和共阴极两种类型,其中共阳极的数码管在高电平时点亮,而共阴极的数码管在低电平时点亮。

数码管通常有七段,通过控制不同的段和共阳极/共阴极电平可以显示不同的数字和字符。

2.时钟模块时钟模块是电子钟的时间基准,它可以使用实时时钟(RTC)芯片或者微控制器的定时器模块来实现。

实时时钟芯片具有较高的精度和稳定性,可以通过外部电池或超级电容实现断电不掉时。

而微控制器的定时器模块则可以通过软件来实现,其精度根据微控制器的时钟频率和定时器的精度决定。

3.控制模块控制模块用于控制数码管的显示。

它可以由数字集成电路(Digital Integrated Circuit, DIC)或微控制器实现。

DIC通常是通过设置其输入端的电平来控制数码管的显示;而微控制器则可以通过软件来实现复杂的显示操作,如动态显示、闪烁等。

三、软件设计1.时间获取软件部分需要获取当前的时间信息,一般通过时钟模块来实现。

对于使用实时时钟芯片的情况,可以直接读取芯片上的时间寄存器获取当前时间;对于使用定时器模块的情况,可以通过定时器溢出中断来更新时间值。

2.时间转换获取到当前时间后,需要将其转换为数码管可以显示的格式。

通常情况下,将时间转换为时、分、秒的形式,并将其转换为BCD码或十进制数。

3.数码管显示控制根据转换后的时间值,通过控制模块来控制数码管的显示。

这可以通过DIC的输入电平或微控制器的GPIO口来实现。

对于复杂的显示操作,如动态显示,可以通过微控制器的定时器模块和中断来实现。

单片机和数码管设计的电子时钟

单片机和数码管设计的电子时钟

单片机和数码管设计的电子时钟电子时钟是一种用电子技术实现时间显示的设备,它能够精确地显示时间,并通过单片机控制数码管进行数字显示。

在本文中,将介绍单片机和数码管设计的电子时钟的原理、设计过程和实现方法。

一、电子时钟原理电子时钟的原理主要包括时钟信号源、计数器、数码管显示和时钟控制等部分。

时钟信号源提供一个恒定的频率信号,一般使用晶振产生。

计数器用于计数时钟信号的脉冲数,通过累加到一定的脉冲数后,完成对秒、分、时等单位的计数。

数码管显示用于将计数器的计数值转化为数字进行显示。

时钟控制部分通过单片机对时钟模块进行控制,完成时钟的设置、调整和显示等功能。

二、电子时钟设计过程1.确定需求:首先确定电子时钟的功能和要求,包括时间显示、闹钟功能、调节功能等。

根据需求确定显示部分所需的数码管数量和接口方式。

2.选择单片机:根据需求选择一款适合的单片机,考虑其处理能力、接口数量和扩展性等因素。

3.设计时钟源:选择合适的晶振作为时钟源,并将时钟信号输入到单片机的计时部分,生成一个恒定频率的脉冲信号。

4.编程设计:根据单片机类型选择相应的开发工具,编写程序实现时钟的计数、显示和控制功能。

其中,需要实现时钟的秒、分、时等单位的计数和显示、时钟调节和设置等功能。

5.数码管接口设计:根据数码管的数量和接口方式,进行接口设计。

常用的接口方式有共阳和共阴两种方式。

通过连接适当的电阻和引脚控制,实现对数码管进行数字显示。

6.硬件设计:根据实际需求和电路原理进行电路设计,包括电源电路、晶振电路和数码管显示电路。

注意电源的稳定性以及数码管的驱动电流和电压等参数。

7.调试和测试:完成硬件设计后,进行电子时钟的调试和测试工作。

通过对时钟进行时间设置和调整,验证时钟的计时和显示功能是否正常。

8.最终优化:对电子时钟的功能和性能进行评估,并进行必要的优化。

可以考虑添加闹钟功能、温度显示等扩展功能。

三、实现方法电子时钟的实现方法主要有两种,一种是基于单片机开发板实现,另一种是自己设计和制作。

C51单片机课程标准

C51单片机课程标准

《C51单片机》课程标准【课程名称】C51单片机【适用专业】高等职业教育智能产品开发专业一、课程定位1.课程性质本课程为应用电子技术专业职业素质课程职业技能核心课程。

2.课程任务通过本课程的教学,使学生理解单片机系统的硬件电路组成,理解单片机工作原理,掌握使用C语言对51单片机进行编程的方法,使学生体会真实、完整的单片机开发工作过程(硬件电路焊接、电路调试、软件编程、程序下载等)对单片机系统软件和应用软件的设计和开发有较深刻理解。

从而使学生能够胜任小型智能化电子产品的设计与开发岗位,为就业打下基础。

3.课程衔接本课程的前序课程为《实用电工技术》、《模拟电路的分析与应用》、《数字电路的分析与应用》、《电子线路版图的的识别与绘制》、氯语言程序设计》,后续课程为《电子整机电路检修与调试》、《PLC控制系统的设计与维护》、《传感器应用技术》和《EDA技术应用》。

二、课程目标通过本课程学习,理解单片机应用系统的组成,能够根据实际控制系统要求,合理地选择单片机并对其硬件、软件进行设计;养成良好的沟通能力;培养团队协作精神;具有安全文明的工作习惯,良好的职业道德;较强的质量意识和创新精神。

具体应具备以下能力:1.能够较好地理解MCS-51单片机的性能并了解单片机系统的应用;2.能够正确选用元器件、识读电路图,完成单片机系统的安装与调试;3.熟悉Keil软件的使用,熟悉proteus软件的单片机仿真方法,能进行简单应用程序的设计与调试;4.掌握C51结构和基本的程序设计方法,掌握MCS-51单片机应用系统的设计方法;5.熟练使用常用仪器仪表,能够检测单片机系统故障并修复;6.具有敏锐的网络信息意识,善于整合资源、乐于团队协作;7.具有良好的职业道德与敬业精神。

【教学内容】三、考核与评价本课程宜考核采用过程考核和期末考试相结合,过程考核和期末考试所占的比例分别为60%和40%。

其中过程考核包括7个项目的考核,7个项目总分为100分,乘以权值0. 6,折合成6 0%。

利用单片机的定时器设计一个数字时钟

利用单片机的定时器设计一个数字时钟

利用单片机的定时器设计一个数字时钟数字时钟是我们日常生活中常见的计时工具,可以准确地显示当前的时间。

而单片机的定时器则可以提供精准的定时功能,因此可以利用单片机的定时器来设计一个数字时钟。

本文将介绍如何使用单片机的定时器来设计一个基于数字显示的时钟,并提供基本的代码实现。

一、时钟电路设计利用单片机设计一个数字时钟,首先需要设计一个合适的时钟电路。

时钟电路一般由电源电路、晶振电路、单片机复位电路和显示电路组成。

1. 电源电路:为电路提供工作所需的电源电压,一般使用稳压电源芯片进行稳定的供电。

2. 晶振电路:利用晶振来提供一个稳定的时钟信号,常用的晶振频率有11.0592MHz、12MHz等。

3. 单片机复位电路:用于保证单片机在上电或复位时能够正确地初始化,一般使用降低复位电平的电路。

4. 显示电路:用于将单片机输出的数字信号转换成七段数码管可以识别的信号,一般使用BCD码和译码器进行实现。

二、单片机定时器的应用单片机的定时器具有精准的定时功能,可以帮助实现时钟的计时功能。

单片机的定时器一般分为定时器0和定时器1,根据具体的应用需求选择使用。

在设计数字时钟时,可以将定时器0配置成定时器模式,设置一个适当的定时时间。

当定时器0计时达到设定时间时,会触发一个中断信号,通过中断处理程序可以实现时钟的计时功能。

以下是一个基于单片机的定时器的伪代码示例:```void Timer0_Init(){// 设置定时器0为工作在定时器模式下// 设置计时时间// 开启定时器0中断}// 定时器0中断处理程序void Timer0_Interrupt_Handler(){// 更新时钟显示}void main(){Timer0_Init();while(1){// 主循环}}```在上述伪代码中,Timer0_Init()函数用于初始化定时器0的相关设置,包括工作模式和计时时间等。

Timer0_Interrupt_Handler()函数是定时器0的中断处理程序,用于处理定时器0计时到达设定时间时的操作,例如更新时钟显示。

基于单片机的电子时钟的设计与实现

基于单片机的电子时钟的设计与实现

基于单片机的电子时钟的设计与实现电子时钟是一种使用微处理器或单片机作为主控制器的数字时钟。

它不仅能够显示当前时间,还可以具备其他附加功能,如闹钟、日历、温度显示等。

一、设计目标设计一个基于单片机的电子时钟,实现以下功能:1.显示时间:小时、分钟和秒钟的显示,采用7段LED数码管来显示。

2.闹钟功能:设置闹钟时间,到达设定的时间时会发出提示音。

3.日历功能:显示日期、星期和月份。

4.温度显示:通过温度传感器获取当前环境温度,并显示在LED数码管上。

5.键盘输入和控制:通过外部键盘进行时间、日期、闹钟、温度等参数的设置和调整。

二、硬件设计1.单片机选择:选择一款适合的单片机作为主控制器,应具备足够的输入/输出引脚、中断和定时器等功能,如STC89C522.时钟电路:使用晶振为单片机提供稳定的时钟源。

3.7段LED数码管:选择合适的尺寸和颜色的数码管,用于显示小时、分钟和秒钟。

4.温度传感器:选择一款适合的温度传感器,如DS18B20,用于获取环境温度。

5.喇叭:用于发出闹钟提示音。

6.外部键盘:选择一款适合的键盘,用于设置和调整时间、日期、闹钟等参数。

三、软件设计1.初始化:设置单片机定时器、外部中断和其他必要的配置。

2.时间显示:通过定时器中断,更新时间,并将小时、分钟和秒钟分别显示在相应的LED数码管上。

3.闹钟功能:设置闹钟时间,定时器中断检测当前时间是否与闹钟时间一致,若一致则触发警报。

4.日历功能:使用定时器中断,更新日期、星期和月份,并将其显示在LED数码管上。

5.温度显示:通过定时器中断,读取温度传感器的数据,并将温度显示在LED数码管上。

6.键盘输入和控制:通过外部中断,读取键盘输入,并根据输入进行相应的操作,如设置时间、闹钟、日期等。

7.警报控制:根据设置的闹钟时间,触发警报功能,同时根据用户的设置进行控制。

四、测试与调试完成软件设计后,进行系统测试与调试,包括验证显示时间、日期、温度等功能的准确性,以及闹钟和警报功能的触发与控制。

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟程序
一、程序概述
本程序使用单片机AT89S52,通过数码管(8位)显示当前时间,支持12小时制和24小时制切换,精度为秒。

二、程序实现
程序首先定义了数码管的连接方式和每个数字的位图数据,然后定义了时间变量和函数,包括:
1.初始化函数:设置数码管端口和时钟计数器的计数方式。

2.读时钟函数:读取时钟计数器及寄存器,返回当前时间的小时、分钟和秒数。

3.显示函数:将当前时间转化为8个数码管显示的位图数据,用数字和符号映射表将数字和符号的位图数据与数码管连接方式对应起来,输出到数码管上。

在主函数中,程序初始化后循环执行读时钟函数和显示函数,实现时钟的实时显示。

三、程序特点
1.采用8位数码管显示,时间更加直观。

2.支持12小时制和24小时制切换,适用于不同场景。

3.实现精度为秒的实时显示,更加准确。

四、程序优化
1.增加闹钟功能,提醒用户打卡或者起床。

2.加入温度传感器模块,实现显示温度的功能。

3.优化显示效果,增加字体和颜色等选项。

五、程序应用
本程序可应用于家庭、办公室、学校等场合,用于显示时间,提醒用户合理安排时间和时间管理,也可作为DIY电子制作的教学和实验材料,提高学生的动手实践能力和电子信息技术水平。

四位数码管显示时间的原理

四位数码管显示时间的原理

四位数码管显示时间的原理
四位数码管是一种常见的显示器件,用于显示数字。

它由四个七段数码管组成,每个数码管有七个段(a-g)用于显示数字0-9。

通过控制这些段的亮灭,可以显示不同的数字。

数码管显示时间的原理如下:
1. 时钟信号:时钟信号是一个周期性的信号,用于控制数码管的刷新频率。

通常,数码管的刷新频率为几十赫兹,即每秒刷新几十次。

2. 数字转换:将当前的时间转换为需要显示的数字。

例如,将小时、分钟和秒分别转换为四个数字。

3. 数字显示:将转换后的数字依次显示在四位数码管上。

通过控制数码管的七段,可以让特定的段亮起,显示对应的数字。

4. 刷新:由于刷新频率较高,每个数码管只能持续亮起很短的时间,然后迅速切换到下一个数码管。

通过快速刷新,人眼会感觉到所有数码管都同时亮起。

这样,通过不断地刷新和更新显示的数字,就可以实现数码管显示时间的功能。

需要注意的是,数码管只能显示数字,不能直接显示字母和其他符号。

如果需要显示字母、符号或者更复杂的信息,可能需要使用其他类型的显示器件。

单片机数码管静态显示及定时器和中断应用

单片机数码管静态显示及定时器和中断应用

例 利用定时/计数器T1的方式1,产生10ms的定时,并使P1.0引脚上输出周期为20ms的方波,采用中断方式,设系统时钟频率为12 MHz。 解:1、计算计数初值X: 由于晶振为12 MHz,所以机器周期Tcy为1 s。 所以: N=t/ Tcy =10000/1=10000 X=65536-10000=55536=D8F0H 即应将D8H送入TH0中,F0H送入TL0中 2、求T1的方式控制字TMOD: M1M0=01,GATE=0,C/T=0,可取方式控制字为01H;
GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。 :定时/计数模式选择位。 =0为定时模式; =1为计数模式。 M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。
TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
使用LED显示器时,要注意区分这两种不同的接法。为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。因此为LED显示器提供的编码正好是一个字节。TX实验板用共阴LED显示器,根据电路连接图显示16进制数的编码已列在下表。

数码管时钟显示按键调时间

数码管时钟显示按键调时间
//--------------------------------------------------------
void init()
{
shinao=8;//初始定义闹钟时间为8点整
gn=1;
gnnz=1;
ss=0;
aa=0;
// dd=0;
bb=1;//进入调闹钟日常时间循环
cc=1;//进入调闹钟日常时间循环
{
case 2: miao=SBUF;
flag=0;
if(miao>=60)
{
miao=0;
}
break;
case 3: fen=SBUF;
flag=0;
if(fen>=60)
{fen=0;}b Nhomakorabeaeak;
case 4: shi=SBUF;
flag=0;
if(shi>=24)
{
shi=0;
}
break;
/*void ck_gn()
{
dd=1;
ss=1;
ck_init();
while(ck)
{
if(key()==2)//按键k2功能键
{
gn++;//判断按下的次数
switch(gn)
{ //case 1: TR0=1;TR1=0;ss=0;break;
case 2://一次条秒同时闪烁
case 3://两次调分同时闪烁
case 4:TR0=0;TR1=1;ss=1;break;//三次调分同时闪烁
case 5:gn=1;TR0=1;TR1=0;ss=0;bb=0;cc=0;dd=0;ck=0;break;//四次跳出调整状态时钟继续走,gn=1循环使用

实验五_外部中断控制数码管显示实验

实验五_外部中断控制数码管显示实验

实验五、外部中断控制数码管显示实验一、实验目的(1)掌握80C51扩展显示、外部中断的硬件设计和编程方法。

二、实验内容按键每按下一次,数码管循环显示0-9字符。

三、实验接线图图4-1 独立按键电路图4-2 数码块显示电路图4-3 实验接线图1、程序流程图图2-4 主程序流程图 图2-5 中断服务程序流程图2、源程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit P32=P3^2;uchar led_c[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };void delay(uint N) //N=500,延时1s ;N=5,延时10ms{uint i;while(N--) for(i=0;i<100;i++) _nop_();}void int0_s(void) interrupt 0{ uchar i; P2=0xfe;for(i=0;i<10;i++){P0=led_c[i]; delay(500); P0=0xff;} }void main(void){ SP=0x40; P0=0xff;IT0=1; EA=1; EX0=1;while(1); }1、P0口接数码显示模块的P17,P2.0接数码显示模块的P16的Q4B,独立键盘模块的P12引脚之一接P3.2;2、用keil编辑、编译程序,生成hex文件;3、用STC-ISP软件下载hex文件;4、观察程序运行时数码块显示情况。

六、实验结果七、思考题1、调整接线,并修改程序,使接收到外部中断后数码管显示00-99数字。

2、利用外部中断,控制音乐的播放。

电子时钟数码管显示

电子时钟数码管显示

/********************************************************** ***///电子时钟数码管显示,具有暂停,清零,调整时,分,秒的功能2014年8月17日/********************************************************** */#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit dula=P2^6;sbit wela=P2^7;//sbit s0=P3^2; //清零键sbit speak=P1^2; //蜂鸣器//sbit s2=P3^0; //矩阵键盘//sbit s3=P3^1;//sbit s4=P3^4; //暂停sbit s1=P3^2; //功能键sbit s2=P3^5;// 闹钟设定sbit s3=P3^3; //加sbit s4=P3^4; //减//sbit juzhen=P3^4;bit sflag,setflag,setcflag,cflag,k1,k2,k3,k4;uchar code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示数字0~9unsigned char code weima[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //unsigned char code weima[]={0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//unsigned char code weima[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb}; uchar tempdata[8];uchar miao,fen,shi,cmiao,cfen,cshi;uchar count,ncount,s1num,cnum,state,normal;//-------------------------ms级延时函数-----------------------------------------// void delayms(uint z){uint x,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}//-----------------------------蜂鸣器发声--------------------------------------------------//void buzzer(){speak=0;delayms(100);speak=1;}//---------------------闹铃声---------------------------------------------------------//void clock(){uchar i;if((shi==cnum)&&(fen==cfen)&&(miao==cmiao)){for(i=0;i<50;i++){buzzer();delayms(100);}}}//---------------------------------------定时器0初始化------------------------//void inittime0(){TMOD=0x01;EA=1;ET0=1;TR0=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;}//-------------------定时器0中断------------------------------------------------------------//void zdtime0()interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256; //定时50mscount++;ncount++;if(ncount==10){ncount=0;if(setflag==1) //每隔0.5s翻转{sflag=!sflag;}if(setcflag==1) //闹钟闪烁{cflag=!cflag;}}if(count==20) //满一秒加一{count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}}}}}//-----------------------------数码管显示------------------------------------------------------------//void display(uchar djw,uchar num){uchar i,j;for(i=0;i<num;i++){P0=0;dula=1;dula=0;P0=weima[i+djw];wela=1;wela=0;P0=tempdata[i];dula=1;dula=0;delayms(2); //延时2ms}}//--------------------------------键盘扫描函数---------------------------------------------------------//void keyscan(){if(state==normal){if(k1==1){s1=0;s1num++;if(s1num>=4){setflag=0;s1num=0;sflag=1;}}//------------------------------------------------------------------------------------//if(k2==1){s2=0;setcflag=1;cflag=1;sflag=0;cnum++;if(cnum>=4){cnum=0;cflag=0;sflag=1;}}//-----------------------------------------------------------------------------------//if(k3==1){s3=0;switch(s1num){case 1:{miao++;if(miao==60){miao=0;}}break;case 2:{fen++;if(fen==60){fen=0;}}break;case 3:{shi++;if(shi==24){shi=0;}}break;default : break; }//----------------------------------------------------------------------------------------------------------//switch(cnum) //闹钟设置时加,分加,秒加{case 1:{cmiao++;if(cmiao==60){cmiao=0;}}break;case 2:{cfen++;if(cfen==60){cfen=0;}}break;case 3:{cshi++;if(cshi==24){cshi=0;}}break;default : break;}//---------------------------------------------------------------------------------------------------------//}//---------------------------------------------------------------------------------// if(k4==1) //减键{switch(s1num) {case 1:{miao--;if(miao==-1)miao=59;}break;case 2:{fen--;if(fen==-1)fen=59;}break;case 3:{shi--;if(shi==-1)shi=23;}break;default : break;}//---------------------------------------------------------------------------------------------------//switch(cnum) //时减,分减,秒减{case 1:{cmiao--;if(cmiao==-1)cmiao=59;}break;case 2:{cfen--;if(cfen==-1)cfen=59;}break;case 3:{cshi--;if(cshi==-1)cshi=23;}break;default : break;}}}}void fuzhi(){if(state==normal){if(sflag==1){tempdata[7]=duanma[shi/10];tempdata[6]=duanma[shi%10];tempdata[5]=0x40;tempdata[4]=duanma[fen/10]; tempdata[3]=duanma[fen%10]; tempdata[2]=0x40;tempdata[1]=duanma[miao/10]; tempdata[0]=duanma[miao%10]; }if(cflag==1){tempdata[7]=duanma[cshi/10];tempdata[6]=duanma[cshi%10];tempdata[5]=0x40;tempdata[4]=duanma[cfen/10]; tempdata[3]=duanma[cfen%10]; tempdata[2]=0x40;tempdata[1]=duanma[cmiao/10]; tempdata[0]=duanma[cmiao%10]; }tempdata[2]=0x40;tempdata[5]=0x40;if (sflag==0)switch(s1num){case 1:{tempdata[0]=0;tempdata[1]=0;} break;case 2:{tempdata[3]=0;tempdata[4]=0;} break;case 3:{tempdata[7]=0;tempdata[6]=0;} break;default : break;}if (cflag==0){switch(cnum){case 1:{tempdata[0]=0;tempdata[1]=0;} break;case 2:{tempdata[3]=0;tempdata[4]=0;} break;case 3:{tempdata[7]=0;tempdata[6]=0;} break;default : break;}}}}void jian(){if(s1==0){delayms(5);if(s1==0){while(s1==0);k1=1;}}if(s2==0){delayms(5);if(s2==0){while(s2==0);k2=1;}}if(s3==0){delayms(5);if(s3==0){while(s3==0);k3=1;}}if(s4==0){delayms(5);if(s4==0){while(s4==0);k4=1;}}void model(){switch(state){case normal:{} break;}}//-------------------------------主函数---------------------------------------------------------//void main(){inittime0();//定时器0初始化s2=0;sflag=1;state=normal;while(1){// clock();keyscan();fuzhi();display(0,8);}}。

06 外部中断控制数码管的启停

06 外部中断控制数码管的启停
பைடு நூலகம்
void delay10ms(); //10ms延时函数说明
void int0(void)interrupt 0//外中断0中断服务程序 {
delay10ms(); //调用10ms延时函数 if(P3_2==0) //确认按键按下 { flag=~flag; //启停标志取反 } while(P3_2==1); //等待按键松开
}
注意: 1、函数说明应写在程序开头。 2、需要包含头文件。 若头文件用reg51.h,P3_2需要自行定 义;若头文件用at89x51.h,P3_2无需 定义。
void delay() //定义延时函数 { unsigned int i; for(i=0;i<30000;i++); } void delay10ms() //定义10ms延时函数 { uchar i,j; for(i=20;i>0;i--) //执行1次"i=20",20次"i>0"、"i--" for(j=250;j>0;j--); //执行20次"j=250",20×250次"j>0"、"j--"
任务二 按键变数
子任务一 用外部中断控制数码管的启停
一、任务分析
利用单片机外部中断0和一个按键来控制数码
管显示的启停。
二、硬件电路
三、程序设计
主程序完成中断初始化、数码管静态显示控
制工作。 中断函数实现显示启停切换。每次产生外部 中断0,显示启停切换一次。
void delay(); //延时函数说明 uchar Table_yin[10]={0x3f,0x06,0x5b, 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; char shu=0; //外部变量,数码管显示数值 bit flag=1; //外部变量,启停控制位,1时启动显示 void main( ) //主函数 { IT0=1; //外中断0下降沿触发 EA=1; //开总中断 EX0=1; //外中断0允许 while(1) // 无限循环 { while(flag) { P0=Table_yin[shu]; //P2口输出十位数的字型编码 delay(); //调用延时函数 shu++; //显示值加1 if(shu>9)shu=0; //显示值过大,清0 } } }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "unistd.h" //延时函数usleep
//定义端口
#define seg *(volatile unsigned char *) SM_SEG_BASE
#define bit *(volatile unsigned char *) SM_BIT_BASE
#include "alt_types.h" //Altera定义的数据类型
#include "sys/alt_irq.h"
//#include "sys/alt_alarm.h" //系统时钟服务头文件
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, 0x00); //清中断捕获寄存器
alt_irq_register(KEY_IRQ,0,KeyDown_ISR); //注册中断函数
}
//定时器初始化
void Timer_Init()
}
return 0;
}
}
//定时器中断服务函数
void Timer_ISR(void* context, alt_u32 id)
{
++;
if(second == 60) { min++; second = 0;}
if(min == 60) { hour++; min = 0;}
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, 0x00); //清中断捕获寄存器
}
//按键中断初始化
void KeyDown_Init()
{
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE, 0x07); //开KEY中断
void KeyDown_Init();
//变量定义
alt_u8 duan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF};
alt_u8 num[8] = {0,0,0,0,0,0,0,0};
alt_u8 second,min,hour;
num[5] = 10;
num[6] = hour % 10;
num[7] = hour / 10;
for(j=0; j<8; j++)
{
bit = ~(0x01 << j); //位选低位有效
seg = duan[num[j]];
if(key == 0x05) { min++; if(min==60) min = 0; while(key == 0x05){display();} } //分调设置
if(key == 0x03) { hour++; if(hour == 24) hour = 0; while(key == 0x03){display();} }//小时设置
}
//数码管显示函数
void display()
{
alt_u8 j;
num[0] = second % 10;
num[1] = second / 10;
num[2] = 10;
num[3] = min % 10;
num[4] = min / 10;
if(hour == 24) { hour = 0;}
if(second % 2) duan[10] = 0xff;
else duan[10] = 0xbf; //秒闪烁
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0); //清状态寄存器
//按键中断服务函数
void KeyDown_ISR(void* context, alt_u32 id)
{
if(key == 0x06) { second = 0; while(key == 0x06){display();} } //秒调设置
{
alt_irq_register(TIMER_IRQ,0,Timer_ISR); //注册中断函数
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0); //清状态标志
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE, 7); //启动定时器允许中断,连续计数
#define key *(volatile unsigned char *) KEY_BASE
//函数声明
void Timer_Init();
void Timer_ISR(void* context, alt_u32 id);
void display();
void KeyDown_ISR(void* context, alt_u32 id);
usleep(500);
}
}
//主函数
int main(void)
{
KeyDown_Init(); //按键中断初始化
Timer_Init(); //定时器初始化
while(1)
{
display(); //显示
#include "system.h" //包含基本的硬件描述信息
#include "altera_avalon_timer_regs.h" //定义内核寄存器的映射,提供对底层硬件的符号化访问
#include "altera_avalon_pio_regs.h" //包含基本的I/O口信息
相关文档
最新文档