由于片子的串口模块不够,需要GPIO模拟一个出来,系统使用16MHz晶振,波特率1200,但是尝试发送
数组元素0X0D,串口监控始终只能收到06的不断循环。不知道是因为延时问题还是什么原因造成的,请高手指点,非常感谢
这个是我的部分代码
#define WRDYN 2663 //写延时
/************************微秒级精确延时函数*************************
晶振16M,一个时钟周期0.0625us:
Delay = 0.0625 * ((u*5-1)+10)微秒,用t表示时钟数,
其中4包括了每次减一循环包括的subi 1t,sbci 1t,nop 1t,brne 2t/1t,
brne指令在当判断条件不成立时是单周期
最后一次判断只有1个周期,需要减一;
10包括了调用方的 r16 赋值 1t,r17赋值1t,
rcall 3t,nop 1t,ret 4t,
简化计算 = 0.3125u + 0.5625 ,单位微秒
*******************************************************************************/
void exactdelay(uint u)
{
asm("_d0:subi R16,1");//一个时钟周期1t
asm("sbci R17,0"); //一个时钟周期1t
_NOP(); //一个时钟周期1t
asm("brne _d0"); //判断条件成立时两个周期2t,不成立时单周期1t
_NOP(); //一个时钟周期1t
asm("ret"); //4t
}
//往串口写一个字节
void putchar(uchar input)
{
uchar i;
CLI();
PORTC &= ~(BIT(PC0)); //发送启始位
exactdelay(WRDYN);//延时832.75us
//发送8位数据位
for(i = 0;i < 8;i ++)
{
input = (input >> 1);
if(input & 0x01)
PORTC |= BIT(PC0);
else
PORTC &= ~(BIT(PC0));
exactdelay(WRDYN);
}
//发送校验位(无)
PORTC |= BIT(PC0); //发送结束位
exactdelay(WRDYN);
SEI();
}
/*******************************************************************************
主程序
*******************************************************************************/
void main(void)
{
uchar j;
SYS_Init(); //系统初始化
while(1)
{
WDR();
for(j = 0;j < 10;j ++)
{
putchar(MCU_TX_ARRAY[0][0]);
//这里为了查看发送是否成功,每次只发送同一字节
exactdelay(WRDYN);
}
exactdelay(50000); //随手写的
}
}
|