[STC单片机] STC15F204W定时器问题

[复制链接]
1773|4
 楼主| zwm111 发表于 2017-5-5 17:52 | 显示全部楼层 |阅读模式
本帖最后由 zwm111 于 2017-5-5 17:55 编辑
  1. <div class="blockcode"><blockquote>#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.    vel=0;
  55.    }
  56.    vel++;
  57. }
  58. void Uart() interrupt 4 using 1
  59. {
  60.     if (RI)
  61.     {
  62.         RI = 0;                 //清除RI位
  63.     }
  64.     if (TI)
  65.     {
  66.         TI = 0;                 //清除TI位
  67.         busy = 0;               //清忙标志
  68.     }
  69. }

我想开启两个定时器,定时器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 | 显示全部楼层
你应该进定时器中断时候关闭定时器,执行完你定时器里面的程序就打开
liubeihua 发表于 2017-5-10 18:30 | 显示全部楼层
发送时关定时器发送完打开
TR0 = 0;
SendData(P10);
TR0 = 1;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部