找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3330|回复: 3
收起左侧

STC15F204W开双定时器问题

[复制链接]
ID:16695 发表于 2017-5-5 21:58 | 显示全部楼层 |阅读模式
  1. #include "reg51.h"
  2. #include "intrins.h"

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

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


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

  33. /*----------------------------
  34. 发送串口数据
  35. ----------------------------*/
  36. void SendData(BYTE dat)
  37. {
  38.     while (busy);               //等待前面的数据发送完成
  39.     busy = 1;
  40.     SBUF = dat;                 //写数据到UART数据寄存器
  41. }

  42. void main()
  43. {
  44. UartInit();
  45. Timer0Init();
  46. while(1);
  47. }
  48. void timer0 (void) interrupt 1
  49. {
  50.    if(vel==200)
  51.    {
  52.    P10=~P10;
  53.    SendData(P10);
  54.    }
  55.    vel++;
  56. }
  57. void Uart() interrupt 4 using 1
  58. {
  59.     if (RI)
  60.     {
  61.         RI = 0;                 //清除RI位
  62.     }
  63.     if (TI)
  64.     {
  65.         TI = 0;                 //清除TI位
  66.         busy = 0;               //清忙标志
  67.     }
  68. }
复制代码
      我想开启两个定时器,定时器0和定时器2,定时器0做定时使用,定时器2做串口调试使用,单个定时器我都能成功开通,但两个一起开,串口能正常工作,定时器0不能正常工作。串口读取不到P10送出的值,单独开通串口能正常工作,不知我那里写错了,会的朋友能指导下。
回复

使用道具 举报

ID:474677 发表于 2019-2-4 11:21 | 显示全部楼层
传统51的串口是使用T1定时器的,楼主用的STC15F204W是STC自行扩展的标准,要使用STC的头文件才能用上T2产生波特率,建议楼主仔细看下STC数据手册和例程
回复

使用道具 举报

ID:155507 发表于 2019-2-4 16:21 | 显示全部楼层
之所以不能使用串口中断,是因为你的定时器设置太小,已经等于小于串口机器周期。而定时器中断优先级高于串口中断,所以不能执行串口中断。解决方法1定时器时间改长一点2把串口优先级设高于定时器。
回复

使用道具 举报

ID:47286 发表于 2019-2-5 03:23 | 显示全部楼层
我也是你这么用的 都挺好 你对比一下 另外 11.0592下 10微秒太小了 0误差至少要17微秒

下面是定时器0的初始化 上面是官网 下面是你的 对比一下
/*STC官网范例
void Timer0Init(void)                //5毫秒@11.0592MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0x00;                        //设置定时初值
        TH0 = 0x28;                        //设置定时初值
        TF0 = 0;                        //清除TF0标志
        TR0 = 1;                        //定时器0开始计时
}*/
//你的程序
void Timer0Init(void)                //10微秒@11.0592MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x02;                //设置定时器模式
        TL0 = 0x91;                //设置定时初值
        TH0 = 0x91;                //设置定时重载值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}
//串口初始化
//你的程序
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 Init_UART1()                //串口初始化 1T/定时器2作波特率发生器
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = BAUD1L;                //设定定时初值
        T2H = BAUD1H;                //设定定时初值
        AUXR |= 0x10;                //启动定时器2
        ES=1;                                //开串口中断
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表