关于单片机定时器输出方波问题分析

电源设计应用

419人已加入

描述

  在测量控制系统中,常常要求有一些实时时钟,以实现定时控制、定时测量或延时动作,也往往要求有计数器能对外部事件计数,如测电机转速、频率、工件个数等。广泛用于个人家庭、学校、工厂等场所,是人们日常生活、工作中不可缺少的必需品。

  实现定时,有软件、数字电路和可编程定时器3种主要方法。可编程定时计数器是为方便微型计算机系统的设计和应用而研制的,它是硬件定时,又能很容易地通过软件来确定和改变它的定时值,通过初始化编程,能够满足各种不同的定时要求,因而在嵌入式系统的设计和应用中得到广泛的应用。

  单片计算机即单片微型计算机,是集CPU、RAM、ROM、定时/计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产品和工业自动化。而51单片机是各单片机中最为典型和最有代表性的一种。

  方波是一种非正弦曲线的波形,通常会于电子和讯号处理时出现。理想方波只有“高”和“低”这两个值。电流的波形为矩形的电流即为方波电流。不论时间轴上下是不是对称的,只要是矩形就可叫方波,必要时,可加“对称”,“不对称”加以说明

  通过单片机内部的计数器/定时器,采用软件编程来产生方波,这种方法的硬件线路较简单,系统的功能一般与软件设计相关。

  选择MCS-51系列中的8031单片机,由于是用指示灯显示输出方波信号,一个LED显示灯即可满足设计要求。

  8031是最常见的的MCS-51系列单片机,是inter公司早期的成熟的单片机产品,应用范围涉及到各行各业。

  方波

  方波

  存储器空间以及存储器

  方波

  1、内部数据存储器结构:

 方波

  复位后:内部RAM 区及外部RAM 区皆保持原值

  2、程序状态字: PSW

  方波

  CY:进、借位,有进、借位:CY=1

  AC:半进、借位,有半进、借位:AC=1

  F0:用户标志位(由用户设定)

  RS1,RS0:工作寄存器组选择位

  00:选择0组

  01:选择1组

  10:选择2组

  11:选择3组

  OV:溢出位,有溢出:OV=1

  X:无效位

  P:奇偶位,运算结果有奇数个1:P=1

  3、程序存储器特定入口:

  0000H: 复位或开机后的程序入口

  0003H: 外部中断0 服务程序入口

  000BH: 定时/计数器0 中断服务程序入口

  0013H: 外部中断1 服务程序入口

  001BH: 定时/计数器1 中断服务程序入口

  0023H: 串行I/O 中断服务程序入口

  定时/计数器

  8031 片内有两个16位定时/计数器(增量式计数)

  1、工作方式(方式0、方式1、方式2、方式3)

  以定时/计数器1为例

  ⑴方式0(13位定时/计数)

 方波

  ⑵方式1(16位定时/计数)

  方波

  ⑶方式2(8位自动重装时间常数定时/计数)

  方波

  ⑷方式3(仅适用于定时/计数器0)

  TL0 用于8位定时/计数

  TH0 只用于8位定时

  方波

  控制寄存器

  ⑴定时/计数器方式控制寄存器:TMOD

  方波

  GATE: 门控位,1:打开,0:关闭

  C/T: 工作状态选择,1:计数状态,0:定时状态

  M1,M0:工作方式选择

  00 方式0

  01 方式1

  10 方式2

  11 方式3

  ⑵定时/计数器控制寄存器:TCON

  方波

  中断系统

  5个中断源

  INT0: 外部中断0

  INT1: 外部中断1

  T0: 定时/计数器0中断

  T1: 定时/计数器1中断

  TI/RI: 串行I/O中断

  ⑴中断允许寄存器:IE(1:允许;0:不允许)

  方波

  PT1:T1 中断优先位

  PX1:INT1 中断优先位

  PT0:T0 中断优先位

  PX0:INT0 中断优先位

  (同级中断时的优先顺序:INT0→T0→INT1→T1→RI/TI) CPU 响应中断后,自动清除中断请求标志(只有串行口中断请求标志需用软件清除),并将程序计数器PC 之值压入堆栈,然后将相应的中断入口地址装入PC,使程序转入相应的中断服务程序。

  并行I/O端口(P0、P1、P2、P3)

  8031 单片机中:

  P0 口:作为地址低8位和双向数据总线 P2 口:作为地址高8位总线 1、P1 端口

  P1 口每一位的内部结构如下:

  方波

  注:当P1 口作输入时,必须先向P1 口写“FFH”(即11111111),由于单片机上电或复位后P0 口-P3 口皆置为“FFH”,故一般不需人为写“FFH”。 说明:其他端口本设计电路所用甚少,这里不作详细介绍。

  串行I/O端口

  8031 有一个串行端口

        1、串行通讯基本方式

  ⑴异步传送: ⑵同步传送:

  2、串行端口的工作方式(方式0、方式1、方式2、方式3

        3、串行端口的控制寄存器

  ⑴SCON:串口控制寄存器 ⑵PCON:电源控制寄存器

  主程序模块

  主程序主要用于系统初始化:P1.7初始化清零,P1.0置位,设T1为定时器方式1,计数器方式2,置计数器初始值,然后启动计数器。

  定时器/计数器的启停

  T0为定时方式,在置TR0=1以后,定时立即开始,但在定时时间到后,还必须用软件再次装入初值,重新启动才能开始新的定时。

  T1为计数方式2,在置TR1=1以后,计数开始,在计数次数到以后,自动装入初始值并重新计数,因此软件设计不再考虑装入初值

  方波

  计数/定时器模块

  1、计数/定时器工作方式的选择

  根据课题要求,可将T0设定为50ms的定时间隔,才用工作方式1。当定时时间到后,将P1.0输出反相,再加到T1输入端作计数脉冲。

  从T1端输入,需要定时两次才能构成一个完整的计数脉冲。因此,设T1计数次数为10次,就能完成1S的定时:

  (50ms+50ms)×10=1s

  由于LED的亮/灭是持续不断的,所以可以将T1设成为方式2,自动装入初值,重复进行计数。 2、定时/计数器初值的计算与装入 X=65536-Focs/12·T

  =65536-11.0592/12·1000000×50×0.001=19 456=4C00H 即TH0=4CH,TL0=00H

  T1计数器在方式2下是8位的,计数10次的初值为: (256-10)=246=F6H

  同时装入TH1和TL1,即TH1=0F6H,TL1=0F6H

  方波

  8051单片机,用定时器输出方波。周期20ms,占空比5%-10%,可通过串口调节,P1.0输出波形,P1.1串口输入,C程序。

  串口接收占空比,定时器控制,比如串口接受到的数据是8,那么占空比就是8%,定时器就按这个数来控制波形。

  用标准串口吧,比较简单一点,用P1.1的话,还得编驱动,很麻烦的。

  #include《reg51.h》

  #define uchar unsigned char

  sbit pwm=P1^0;

  uchar u_p=5,num=0;

  void t0isr() interrupt 1

  {

  num++;

  if(num《=u_p)pwm=1;

  if(num》u_p)pwm=0;

  num%=100;

  }

  void uart() interrupt 4

  {

  if(RI)

  {

  RI=0;

  u_p=SBUF;

  }

  }

  main()

  {

  TMOD=0x22;

  TH0=56;

  TL0=56;

  TH1=0xfd;

  TL1=0xfd;

  TR0=1;

  TR1=1;

  ET0=1;

  ES=1;

  EA=1;

  pwm=1;

  while(1);

  }

  使用单片机定时器在P1.0口产生200Hz方波程序

  #include

  void main()

  {

  P1^0 = 0; // 清P0口

  /////////

  TMOD = 0x00; // T0使用定时模式,工作模式0,无门控位

  TH0 = 0x60; // 为T0填入初值,定时时间5ms

  TL0 = 0x78;

  TR0 = 1; // 启动T0

  ET0 = 1; // 允许定时器0中断

  EA = 1; // CPU开放中断

  while(1); // 循环等待

  }

  void timer0_int () interrupt 1 using 2 // T0溢出中断,使用工作组2

  {

  TH0 = 0x60; // 重新填入初值

  TL0 = 0x78;

  P1^0= ~P1^0; // P1.0取反,产生方波

  }

  单片机 定时器产生10k方波

  #include《reg52.h》 //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  sbit OUT=P1^2; //定义OUT输出端口

  /*------------------------------------------------

  定时器初始化子程序

  ------------------------------------------------*/

  void Init_Timer0(void)

  {

  TMOD |= 0x01; //使用模式1,16位定时器,使用“|”符号可以在使用多个定时器时不受影响

  //TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出

  //TL0=0x00;

  EA=1; //总中断打开

  ET0=1; //定时器中断打开

  TR0=1; //定时器开关打开

  }

  /*------------------------------------------------

  主程序

  ------------------------------------------------*/

  main()

  {

  Init_Timer0();

  while(1);

  }

  /*------------------------------------------------

  定时器中断子程序

  ------------------------------------------------*/

  void Timer0_isr(void) interrupt 1 using 1

  {

  TH0=(65536-50)/256; //重新赋值 12M晶振计算,指令周期1uS,

  TL0=(65536-50)%256; //1mS方波半个周期50uS,即定时50次

  //溢出然后输出端取反

  OUT=~OUT; //用示波器可看到方波输出

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分