机器周期 时钟周期 晶振频率 定时器初值计算

1 机器周期
        在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期(如单片机中“计数器”完成加1这个过程也是一个机器周期)。一般情况下,一个机器周期由若干个S周期(时钟周期)组成。通常用内存中读取一个指令字的最短时间来规定CPU周期,(也就是 计算机通过内部或外部总线进行一次信息传输从而完成一个或几个微操作所需要的时间)),它一般由12个时钟周期组成。

2 时钟周期
        时钟周期=1秒/晶振频率,晶振频率的值即为时钟频率的值。因此单片机的机器周期=12秒/晶振频率。

3 晶振频率
        单片机开发板、学习板成型之时相应的晶振频率也已经被确定了。51单片机常用的晶振频率有11.059 2MHz、12MHz或其它值,^-^。

4 定时器初值计算
        定时器一旦被启动,它就会在原来初值的基础之上加1,当计满时重新归0。51单片机的定时器寄存器为16位,假设此51单片机的晶振频率为12MHZ,则根据机器周期概念及机器周期、时钟周期、晶振频率关系可知机器周期(即计数一次的时间)= 12 * (1 / 12MHZ) = 1us。这就表明,此51单片机的定时寄存器实现加1操作这个过程将要花1us的时间[ “计数这个硬件结构”达到加1的结果需要12个脉冲(或高电平) 么 ],如果此16位寄存器从0开始计数,则计到此寄存器下次为0时需要计2的16次方(65536)个数(计满只需要65535个数),所以定时器一次最多可以计时65536us。

        如果现在需要定时器每次定时时间T少于65536us,则需要给定时器寄存器设一个初值N。根据计m个数就对应m us可得 N = (65536 - T)。得到的N值就是需要装入定时器寄存器的值。

        咱们的51单片机定时器寄存器为16位,分高8位THn和低8位TLn(n=0, 1, 2).....,一般咱还得以8位为单位进行装值。将高8位THn装入N / 256(取模),将低8位TLn装入 N % 256即可,这两种运算得到的结果都是10进制的,将得到的值换算为二进制(或16)再装入高、低8位。得到定时器初值计算公式:

THn = (65536 - T) / 256

TLn = (65536 - T) % 256

其中THn,TLn表示响应定时器寄存器的高低8位。T表示需要被定时的微秒数, ‘/’表示取模运算, ‘%’表示取余运算

转载:(51条消息) 51 机器周期 时钟周期 晶振频率 定时器初值计算 [李园7舍_404]_文字篇章-CSDN博客

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于单片机的简易电子时钟设计 一 功能分析 1).时制式为24小时制。 2).采用LED数码管显示时、分,秒采用数字显示。 3).具有方便的时间调校功能。 4).计时稳定度高,可精确校正计时精度。 二 总体方案设计论证比较 2.1 实现时钟计时的基本方法 利用MCS-51系列单片机的可编程定时/计数器、中断系统来实现时钟计数。 (1) 计数初值计算: 把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位 秒,而100次计数可用软件方法实现。 假设使用T/C0,方式1,50ms定时,fosc=12MHz。 则初值X满足(216-X)×1/12MHz×12μs =50000μs X=15536 0011110010110000 3CB0H (2) 采用中断方式进行溢出次数累计,计满20次为秒计时(1秒); (3) 从秒到分和从分到时的计时是通过累加和数值比较实现。 2.2 电子钟的时间显示 电子钟的时钟时间在六位数码管上进行显示,因此,在内部RAM中设置显示缓冲区共 8个单元。 LED8 LED7 LED6 LED5 LED4 LED3 LED2 LED1 37H 36H 35H 34H 33H 32H 31H 30H 时十位 时个位 分隔 分十位 分个位 分隔 秒十位 秒个位 2.3 电子钟的时间调整 电子钟设置3个按键通过程序控制来完成电子钟的时间调整。 A键调整时; B键调整分; C键复位 2.4 总体方案介绍 2.4.1 计时方案 利用AT89S51单片机内部的定时/计数器进行中断时,配合软件延时实现时、分、秒的 计时。该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得 到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课 程起到一定的作用。 2.4.2 控制方案 AT89S51的P0口和P2口外接由八个LED数码管(LED8~LED1)构成的显示器,用P0口作L ED的段码输出口,P2口作八个LED数码管的位控输出线,P1口外接四个按键A、B、C构成 键盘电路。 AT89S51 是一种低功耗,高性能的CMOS 8位微型计算机。它带有8K Flash 可编程和擦除的只读存储器(EPROM),该器件采用ATMEL的高密度非易失性存储器技术 制造,与工业上标准的80C51和80C52的指令系统及引脚兼容,片内Flash 集成在一个芯片上,可用与解决复杂的问题,且成本较低。简易电子钟的功能不复杂, 采用其现有的I/O便可完成,所以本设计中采用此的设计方案。 三 硬件电路设计 根据以上的电子时钟的设计要求可以分为以下的几个硬件电路模块:单片机模块、数 码显示模块与按键模块,模块之间的关系图如下面得方框电路图1所示。 图1 硬件电路方框图 四 各模块电路设计 4.1.1 芯片分析 AT89C51单片机引脚图如下: 图2 AT89C51引脚图 MCS-51单片机是标准的40引脚双列直插式集成电路芯片,其各引脚功能如下: VCC:+5V电源。 VSS:接地。 RST:复位信号。当输入的复位信号延续两个机器周期以上的高电平时即为有效,用 完成单片机的复位初始化操作。 XTAL1和XTAL2:外接体引线端。当使用芯片内部时钟时,此二引线端用于外接石英 体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。 P0口:P0口为一个8位漏极开路双向I/O口,当作输出口使用时,必须接上拉电阻才能 有高电平输出;当作输入口使用时,必须先向电路中的锁存器写入"1",使FET截止,以 避免锁存器为"0"状态时对引脚读入的干扰。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,它不再需要多路转接电路MUX ;因此它作为输出口使用时,无需再外接上拉电阻,当作为输入口使用时,同样也需先 向其锁存器写"1",使输出驱动电路的FET截止。 P2口:P2口电路比P1口电路多了一个多路转接电路MUX,这又正好与P0口一样。P2口 可以作为通用的I/O口使用,这时多路转接电路开关倒向锁丰存器Q端。 P3口:P3口特点在于,为适应引脚信号第二功能的需要,增加了第二功能控制逻辑。 当作为I/O口使用时,第二功能信号引线应保持高电平,与非门开通,以维持从锁存器到 输出端数据输出通路的畅通。当输出第二功能信号时,该位应应置"1",使与非门对第二 功能信号的输出是畅通的,从而实现第二功能信号的输出,具体第二功能如表1所示。 4.1.2 电路 右图所示为时钟电路原理图,在AT89S51芯片内部有一个高增益反相放大器,其输入 端为芯片引脚XTAL1,输出端为引脚XTAL2。而在芯片内部,XTAL1和XTAL2之间跨接荡器和微调电容,从而构成一个稳定的自激荡器。时钟电路产生的荡脉冲经
LCD1602液显示DS1302时钟实验例程C51单片机KEIL工程源码文件: void main (void) { unsigned char i; unsigned char temp[16];//定义显示区域临时存储数组 LCD_Init(); //初始化液 DelayMs(20); //延时有助于稳定 LCD_Clear(); //清屏 Init_Timer0(); //定时器0初始化 Ds1302_Init(); //ds1302初始化 UART_Init(); //串口初始化 Ds1302_Read_Time(); //首次读取时间 if((time_buf1[2]+time_buf1[7])==0) //如果所有参数都为0,写入一个初始值 Ds1302_Write_Time(); while (1) //主循环 { if(SetFlag) //如果接收到串口信息则更新时钟 { for(i=0;i<8;i++) { time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//数据整合,如2个数 1和5整合成15 } Ds1302_Write_Time();//接收更新的时间然后写入ds1302 SetFlag=0; //时钟信息更新后标志位清零 } if(ReadTimeFlag==1) //定时读取ds1302 定时时间到 则标志位置1,处理过时间参数标志位清零 { ReadTimeFlag=0; //标志位清零 Ds1302_Read_Time();//读取时间参数 sprintf(temp,"DATE %02d-%02d-%02d %d",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],(int)time_buf1[7]);//年月日周 LCD_Write_String(0,0,temp);//显示第一行 sprintf(temp,"TIME %02d:%02d:%02d",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6]);//时分秒 LCD_Write_String(0,1,temp);//显示第二行 } } } /*------------------------------------------------ 串口通讯初始化 ------------------------------------------------*/ void UART_Init(void) { SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装 TH1 = 0xFD; // TH1: 重装值 9600 波特率 11.0592MHz TR1 = 1; // TR1: timer 1 打开 EA = 1; //打开总中断 ES = 1; //打开串口中断 } /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值 //TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } /*-----------------------------------------------
单片机电子时钟设计 摘 要 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注, 应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低 廉、可靠性高、灵活性好、开发较为容易。由于具有上述优点,在我国,单片机已广泛 地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体 化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。这次毕业 设计通过对它的学习、应用,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易 的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,调整时间,从而 到达学习、设计、开发软、硬件的能力。 关键词:单片机 AT89S51 电子时钟 数码管 1. 前言 时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不 断发展,人们对时间计量的精度要求越来越高,应用越来越广。怎样让时钟更好的为人 民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。 现今,高精度的计时工具大多数都使用了石英荡器,由于电子钟,石英表,石 英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数 字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替显示器代替指针 显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以 进行时和分的校对,片选的灵活性好。 时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个 单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准荡定时 信号,主要由和外围电路组成,频率的大小决定了单片机系统工作的快慢;二 是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即 用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高 的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种 方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。 本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机A T89S51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。 2. 方案论证与比较 2.1数字时钟方案 数字时钟是本设计的最主要的部分。根据需要,可利用两种方案实现。 方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。该芯片内部采用石英荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以 用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突 发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,系统自 动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证 芯片的正常运行,以备随时提供正确的时间。 方案二:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节 分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次 中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1 ;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。 该方案具有硬件电路简单的特点。但由于每次执行程序时,定时器都要重新赋初值,所 以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将 不工作。 基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。 2.2数码管显示方案 方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极 管恒定的导通或截止。该方式每一位都需要一个8 位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示 的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。 方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每 一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须 保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间 与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口, 降低了能耗。 从节省I/O口和降低能耗出发,本设计采用方案二。 3. 系统设计 3.1总体设计 3.1.1系统说明 利用单片机(AT89S51)制作简易电子时钟,由六个LED数码管分别显示小时十位、小 时个位、分钟十位、分钟个位、秒钟十位、秒钟个位。6个PNP管(9012)分别控制六个 数码管的亮灭,一个按键用于
显示时间 通过dofly自带的串口调试软件,打开串口,波特率默认9600,点击更新时间即可,如果不行,按下开发板复位重新更新 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include #include "ds1302.h" #include "delay.h" #include "1602.h" bit ReadTimeFlag;//定义读时间标志 bit SetFlag; //更新时间标志位 unsigned char time_buf2[16]; void Init_Timer0(void);//定时器初始化 void UART_Init(void); /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned char i; unsigned char temp[16];//定义显示区域临时存储数组 LCD_Init(); //初始化液 DelayMs(20); //延时有助于稳定 LCD_Clear(); //清屏 Init_Timer0(); //定时器0初始化 Ds1302_Init(); //ds1302初始化 UART_Init(); //串口初始化 Ds1302_Read_Time(); //首次读取时间 if((time_buf1[2]+time_buf1[7])==0) //如果所有参数都为0,写入一个初始值 Ds1302_Write_Time(); while (1) //主循环 { if(SetFlag) //如果接收到串口信息则更新时钟 { for(i=0;i<8;i++) { time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//数据整合,如2个数 1和5整合成15 } Ds1302_Write_Time();//接收更新的时间然后写入ds1302 SetFlag=0; //时钟信息更新后标志位清零 } if(ReadTimeFlag==1) //定时读取ds1302 定时时间到 则标志位置1,处理过时间参数标志位清零 { ReadTimeFlag=0; //标志位清零 Ds1302_Read_Time();//读取时间参数 sprintf(temp,"DATE d-d-d %d",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],(int)time_buf1[7]);//年月日周 LCD_Write_String(0,0,temp);//显示第一行 sprintf(temp,"TIME d:d:d",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6]);//时分秒 LCD_Write_String(0,1,temp);//显示第二行 } } } /*------------------------------------------------ 串口通讯初始化 ------------------------------------------------*/ void UART_Init(void) { SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装 TH1 = 0xFD; // TH1: 重装值 9600 波特率 11.0592MHz TR1 = 1; // TR1: timer 1 打开 EA = 1; //打开总中断 ES = 1; //打开串口中断 } /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值 //TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } /*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 { static unsigned int num; TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%256; num++; if(num==50) //大致100ms { num=0; ReadTimeFlag=1; //读标志位置1 } } /*------------------------------------------------ 串口中断程序 ------------------------------------------------*/ void UART_SER (void) interrupt 4 //串行中断服务程序 { unsigned char Temp; //定义临时变量 unsigned char i; if(RI) //判断是接收中断产生 { RI=0; //标志位清零 Temp=SBUF; //读入缓冲区的值 time_buf2[i]=Temp&0x0F; i++; if(i==16) //连续接收16个字符信息 { i=0; SetFlag=1; //接收完成标志位置1 } SBUF=Temp; //把接收到的值再发回电脑端 } if(TI) //如果是发送标志位,清零 TI=0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值