专业做网站较好的公司广州,中国现货交易网,电子商务系统设计报告,静态网站 源码本章重点讲解将TIM0用作两个8位定时器#xff0c;同时将TIM1用作波特率发生器。
当定时器T0在方式3时#xff0c;T1不能产生中断#xff0c;但可以正常工作在方式0、1、2下#xff0c;大多数情况下#xff0c;T1将用作串口的波特率发生器。
1、定时器0工作在模式3框图同时将TIM1用作波特率发生器。
当定时器T0在方式3时T1不能产生中断但可以正常工作在方式0、1、2下大多数情况下T1将用作串口的波特率发生器。
1、定时器0工作在模式3框图 2、定时器1工作在模式2用作波特率发生器框图 51单片机定时器T1用作波特率发生器时常选用定时器T1的工作方式为2有人说可以使用工作方式0或工作方式1不清楚。我觉得不入流的想法不要去好奇。 3、定时器0工作在模式3应用
#include REG51.h //包含头文件REG51.h,使能51内部寄存器;
#include stdio.h //包含头文件stdio.h //_getkey();从串口读入一个字符; //putchar();向串口发送一个字节; //printf();向串口发送一串字节; //定时器的方式控制寄存器TMOD: GATE1,C/T1,M1_1,M1_0,GATE0,C/T0,M0_1,M0_0
//GATE11,表示T1是受INT1脚(P3.3)控制运行;
//C/T10,表示T1的时钟源为fosc/12;C/T11,表示T1的时钟源为T1脚(P3.5);
//GATE01,表示T0是受INT0脚(P3.2)控制运行;
//C/T00,表示T0的时钟源为fosc/12;C/T01,表示T0的时钟源为T0脚(P3.4);
//下面说明T0的工作方式
//M0_1:M0_000,表示T0为13位定时器/计数器;
//M0_1:M0_001,表示T0为16位定时器/计数器;
//M0_1:M0_010,表示T0为8位自动重装载定时器/计数器;
//M0_1:M0_011,表示T0分为两个8位计数器;
//下面说明T1的工作方式
//M1_1:M1_000,表示T1为13位定时器/计数器;
//M1_1:M1_001,表示T1为16位定时器/计数器;
//M1_1:M1_010,表示T1为8位自动重装载定时器/计数器;
//M1_1:M1_011,表示T1没有此工作方式; //定时器的控制寄存器TCON: TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0
//TF11,表示T1溢出到0x0000,CPU响应中断后,由硬件自动清除;
//当GATE10时,TR11,表示启动T1开始工作,当GATE11时,Timer1由INT1脚(P3.3)和TR0控制;
//TF01,表示T0溢出到0x0000,CPU响应中断后,由硬件自动清除;
//当GATE00时,TR01,表示启动T0开始工作,当GATE01时,Timer0由INT0脚(P3.2)和TR0控制;
#define OSC_FREQ 11059200L //#define BAUD_115200 256 - (OSC_FREQ/192L)/115200L //
//#define BAUD_38400 256 - (OSC_FREQ/192L)/38400L //
#define BAUD_Time 1
#if(BAUD_Time1)
//若波特率加倍,则使用下面参数;
#define BAUD_57600 256 - (OSC_FREQ/192L)/57600L //255
#define BAUD_28800 256 - (OSC_FREQ/192L)/28800L //254
#define BAUD_19200 256 - (OSC_FREQ/192L)/19200L //253
#define BAUD_14400 256 - (OSC_FREQ/192L)/14400L //252
#define BAUD_9600 256 - (OSC_FREQ/192L)/9600L //250
#define BAUD_4800 256 - (OSC_FREQ/192L)/4800L //244
#define BAUD_2400 256 - (OSC_FREQ/192L)/2400L //232
#define BAUD_1200 256 - (OSC_FREQ/192L)/1200L //208
#else
//若波特率不加倍,则使用下面参数;
#define BAUD_9600 256 - (OSC_FREQ/384L)/9600L
#define BAUD_4800 256 - (OSC_FREQ/384L)/4800L
#define BAUD_1200 256 - (OSC_FREQ/384L)/1200L
#endif #define TL0_Load_Value 256-100L //配置TL0为100us中断一次;
#define TH0_Load_Value 256-200L //配置TH0为200us中断一次; sbit LED1 P1^0;
sbit LED2 P1^1;
uynsigned int Time0TL0Count;
uynsigned int Time0TH0Count; //函数功能: TL0计数器的中断服务函数,每100us中断一次;
void TL0_interrupt_program() interrupt 1 using 1
{ TL0TL0_Load_Value; //手动装载初值;
Time0TL0Count;
if(Time0TL0Count5000)//0.5秒 LED1~LED1;
} //函数功能: TH0计数器的中断服务函数,每200us中断一次;
void TH0_interrupt_program() interrupt 3 using 1
{ TH0TH0_Load_Value; //手动装载初值;
Time0TH0Count;
if(Time0TH0Count5000)//0.5秒 LED2~LED2;
} //函数功能: Timer0初始化;
void timer0_initializtion()
{ TMOD 0xF4; //设置GATE00,即不允许外部INT0脚控制Timer0; TMOD| 0x03; //配置Timer0为方式3(两个8位定时器,一个用TL0计数,一个用TH0计数); TL0TL0_Load_Value; //手动装载初值; TH0TH0_Load_Value; //手动装载初值; TR01; //当GATE00时,TR01,表示启动Timer0中的TL0开始工作; TR11; //设置Timer0的TH0时钟源为晶振频率的1/12,并启动TH0开始工作; ET01; //允许Timer0中的TL0溢出中断; ET11; //允许Timer0中的TH0溢出中断; EA1; //开总中断允许位;
Time0TL0Count0;
Time0TH0Count0;
} //函数功能: Timer1初始化;
void timer1_initializtion()
{ TMOD 0x4F; //设置GATE10,即不允许外部INT1脚控制Timer1; TMOD| 0x20; //配置Timer1为方式2(8位自动重装载),用于波特率发生器; TH1BAUD_9600; //TH1: reload value for 9600 baud 11.0592MHz; TL1TH1;
} //函数功能:初始化串口,设置波特率为9600bps11.0592MHz,使能接收,使用8位UART;
void Serial_Port_Initialization()
{ PCON 0x80; SCON0x50; //串行控制寄存器: SM0,SM1,SM2,REN,TB8,RB8,TI,RI //SM1:SM001,选择方式1,SM20,表示非多机通讯,8-bit UART; //REN1,使能接收; timer1_initializtion(); TI1; //发送UART的第一个字节,为下次发送做准备; RI0; //ES1; //使能串口接收和发送中断; EA1; //开总中断
}
void main(void)
{ timer0_initializtion(); //Timer0初始化; Serial_Port_Initialization();
//初始化串口,设置波特率为9600bps11.0592MHz,使能接收,使用8位UART; printf( Timer0 works in mode3;\n ); printf( TL0 is a timer.\n ); printf( TH0 is a timer,too;\n ); printf( Timer1 works in mode2,It is a baud_rate_generator!\n ); while(1); {
}
}