打印
[STC单片机]

STC15F204W定时器问题

[复制链接]
1456|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zwm111|  楼主 | 2017-5-5 17:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zwm111 于 2017-5-5 17:55 编辑
<div class="blockcode"><blockquote>#include "reg51.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr AUXR  = 0x8e;               //辅助寄存器
sfr S2CON = 0x9a;               //UART2 控制寄存器
sfr S2BUF = 0x9b;               //UART2 数据寄存器
sfr T2H   = 0xd6;               //定时器2高8位
sfr T2L   = 0xd7;               //定时器2低8位
sfr IE2   = 0xaf;               //中断控制寄存器2
WORD vel=0;
sbit P10=P1^0;
bit busy;

void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0xE0;                //设定定时初值
        T2H = 0xFE;                //设定定时初值
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x10;                //启动定时器2
}


void Timer0Init(void)                //10微秒@11.0592MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x02;                //设置定时器模式
        TL0 = 0x91;                //设置定时初值
        TH0 = 0x91;                //设置定时重载值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
    while (busy);               //等待前面的数据发送完成
    busy = 1;
    SBUF = dat;                 //写数据到UART数据寄存器
}

void main()
{
UartInit();
Timer0Init();
while(1);
}
void timer0 (void) interrupt 1
{
   if(vel==200)
   {
   P10=~P10;
   SendData(P10);
   vel=0;
   }
   vel++;
}
void Uart() interrupt 4 using 1
{
    if (RI)
    {
        RI = 0;                 //清除RI位
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    }
}

我想开启两个定时器,定时器0和定时器2,单个定时器我都能成功开通,但两个一起开,串口能正常工作,定时器0不能正常工作。串口信号送不出P10的值,单独开通串口能正常工作,不知我那里写错了,高手能指导下一二。

相关帖子

沙发
xyz549040622| | 2017-5-5 23:10 | 只看该作者
有可能是你定时器定时10us太短了,稍微执行个串口发送也不止这点时间,建议定时1ms看看效果。

使用特权

评论回复
板凳
ningling_21| | 2017-5-6 08:42 | 只看该作者
串口发送数据需要时间

使用特权

评论回复
地板
tanxiongjun| | 2017-5-9 21:57 | 只看该作者
你应该进定时器中断时候关闭定时器,执行完你定时器里面的程序就打开

使用特权

评论回复
5
liubeihua| | 2017-5-10 18:30 | 只看该作者
发送时关定时器发送完打开
TR0 = 0;
SendData(P10);
TR0 = 1;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝