本人用定时器做延时,来串口发送字符串,遇到问题,不知道怎么解答,程序如下l;
#include <reg51.h>
#include <stdio.h>
#include "SerialM1.h"
#include "..LibDelay.h"
//====================================================================================
unsigned char idata str[]={"hello!
"};
unsigned char flag=1;
unsigned char flag1=0;
unsigned char t1=0;
unsigned char k=0;
//====================================================================================
void UartInit(void)
{
SCON=0x40; //初始化串行口模式一
PCON=0x00; //设置波特率曾倍SMOD=0
TMOD=0x20; //初始化T0、T1均为定时功能,分别工作在模式1和模式2
TH1=0xFD; //波特率9600 bit/s
TL1=0xFD;
TR1=1; //启动定时器1
ES=0; //禁止串行中断
}
//====================================================================================
void Timer01Init(void)
{
TMOD=0x01; //定时器0工作在方式一
TH0=(65536-M)/256; //TH0=0xF7; 初值 2.5ms中断
TL0=(65536-M)%256; //TL0=0x00;
// TR0=1; //启动定时器0
// ET0=1; //允许定时器0中断
// EA=1; //开总中断
}
//====================================================================================
void Timer01Irf(void) interrupt 1 //2.5ms定时子程序
{
TH0=(65536-M)/256; //TH0=0xFB;
TL0=(65536-M)%256; //TL0=0x80;
t1++;
if(t1>=40) //定时100ms
{
t1=0;
flag1=1;
}
}
//====================================================================================
void UartTranByte(unsigned char ch)
{
SBUF=ch; //将数据写入串行口数据缓冲寄存器,发送数据
while(TI==0); //发送完成后标志位TI被置位
TI=0; //清标志位
}
//====================================================================================
void UartTranString(unsigned char *str)
{
Timer01Init();
while(str[k]!=' ')
{
if(flag1==1) //表示延时100ms到了,
{
k++;
flag=1; // 启动发送下一个字节
flag1=0;
}
if(flag==1)
{
UartTranByte(*(str+k)); //发送一个字节数据
TR0=1;
ET0=1;
EA=1;
flag=0;
}
}
}
//====================================================================================
void main(void)
{
UartInit();
UartTranString(str);
while(1);
}
哪位高人指点?
此帖出自
小平头技术问答
一周热门 更多>