北京交通大学-单片机实验-1kHz信号的任次分频(2-99次)(UVision4+80/87C52)

 1.实验题目:

实现对10kHz信号的任意次(2~99)分频

由UART输入分频系数。

2实验环境:

操作系统:Windows 8.1专业版

处理器:Intel(R)Core(TM)i3-3227U CPU @1.90GHz 1.90GHz

安装内存(RAM):2.00GB

系统类型:64位操作系统,基于x64的处理器

编译环境:UVISION4

3实验原理:

定时器/计数器T0和T1有2个控制寄存器-TMOD和TCON,它们分别用来设置各个定时器/计数器的工作方式,选择定时或计数功能,控制启动运行,以及作为运行状态的标志等。其中,TCON寄存器中另有4位用于中断系统。

1、定时器方式控制寄存器TMOD

TMOD在特殊功能寄存器中,字节地址为89H,无位地址。TMOD的格式如下图年示。

由图可见,TMOD的高4位用于T1,低4使用于T0,4种符号的含义如下:

GATE:门控制位。其作用见图1.6。GATE和软件控制位TR、外部引脚信号INT的状态,共同控制定时器/计数器的打开或关闭。

C/T:定时器/计数器选择位。C/T=1,为计数器方式;C/T=0,为定时器方式。

M1M0:工作方式选择位,定时器/计数器的4种工作方式由M1M0设定。

M1M0=00:工作方式0(13位方式)。

M1M0=01:工作方式1(16位方式)。

M1M0=10:工作方式2(8位自动装入时间常数方式)。

MlM0=11:工作方式3(2个8位方式--仅对T0)

2.定时器控制寄存器--TCON

TCON在特殊功能寄存器中,字节地址为88H,位地址(由低位到高位)为88H一8FH,由于有位地址,十分便于进行位操作。

TCON的格式如下图所示。其中,TFl,TRl,TF0和TR0位用于定时器/计数器;IEl,ITl,IEo和IT0位用于中断系统。

TFl,TRl用于定时器T1;TF0,TR0用于定时器T0。两组符号有相同的含义。

TF:定时器/计数器中断请求标志位。当定时器计满回零时,TF=1,并可申请中断;当CPU响应中断并进入中断服务程序后,TF自动清零。如对TF查询,定时器回零后,要用指令将TF清零。

TR:定时器/计数器开闭控制位。

IEl,ITl用于外部中断1(1NTl);IE0,IT0用于外部中断0(1NT0)。两组符号的含义相同。

IT:下跳沿/低电平引起外部中断请求的选择位。IT=1,由下跳沿引起;IT=0,由低电平引起。

IE:外部中断的中断申请标志。IE=0,表明无外部中断请求;IE=1,表明有外部中断请求。当有外部中断请求时,IE自动为1,单片机CPU响应此中断后,IE自动清零。

4.实验过程:

通过修改信号函数的相关参数来改变输入信号的周期(频率);通过修改计数器的初值TH0来实现不同次数分频;并加入对串行口的初始化函数,在实验过程中可用定时器1或定时器0来实现。

  1. 实验代码:

源代码:

#include <reg52.h>

extern void Uart_Init (void);

unsigned int data div = 9;

sbit P1_0 = P1^0;

void TIM0_INIT (unsigned int div);

unsigned int i;

void main (void)

{

       Uart_Init ();   

       TIM0_INIT (div);

       EA = 1;

       while (1);

}

void TIM0_INIT (unsigned int div)

{

       TMOD |= 0x06;

       TH0 = -(div/2);

       TR0 = 1;

       ET0 = 1;

}

void tmr1_ISR(void) interrupt 1

{

       P1_0 = ~P1_0;

       if(P1_0)

       {

              TH0 = -(div/2);

       }

       else

       {

              TH0 = -((div+1)/2);

       }

}

void UART_ISR (void) interrupt 4

{

       if (RI)                                                               

       {

              RI = 0;

              if( (SBUF >= '0') && (SBUF <= '9'))

              {

                     TR0=0;

                     div = SBUF & 0x0f;

                     div=10*i+SBUF & 0x0f;

                     TR0=1;

                     i=div;

              }

       }

       if (TI)

       {

              TI = 0;

       }    

}

串行口初始化函数:

#include <reg52.h>

#define SYSCLK 11059200

#define BAUD 19200

#define c_tmr1 -(SYSCLK/192.0/BAUD+0.5)

void Uart_Init (void)

{

       SCON = 0x50;

       PCON |= 0x80;

       TMOD |= 32;

       TH1 = c_tmr1;

       TR1 = 1;

       ES = 1;

  1. 实验结果:

UART未输入时:

UART输入2时:(偶数)

UART输入7时:(奇数)

UART输入12时:(偶数)

UART输入11时:(奇数)

五、实验总结:

当我们想对信号进行任意次(包括奇次和偶次)分频时,改变计数初值即可改变分频系数,注意如果是偶数次分频时,两边分出来都一样,都是n/2;如果是奇数次分频时,n=[n/2]+[n+1/2],应设定一个位变量来进行切换。

在实验中,如果出现的实验结果与我们所预想的不符时,应当设置断点,单步操作,或从WATCH窗口观看相关变量是否为所输入的值,以便对程序的调试。

通过本次实验,我对UVISION仿真更加了解了,同时对分频的理解也更加的深刻。通过对中断和UART输入分别用来分频,可以比较这两种分频方法的不同,比较优劣,强化对它们的理解,巩固自己的知识。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值