|
用定时中断方法 IO模拟Uart定时中断的溢出设定值如何计算?测试代码如下:
void debug_mode()
{
/*输出脉冲信号,使用示波器测量一下脉冲频率 9600的波特率 1位起始位 8位数据位 1位停止位 比特率96000 正弦波频率除以2 48000*/
/*一秒钟要发送9600X10个位,一个位占用的时间 1/96000约等于10us 用示波器观察*/
/*
if (SimUart1_TxPortPin)
{
SimUart1_TxPortPin=0;
}
else
{
SimUart1_TxPortPin=1;
}
*/
/*模拟发送一个一个字符*/
if (tx_flag==TRUE)
{
// if (tx_count==0) set_tx_pin_high();
if (tx_count==1) set_tx_pin_low();//起始位
if (tx_count==2) set_tx_pin_low();//数据第一位
if (tx_count==3) set_tx_pin_low();//数据第二位
if (tx_count==4) set_tx_pin_low();//数据第三位
if (tx_count==5) set_tx_pin_low();//数据第四位
if (tx_count==6) set_tx_pin_low();//数据第五位
if (tx_count==7) set_tx_pin_low();//数据第六位
if (tx_count==8) set_tx_pin_low();//数据第七位
if (tx_count==9) set_tx_pin_high();//数据第八位
if (tx_count==10) set_tx_pin_high();//停止位
tx_count++;
if (tx_count>10)
{
tx_count=0;
tx_flag=FALSE;
}
}
}
晶振:18.432MHZ
void timer_set(unsigned long sysclk,unsigned long bt)
{
//定时器2作为串口0的波特率发生器
TR2=0; // 关闭定时器Timer1
ET2=0; // 关闭定时器Timer1中断
PT2=0; // 关闭定时器Timer1中断优先权
CKCON=SetBit_(CKCON,5); /*定时器2用系统时钟作为它的时基 Bit5: T2M: Timer 2 Clock Select*/
/*TMOD: 定时器工作再模式1, 16位重载 Bit0: CP/RL2: Capture/Reload Select. */
T2CON=ClrBit_(T2CON,0);
RCLK0=0;
TCLK0=0;
/*定时器模式 Bit1: C/T2: Counter/Timer Select*/
T2CON=ClrBit_(T2CON,1);
//重载值计算 1843200/96000
RCAP2H = 255-(((sysclk/bt/10)&0xFF00)>>8); /*设置定时3用作波特率的重载值 */
RCAP2L=255-((sysclk/bt/10)&0xFF);
//RCAP2H =0x0;
//RCAP2L=0x10;
/*打开定时器2的定时中断,以便定时中断程序能正常运行 Bit5: ET2: Enabler Timer 2 Interrupt.*/
ET2=1;
TR2 = 1; /*开定时器2 .*/
}
用上面的代码计算出来的定时器溢出设定值,波特率不是9600,我用串口调试软件测试出来,波特率大约是29800。
哪位大牛介绍一下计算方法? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|