定时器做延时

2019-03-24 20:04发布

本人用定时器做延时,来串口发送字符串,遇到问题,不知道怎么解答,程序如下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); 
}
哪位高人指点? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
t5pkok
1楼-- · 2019-03-25 03:36
自己顶顶
wstrom
2楼-- · 2019-03-25 04:02
 精彩回答 2  元偷偷看……
辛昕
3楼-- · 2019-03-25 07:29
呵呵,LS的,我想,你的意思应该是:
问问题,应该是自己把问题描述清楚,而不是把一堆代码扔给别人。
这样说也许LZ会更明白。

LZ,你知道吗?看别人的程序是一件很痛苦的事情,特别是没有注释的情况下。
所以,请你仔细想想,你的问题,其实是出在什么地方?
据我经验,大多数时候当你确切描述出来,你已经知道怎么办了。
孤獨の快樂
4楼-- · 2019-03-25 12:14

粗略一看,你M是什么?没定义

定时器是用来中断的不是用来延迟的

TR1=1,定时器就开始运行了,每到定时器溢出就进行中断了

延迟还是用循环吧 

[ 本帖最后由 孤獨の快樂 于 2011-3-21 19:25 编辑 ]

一周热门 更多>