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来实现。
- 实验代码:
源代码:
#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;
- 实验结果:
UART未输入时:
UART输入2时:(偶数)
UART输入7时:(奇数)
UART输入12时:(偶数)
UART输入11时:(奇数)
五、实验总结:
当我们想对信号进行任意次(包括奇次和偶次)分频时,改变计数初值即可改变分频系数,注意如果是偶数次分频时,两边分出来都一样,都是n/2;如果是奇数次分频时,n=[n/2]+[n+1/2],应设定一个位变量来进行切换。
在实验中,如果出现的实验结果与我们所预想的不符时,应当设置断点,单步操作,或从WATCH窗口观看相关变量是否为所输入的值,以便对程序的调试。
通过本次实验,我对UVISION仿真更加了解了,同时对分频的理解也更加的深刻。通过对中断和UART输入分别用来分频,可以比较这两种分频方法的不同,比较优劣,强化对它们的理解,巩固自己的知识。