历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2021年12月24日 | 51单片机系列——定时器T0、T1怎么用

2021-12-24 来源:eefocus

实例一:方波发生器

源码如下:

main.c


#include

sbit Square=P1^5; //设置方波输出引脚P1^5

void main(void){

 TMOD=0x02; //配置TMOD:定时器,工作方式2(自动重装初值)

 TH0=0x06;  //方式2,预装值

 TL0=0x06; //方式2,计数器

 IE=0x82;  //配置IE:中断允许/*也可以位操作,写成EA=1,ET0=1*/

 TR0=1;   //配置TCON:位操作,T0的中断标志位

 while(1); //死循环,等待中断

}

//这里没有其他中断服务程序,因此没有配置IP中断优先级

void time0_int(void) interrupt 1{ //定时器中断服务程序

 Square=!Square; 

}


结构图如下:

上面是一个很简单的例子,但由此我们可以归纳出定时器的使用方法和步骤:

1、初始化定时器

(1)配置TMOD,TMOD的作用如下

(2)设定THx、TLx的值。需要注意的是除了在工作方式2外。其他的工作方式下,这两个值要在定时器的中断服务函数中重新装入。

(3)设置IP,即中断优先级(不需要的话就不用设置的)

(4)开中断:总中断允许和定时器T0/T1的中断允许

(5)打开定时器的中断标志位TRx(直接位操作即可)

这样就完成了定时器的初始化,接下来写一下中断服务程序即可


下面再讲两个实例:

实例二:PWM调直流电机速度

仿真图:图中K1是加速键,K2是减速键

代码如下:


//控制直流电机转速


#include

#define uint unsigned int

sbit Power=P1^0; //启停控制,Power=0电源断开,Power=1电源接通

sbit JiaSu=P1^1; //加速键

sbit JianSu=P1^2; //减速键


unsigned char PWMH; //高电平保持时间(以定时器定时时间的倍数计算)

unsigned char PWM; //PWM的整个周期(也已定时器定时时间的倍数计算)

unsigned char Counter; //定时器定时时间计数器


void INTT0() interrupt 1{  //每溢出一次来判断一次

 Counter++; //计数值加1

 if((Counter!=PWMH)&&(Counter==PWM)){//不在PWMH高电平时间,并且一个PWM的周期也到了

  Counter=1; //计数值复位

  Power=1; //开电源进入下一个PWM的周期,拉高电平 

 }else if(Counter==PWMH){ //高电平时间结束了,拉低电平关电源不供电

  Power=0;

 }

}


void main(void){

 PWMH=0x04; //设一个高电平的保持时间4/15(暂时定为2倍定时时间)

 Counter=0x01; //定时时间计数值,设初值为1

 PWM=0x15; //一个脉冲周期,暂定15倍定时时间

 TMOD=0x02; //定时器0在模式2下工作

 TL0=256-200;

 TH0=256-200;//200us产生一次溢出,即200us为一个定时时间

 ET0=1; //开定时器0中断使能

 EA=1; //开总中断使能

 TR0=1; //开始计时,定时器的中断标志位

 while(1){

  if(JiaSu==0){

     PWMH++; //扫描按键K1 ,加速

   while(!JiaSu); //这个很重要,判断开关是否断开 

  }

  if(JianSu==0){

     PWMH--; //扫描按键K2 ,减速

   while(!JianSu); //这个很重要,判断开关是否断开 

  }

 } 

}


这个自己运行一下仿真就知道啦!!!


实例三:PWM控制LED模仿呼吸灯(这个是我从普中上搬下来的,勿喷啦)

代码如下:


#include

#define uint unsigned int

#define uchar unsigned char

sbit PWM=P2^1; //定义使用的IO口

bit DIR; //用于改变方向的,1:PWM高电平延长;0:PWM高电平减短

uint count,value,timer1; //count:起到计数(一个缓冲的作用,延时一段时间在让value与timer1比较) timer1:整个PWM的周期  value:起到一个PWM波高低点交替点的作用,与timer1比较:timer1

void Time1Init(){

 TMOD|=0x10; //选择定时器1模式,工作方式1,仅用TR1打开启动

 TH1=0xFF;

 TL1=0xFF; //1us

 ET1=1; //打开定时器1中断允许

 EA=1; //开总中断

 TR1=1; //打开定时器

}


void main(){

 Time1Init(); //定时器1初始化

 while(1){

  if(count>100){

   count=0;

   if(DIR==1){

    value++;

   }

   if(DIR==0){

    value--;

   }

  }

  if(value==1000){

   DIR=0;

  }

  if(value==0){

   DIR=1;

  }

  if(timer1>1000) {//PWM周期为1000*1us

   timer1=0;

  }

  if(timer1   PWM=1;

  }else{

   PWM=0;

  }

 }

}


void Time1(void) interrupt 3

{

 TH1=0xFF;

 TL1=0xFF; //1us,重装初值

 timer1++;

 count++;

}


运行一下,就能看出仿真结果,但我觉得这个仿真的结果不是很好,还不如看一下它示波器的变化。

推荐阅读

史海拾趣

Curtis Electromusic Specialties Inc公司的发展小趣事

CUI公司在发展过程中,始终注重市场拓展和品牌建设。公司通过与国内外知名企业的合作,不断拓宽产品应用领域,提升品牌影响力。同时,公司还积极参加各类行业展会和交流活动,与同行和客户建立紧密的合作关系,为公司的长期发展奠定了坚实的基础。

Daburn公司的发展小趣事

Daburn公司自创立之初就致力于电子连接器的研发。在上世纪80年代,公司推出了一款新型的高性能连接器,该连接器采用了独特的材料和设计,大大提高了数据传输的效率和稳定性。这一技术突破让Daburn在行业中崭露头角,并吸引了大量客户的关注。随着技术的不断进步,Daburn逐渐扩展了其产品线,涵盖了线束、电缆组件和定制连接解决方案等多个领域。

Arco Electronics公司的发展小趣事

Arco Electronics公司深知品牌建设对于企业发展的重要性。因此,公司投入大量资源用于品牌建设和市场推广。公司通过与知名企业合作、赞助行业展会等方式提升品牌知名度;同时,还积极运用新媒体进行线上推广,与消费者建立更紧密的联系。这些举措有效地提升了Arco的品牌形象和市场影响力。

EPC公司的发展小趣事

最后一家EPC公司深知创新是企业发展的核心动力。公司注重研发投入和人才培养,建立了专业的研发团队和完善的研发体系。公司不断跟踪行业发展趋势和技术动态,积极引进新技术、新工艺和新材料,推动产品升级和产业升级。同时,公司注重创新成果的转化和应用,将新技术、新工艺和新材料应用于实际项目中,提高了项目的竞争力和附加值。通过持续的创新和积累,公司逐渐在电子行业中形成了独特的技术优势和核心竞争力。

请注意,以上故事仅为框架性描述,并未包含具体的公司名称、项目细节和具体数字。您可以根据这些框架性描述进一步深入了解相关公司的发展情况,并结合实际案例进行具体分析和撰写。

Elite Enterprises (H K) Co Ltd公司的发展小趣事

随着市场的竞争加剧,Elite Enterprises意识到只有不断提升产品品质和技术水平,才能在竞争中立于不败之地。因此,公司加大了对研发的投资,不断引进先进的生产设备和检测仪器,并严格把控原材料采购和生产流程。这些努力使公司的LED产品在光效、寿命和稳定性等方面均达到了行业领先水平。

Electrolube公司的发展小趣事

在电子行业中,电池管理系统(BMS)的可靠性和耐用性一直是制造商关注的焦点。Electrolube公司凭借其在材料科学领域的深厚积累,成功推出了一款名为UVCL的新型UV固化涂层。这款涂层以其独特的特性迅速在市场中脱颖而出。

UVCL涂层采用先进的UV固化技术,能够在几秒钟内完成固化过程,大大提高了生产效率。同时,它还具有高效的湿气引发的二次固化机制,确保即使在阴影区域也能实现完全固化。这一特性对于BMS等复杂电子电路的保护至关重要。

为了将UVCL涂层推向市场,Electrolube公司的研发团队与客户紧密合作,克服了客户内部没有UV固化设施的难题。他们与信誉良好的供应商合作,提供了完整的解决方案,并成功为客户提供了原型样品单元进行现场测试。测试结果显示,UVCL涂层能够为电子电路提供最高水平的保护,且操作过程简单、应用速度快。

UVCL涂层的成功推出不仅提升了Electrolube公司在电子材料领域的地位,也为公司赢得了众多客户的信赖和好评。

问答坊 | AI 解惑

分享你的体验,精彩大奖等你拿!

罗德与施瓦茨 2009年射频微波测量仪器应用 有奖征文竞赛启事 一等奖1 名;奖励价值6000元的奖品 二等奖 3 名;奖励价值4000元的奖品 三等奖若干名:奖励价值1000元的奖品 为了推动射频微波测试与测量技术的发展,适应客户的测试应用需 ...…

查看全部问答>

rs485总线

1490B为全双工方式,如何将其转换为半双工?我只能单独的发送和单独的接收,但并不能实现其半双工工作方式,请问问题出在哪?谢谢~~~…

查看全部问答>

Windows CE提供优质智能家居生活

随着社会的发展,人们对于居住环境的安全、方便、舒适提出了越来越高的要求,希望回到家即可得到100%的休息与享受,尽可能的减少每天所进行的无用功,而出外时如有非法进入、火灾、液化气泄漏等情况,可自动通知户主并报警。因此,智能家居在这种 ...…

查看全部问答>

evc操作sql server CE时,如何捕捉到错误信息?

evc操作sql server CE时,如何捕捉到错误信息? 在VC操作sql server 2000时,我们可以通过: try { ... ... } catch( _com_error &e ) { ... ... } 得到出错的原因,在调试时非常方便,但是evc操作sql server CE时我该如何处理呢?谢谢大 ...…

查看全部问答>

Wince 是否支持大页nand flash?文件格式是dosfs吗?

Wince是否支持大页nand flash?文件格式是dosfs吗? Wince支持的Nand的大页模式和小页模式是同一个文件系统吗?…

查看全部问答>

CE的内存结构

在某个虚拟地址空间中,把物理地址空间重复地映射了一遍. 为什么要重复映射,重复映射的部分与先前映射的部分有什么区别?…

查看全部问答>

STM8L的LCD控制器怎么使用啊?是不是非要LSE时钟才行啊?

我不想用LSE时钟,我看到手册上说LCD控制器可以使用RTCCLK/2当做时钟输入;也可以直接使用SYSCLK,只需要开启外设时钟的LCD就行。但是我写的程序,COM和SEG咋动都不动一下呢?用示波器看,动都没动,郁闷;下面是几行代码: void LCD_INIT(vo ...…

查看全部问答>

CAN一次最多发多少字节数据?

TxMessage.DLC最多是8字节,我一次要发24个。分三次发,发送程序如下TestStatus CAN_Polling(void){  u32 i = 0;  u8  m=0;  //每次发送的字节数  u8  n=0; ...…

查看全部问答>

请问P0接蜂鸣器该怎么接?

怎么接呢?给个图吧,谢谢。…

查看全部问答>