新手刚刚学C52单片机定时器中断,请问定时器0和定时器1(波特率如何同时工作,求源码参考

STC89C52单片机定时器1实现计数器
&///////////////////////////////////////////////////////////////////////////
&实现功能:&
配置定时器1的相关寄存器,使其实现定时器中断功能,然后通过在数码
&实验板型号:BS-XYD-C52
&实验名称:& 定时器1实现计数器
&编写人:& 谢应东
&编写日期:&
&///////////////////////////////////////////////////////////////////////////
#include&reg52.h&&&
#define uchar unsigned char &//定义unsigned char 为
#define uint& unsigned
int&&//定义unsigned int 为 uint
cTime_10ms_&&//中断次数计数单元
cTime_1s_&&&&//判断是否为1s的变量
uDis_buff[2];&&&&//显示缓冲区,存放要显示的2个字符的段码值
cT&&&&&//秒计数单元
#define Time_1s_Sign
100&&//根据中断周期,判断是否到一秒的标志
Duan=P2^6;&&&&&//定义数码管的段选使能端
=P2^7;&&&&&&&
//定义数码管的位选使能端
#define Digital_tube_Wei_Enable
Wei=1;&&//开启控制数码管的位选使能端
#define Digital_tube_Wei_Disable
Wei=0;&&&&
//关闭控制数码管的位选使能端
#define Digital_tube_Duan_Enable
Duan=1;&//开启控制数码管的段选使能端
#define Digital_tube_Duan_Disable
Duan=0;&//关闭控制数码管的段选使能端
#define Digital_tube_Duan
//定义数码管数据端口
uchar code
Dis_table[]=&&&&&
//将BCD码转换成数码管扫描码的数组
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
uchar code
Dis_Position[]=&&//定义数码管位选的数组
{0x3e,0x3d,0x3b,0x37,0x1f,0x2f};
&///////////////////////////////////////////////////////////////////////////
函数名称:毫秒延时函数
函数功能:实现毫秒级的延时
参数介绍:Delay_MS: 定义需要延时的毫秒的数值
iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
&&& iValue:
要延时毫秒所要进行的循环数值,本数值为实际测得
返回值:& 无
注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
式完成,所以如果改变了晶振的频率,请做相应的改变
&///////////////////////////////////////////////////////////////////////////
void DelayMs(uint Delay_MS)
&uint iNumber,iV
&for(iNumber=0;iNumber&Delay_MS;iNumber++)&&&
//用for语句实现单片机的延时
iValue=107;&&&&&
//107这个数值是通过测定而得
while(iValue--);
&///////////////////////////////////////////////////////////////////////////
函数名称:One_DigitalTube_display
函数功能:完成在实验板上数码管指定显示,即在特定的数码管上显示特定的数字,比
在第一个数码管上显示0
参数介绍:uData:要显示的数字的BCD码数组
uNumber:选择哪个数码管显示,即让某个特定数码管显示
返回值:& 无
注意事项:实验板上的数码管是共阴极的数码管,如果使用共阳极的数码管,请注意不
&///////////////////////////////////////////////////////////////////////////
void One_DigitalTube_display(uchar uData,uchar uNumber)
Digital_tube_Duan_E&&&&&
//使能数码管的段选
Digital_tube_Duan=Dis_table[uData];//输入所要显示的数值
Digital_tube_Duan_D&&&&&
//关闭数码管的段选
& Digital_tube_Duan=Dis_Position[uNumber];
//点亮特定的数码管&
Digital_tube_Wei_E&&&&&
//使能数码管的位选
Digital_tube_Wei_D&&&&&
//关闭数码管的位选
DelayMs(5);&&&&&&&&
//调整时序,以实现稳定显示
&///////////////////////////////////////////////////////////////////////////
函数名称:Time_to_disbuffer
函数功能:把要在数码管上显示的数值,进行取余、取整,即对数值进行分割,这样以
便显示在分离的数码管
参数介绍:无
返回值:& 无
注意事项:无
&///////////////////////////////////////////////////////////////////////////
void Time_to_disbuffer()
&uDis_buff[1]=cT&&&//对cTime的数值取余,即就是取cTime的个位
&uDis_buff[0]=cTime/10;&&&//对cTime的数值取整,即就是取cTime的十位
&///////////////////////////////////////////////////////////////////////////
函数名称:Init_time1
函数功能:配置定时器1,配置的模式是定时器1采用16位定时器模式,在定时器1的输入
数值寄存器输入特定的数值,使其每次中断的周期为10ms,同时允许定时器1
中断,并打开总中断
参数介绍:无
返回值:& 无
注意事项:无
&///////////////////////////////////////////////////////////////////////////
void Init_time1(void)
&TMOD |= 0x10;&&
&&TH1=()/256;&&
&&TL1=()%6;&
//定时器0的,写入数值寄存器的低8位
EA=1;&&&&&&&&&&&&
//总中断打开
&&ET1=1;&&&&&&&&&&&
//定时器T0允许中断
&&TR1=1;&&&&&&&&&&&
//定时器T0开始工作
&///////////////////////////////////////////////////////////////////////////
函数名称:Timer_Display
函数功能:把显示缓冲区的数值显示在数码管上
参数介绍:cNumber:记录for语句的循环次数
返回值:& 无
注意事项:无
&///////////////////////////////////////////////////////////////////////////
void Timer_Display()
&& uchar cN
for(cNumber=0;cNumber&2;cNumber++)
&&One_DigitalTube_display(uDis_buff[cNumber],cNumber);
&&DelayMs(2);
&///////////////////////////////////////////////////////////////////////////
函数名称:main
函数功能:利用定时器1中断,在数码管上实现以一分钟为周期的计数器
参数介绍:无
返回值:& 无
注意事项:无
&///////////////////////////////////////////////////////////////////////////
void main()
Init_time1();&&&&
//初始化定时器1
cTime=0;&&&&
&&if(cTime_1s_ok)
&&&cTime_1s_ok=0;
&&&if(++cTime&=60)&&&&
//每次自加一,同时判断是否到1分钟
&&&&cTime=0;
&&&Time_to_disbuffer();&&
//新调整好的时间送入显示缓冲区
&&Timer_Display();&&&&&
//更新显示内容
&///////////////////////////////////////////////////////////////////////////
函数名称:Interrupt_handler_time1
函数功能:重新给寄存器TH1和TL1赋值,判断是否到达一秒,如果到一秒了,把相应的
变量赋予正值,以方便其他的程序编写
参数介绍:无
返回值:& 无
注意事项:无
&///////////////////////////////////////////////////////////////////////////
void Interrupt_handler_time1(void) interrupt 3
&&TH1=()/256;//定时10毫秒
&TL1=()%6;
&cTime_10ms_counter++;
&if(cTime_10ms_counter==Time_1s_Sign)
//判断是否到达一秒
&&cTime_10ms_counter=0;
&&cTime_1s_ok=1;&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
AT89C52单片机介绍
下载积分:0
内容提示:AT89C52单片机介绍
文档格式:DOC|
浏览次数:1285|
上传日期: 11:14:12|
文档星级:
全文阅读已结束,此文档免费下载
下载此文档
阅读此文档的用户还读了
AT89C52单片机介绍
官方公共微信捷配欢迎您!
微信扫一扫关注我们
当前位置:&>>&&>>&&>>&STC单片机波特率自适应方法
  摘要:为了缩小电路体积、降低硬件成本,同时又保证串口稳定可靠通信,采用的一种波特率自适应方法,该方法充分利用STC运行速度快、拥有片内、片内资源丰富的特点,在串行通信程序中,利用单片机I/O口和,对主机发送的固定字符进行测量、计算,得到合适的波特率常数,从而实现波特率自适应。给出了设计原理、实现方法、误差分析、流程图和部分程序,并通过应用实例验证该方法切实可行。
  0 引言
  串口RS 232是工业控制、、计算机外设常用的一种通信协议。串口通信的波特率一般都是选取标准系列值,并要求通信双方严格遵循相同的波特率,实际应用中,一台设备往往要与多种其他设备联络,为适应各种不同设备的通信速度,就要求该设备能适应不同的波特率,实现这种要求的常见方法有两种,一是增加波特率选择,二是设计能自动适应各种常见通信速度的串口。第一种方法增加了硬件,同时针对不同对象需要重新设置开关,在不清楚对方波特率的情况下还无法使用。第二种方法采用软硬件结合,通过检测、计算,自动选择正确的波特率,实际使用极其方便。
  自适应波特率串口的实现方法通常有以下几种:
  (1)协议约定通信开始时主机固定发送1 个字符,从机以不同的波特率试探接收,当接收到的数据与约定相同时,确定该波特率即是正确的通信波特率。
  (2)协议约定通信开始时主机发送1 串字符,从机以某固定波特率接收,然后通过软件分析接收到的数据,计算出接收数据与发送数据之间的倍数关系,从而确定正确的波特率。
  (3)协议约定通信开始时主机固定发送1 个字符,从机用单片机定时器检测RXD 上的信号宽度,通过计算来确定主机的波特率。
  以上3 种方法,第一种由于需要多次试探,效率很低;第二种计算量过大,不适合单片机处理;第三种方式单片机有现成的定时器资源,计算也相对简单,所以优选这种。
  要测量脉冲宽度,前提是单片机的时钟信号必须稳定。目前很多STC单片机可选外接时钟或片内RC振荡时钟,片内RC振荡时钟省去了外部的等元件,成本降低、电路板的体积也可以缩小,这对成本及体积敏感的应用很具优势。但选用片内RC振荡时,频率会有±15%左右的误差,频率的稳定性也比外接晶振要差,按理论计算值设置波特率参数,无法保证可靠的通信,但按以上自适应波特率串口的第三种方法,每次通信前实测、计算、确定波特率常数,就可以实现稳定可靠的通信,这样充分利用了STC单片机的优势。
  1 STC 单片机的特点
  标准51 芯片由于定时器最高分辨率只有1 μs,对于较高的通信波特率来说,测量精度不够,导致计算值不准,无法正常工作。STC系列单片机是在标准51单片机基础上发展起来的,它增加了很多实用的接口电路,扩大了时钟的频率范围,设计出了1T 时钟的芯片,可以通过软件对系统时钟分频,并提供了片内RC振荡时钟,在目前51芯片的市场占有极大的份额。STC系列单片机采用片内RC振荡时钟、自适应波特率串口通信技术,可以广泛地应用于分布式控制、智能仪表、通信等行业。
  2 自适应工作原理
  STC 单片机采用异步通信,UART 工作于模式1(8位UART,波特率可变),用定时计数器2做波特率发生器,工作于模式2(8位自动重装模式),主从机按图1方式连接,从机自适应主机的波特率。
  自适应过程由主机发送联络字符开始。为了使从机获得最大的测量脉宽,提高测量精度,由主机发送二进制“0”.如图2所示,二进制“0”由1位起始位,8位数据位(低位在先)及1位停止位构成,其中1位起始位和8位数据位全为0,所以低电平的宽度为9 b.
  从机查询RXD引脚的电平,检测到低电平后就启动定时器0开始计时,再检测到高电平就停止定时器0计时,根据定时器0的定时值就可以计算出主机的波特率。
  当时钟分频寄存器CLK_DIV=0(不分频),特殊功能寄存器AUXR=0xC0(T0 用1T 时钟),则:
  而STC51 系列单片机在UART 模式1,时钟模式为1T 时,其波特率公式为:
  从机UART在模式1下,将式(4)或式(6)计算结果作为定时器1重装值,设定通信参数,通过串口回送应答信号给主机。主机如正确接收到从机回送的信号,就说明从机已完成波特率自适应,可以开始正常通信了。
  3 误差分析
  为保证可靠通信,要求通信双方的波特率相对误差小于2.5%.
  在自适应波特率校准系统中,误差主要来自两个方面,一是定时器T0 启动和停止滞后造成的误差ΔT0;二是波特率发生器T1 本身固有的一个机器周期误差ΔT1 = ±1.由于STC51单片机采用1T 时钟定时,ΔT0 误差只有标准51系列芯片的1 12,系统误差主要由ΔT1 决定。
  以为例,当采用片内RC振荡,时钟频率通常在5.2~6.9 MHz 之间。当时钟频率为5.2 MHz,SMOD=1时,UART时钟分别按12T,1T 计算,见表1,表2.
  表1、表2中加粗部分表示可以选用的波特率值,由表1、表2可知,只要编程时选择合适的时钟,在5.2 MHz时钟频率下,波特率可以在300~115 200 b/s 之间实现自适应,由T1 取整带来的误差在0.5%以内。当系统时钟为6.9 MHz时,用同样的方法计算,也可以证明波特率可以在300~115 200 b/s 之间实现自适应,由T1 取整带来的误差也在0.5%以内。由此可见,STC12C5620采用片内RC振荡,可以在300~115 200 b/s之间完成波特率自适应,实现稳定可靠的通信。
  4 软件流程与程序
  主机软件流程图如图3所示,从机软件流程图如图4所示。
  以下为C51波特率自适应程序:
  5 应用实例
  采用STC12C5620 设计的重力检测开关,如图5 所示。为降低成本、缩小体积,采用了片内RC振荡,不设按键及显示。重力检测开关首次工作前需设定一些参数,并校准。由于没有键盘及显示,采用和计算机联机设置、校准。本电路采用了上述的自适应波特率工作方式,由PC机作主机,通过串口来初始化重力检测开关的各参数。
  设置时,将重力检测开关与计算机之间用RS 232线连接好,然后点击PC机软件界面上的“连接串口”按钮进行波特率自适应,当界面上状态栏提示“连接串口成功!”时,表示波特率自适应工作正确完成, 如图6所示,可以进行参数设置和校准操作。设置、校准后,重力检测开关就可脱机正常工作了。
  经反复验证,该电路在300~115 200 b/s 波特率范围内可稳定通信工作。
  6 结语
  该波特率自适应方法,可扩展应用于其他单片机系统,解决对方的波特率未知、或对方的波特率有偏差而无法正常通信的问题,即使对方的波特率不是标准值也可正常工作,具有较大的实用价值。(作者:赵培宇)
技术资料出处:电子爱好者博客
该文章仅供学习参考使用,版权归作者所有。
因本网站内容较多,未能及时联系上的作者,请按本网站显示的方式与我们联系。
【】【】【】【】
上一篇:下一篇:
本文已有(0)篇评论
发表技术资料评论,请使用文明用语
字符数不能超过255
暂且没有评论!
12345678910
12345678910
虽然Cortex-M处理器家族目标瞄准效能光谱较低端的区域,但是和大多数微控制器(MCU)采用的其他典型处理器相比,Cortex-M的效能依然算相当强悍。举例来说,像是许多高效能微控制器所采用的Cortex-M4与Cortex-M7处理器,其最高时脉频率就高达400MHz。当...[][][][][][][][][][]
IC热门型号
IC现货型号
推荐电子百科电源网牵头联合芯派实验室和是德科技联手为电源网网友提供的福利...
2017慕尼黑上海电子展在即,跟电源网一起去看展。...
2017年慕尼黑上海电子展,AOS万国半导体专题报道。...
牛逼1000帖
宁波江北华瑞电子有限公司
深圳麦格米特电气股份有限公司
最新技术探讨
是德产品,全球同步推广——买一送一,将优惠进行到底;...
会议主题:英飞凌在EV Charger应用中的一站式解决方案
会议时间:
主讲嘉宾:
报名人数:600人
会议主题:中国工程师巡回培训会-成都站
会议时间:
会议地点:成都安悦·原舍酒店
报名人数:182
新人必看 单片机定时器工作模式简要介绍
来源:电源网综合
作者:柚子
相信使用过单片机定时器进行程序设置的工程师都知道,我们平时所使用的定时器都有4种工作模式。在模式0、1和2时,T0和T1的工作模式相同。在模式3时,两个定时器的工作模式不同。下面我们将会就单片机定时器的这几种工作模式,进行简要介绍和分析。
首先我们来看一下单片机定时器处于工作模式0状态下的工作情况。当定时器处于该模式下时,由TL0的低5位和TH0的全部8位共同构成一个13位的定时器。定时器启动后,定时或计数脉冲个数加到TL0上,从预先设置的初值开始累加,不断递增1。当TL0计满后,向TH0进位,直到13位寄存器计满溢出。溢出时,定时器硬件会自动地把13位的寄存器值清0,中断标记TF0置1。如果需要进一步定时,需要使用相关指令重置时间常数,并把定时器的中断标记TF0置0。工作模式0的结构如下图图1所示。
接下来我们再来看一下定时器处于工作模式1时的工作情况。当单片机定时器处于该模式下运行工作时,其裕兴状态与模式0几乎完全相同,唯一的区别就是,模式1中的寄存器TH0和TL0共同构成的是一个16位定时器来参与操作,因此比模式0中的定时/计数范围更大。工作模式1的结构如下图图2所示:
单片机定时器的第三种常见工作模式,就是工作模式2。通常在工作中,这种工作模式又称为自动再装入预置数模式。当定时器/计数器的寄存器TH0/TL0的值溢出时,定时器硬件设备会自动把寄存器TH0/TL0的值清0,以重新开始操作。但是有时候,我们的定时操作是需要多次重复定时的,如果溢出时不做任何处理,那么,在第二轮定时时就是从0开始定时了,而这并不是我们想要的。所以,要保证每次溢出之后,在重新开始定时的操作是我们想要的,那就要把预置数(时间常数)重新装入某个地方。而重新装入预置数的操作是硬件设备自动完成的,不需要人工干预所以,这种工作模式就叫自动再装入预置数方式。既然需要重新装入预置数,那么预置数就必须要存放在某个地方,才能保证重装操作成功。在工作模式2中,把自动重装入的预置数存放在定时器的寄存器的高8位中,也就是存放在TH0中,而只留下TL0参与定时/计数操作。显然,定时的方位小了很多。
在这里需要大家注意的一个问题是,这种工作模式2在实际应用中常常被用于波特率发生器,也就是串口通讯中,T1工作在串口模式2。用于这种方式时,定时器就是为了提供一个时间基准。计数溢出之后,不需要做太多的事情,只做一件事就可以,就是重新装入预置数,再开始重新计数,而且中间不需要任何延时。工作模式2的结构如下图图3所示:
最后我们来看一下单片机定时器的最后一种工作模式,也就是工作模式3。由于定时器T1没有工作模式3,如果把定时器T0设置为工作模式3,那么TL0和TH0将被分割成两个相互独立的8位定时器。工作模式3的具体结构如上图图4所示。
申请条件:企业邮箱注册
申请条件:企业邮箱注册
热门职位平均薪酬职位数
16-01-11 09:20
15-12-10 09:25
15-12-03 09:37
15-11-26 09:41
15-11-19 09:25
电源网牵头联合芯派实验室和是德科技联手为电源网网友提供的福利活动—即“免费带你走进国内最权威的CNAS&ILAC认证实验室—西安功率器件测试应用中心”活动圆满举办成功。
<font color="#17年电源网工程师巡回培训会-广州站于7月2日召开,会议共计7个议题有近200的工程师到场参与,陶显芳陶老师分享了关于"EMI传导干扰滤波电路的设计“议题,将现场工程师交流推向了高潮!
EMI预一致性测试和调试是工程师在设计中不可回避的问题。在实际测试中,最大的挑战就是一次性很难通过昂贵的EMI一致性测试。迅速调试EMI,一次通过EMI并优化测试流程成为我们展示给大家的一个完美方案!
<font color="#16年5月24日是泰克科技的一个大日子,这一天是它70岁的生日,也是一次重要的品牌战略转型的日子,同时,泰克2016年度创新论坛(TIF 2016)也在这一天拉开帷幕。
中国电子银行网最新梳理的一周安全要问中,特别提到..
做芯片设计肯定有野心自己做一款处理器,无论市面上..
在各种单片机应用系统中,芯片存储器的正常与否直接..
UC3842是目前仍在使用的高性能电源处理芯片之一,由..
UC3842是目前电路当中仍拥有高度使用率的电源控制芯..
2017慕尼黑上海电子展
关于电源网
我们的服务
服务时间:周一至周五9:00-18:00
免费技术研讨会
获取一手干货分享
电源网版权
增值电信业务经营许可证:津B2-
网博互动旗下网站:

我要回帖

更多关于 单片机定时器中断程序 的文章

 

随机推荐