单片机_第6章 实例

建议配合本专栏的文章“单片机_第6章 单片机的定时/计数器”一起使用

目录

实例1 设单片机的fosc=12MHz,采用T1定时方式1在P2.0脚上输出周期为2ms的方波。

实例2 用单片机实现一个频率计功能,用于测量接在P3.4引脚的脉冲波频率(<10KHz),并将测量结果显示在数码管上。

实例3 采用T0定时方式2在P2.0口输出周期为0.5ms的方波(设fosc=12MHz)。

实例4  改进“计数显示器”采用的按键查询法,改为T0计数方式2 + 中断法,实现原有功能。

实例5(波形展宽)  由P3.4口输入一个低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500μs的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc= 6MHz)。

实例6(长延时、非对称)  采用10MHz晶振,在P2.0脚上输出周期为2.5s,高电平占空比为20%的脉冲信号。


实例1 设单片机的fosc=12MHz,采用T1定时方式1在P2.0脚上输出周期为2ms的方波。

实例1 设单片机的fosc=12MHz,采用T1定时方式1P2.0脚上输出周期为2ms的方波。

 分析周期为2ms的方波由2个半周期为1ms的正负脉冲组成

 方波输出原理:定时1ms后将端口输出电平取反。
1ms定时的计数初值应为:
        a = 216 – t* fos / 12 = 216 – 1000* 12/ 12 = 64536 = 0xfc18
        TH1 =  0xfc      TL1 = 0x18
        (另一种简单计算的方法:TH1=64536/256,TL1=64536%256)
注意:需要不断重装计数初值。

1查询方式

#include <reg51.h>

sbit P2_0 = P2^0;

main () 
{
   TMOD = 0x10;          //设置T1定时方式1(0001 0000B)
   TR1=1;                //启动T0
   for(;;)
   {
      TH1 = 0xfc; 	     //装载计数初值 
      TL1 = 0x18;
      do{ } while(!TF1); //等待TF1溢出
      P2_0 =!P2_0;       //定时时间到P2.0反相
      TF1 = 0;           //TF1标志清0
    }
}

(2)中断方式

中断源等情况

#include <reg51.h>

sbit P2_0=P2^0;

timer1 () interrupt 3      //T1中断函数
{
   P2_0 = !P2_0; 		   //P2.0取反
   TH1 = 0xfc; 		       //装载计数初值
   TL1 = 0x18;
}

main () 
{
   TMOD = 0x10; 		   //T1定时方式1
   TH1 = 0xfc;		       //装载计数初值
   TL1 = 0x18;
   EA=1; 			       //开总中断
   ET1=1; 			       //开T1中断(总中断与部分中断的书写顺序无关紧要)
   TR1=1; 			       //启动T1,一定要最后书写,最后使用
   while(1);
}

实例1仿真运行

 仿真结果:生成了满足提示要求的波形

小结:方式1连续定时编程一般框架

思考(我这里只讲一点思路,大家可以自己动手实验)

 1怎样实现较长的定时?(增加一个值count来记录中断的次数,count达到一定值时让它产生反应)

2怎样输出特定占空比的矩形波?(将高电平和低电平的时间单独表示)


  • 11
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值