搜索
bottom↓
回复: 3

【求助】51的定时器0无法在使用2个串口时起效

[复制链接]

出0入0汤圆

发表于 2017-4-30 21:07:54 | 显示全部楼层 |阅读模式
本帖最后由 墨逸、 于 2017-4-30 21:44 编辑

如题    在同时使用串口一串口二和定时器0时遇到问题,定时器0无法正常进入中断,求问是哪里配置错了呢?


//串口一初始化函数
  1. void InitUart1()                //初始化串口1
  2. {
  3.         PCON &= 0x7F;                //波特率不倍速
  4.         SCON = 0x50;                //8位数据,可变波特率
  5.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  6.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  7.         TMOD &= 0x0F;                //清除定时器1模式位
  8.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  9.         TL1 = 0xFA;                //设定定时初值
  10.         TH1 = 0xFA;                //设定定时器重装值
  11.         ET1 = 0;                //禁止定时器1中断
  12.         TR1 = 1;                //启动定时器1
  13.   ES = 1;                 //Enable UART1 interrupt
  14. }
复制代码

  1. //串口2初始化函数
  2. void InitUart2(void)
  3. {
  4.                 AUXR &= 0xF7;                //波特率不倍速
  5.                 S2CON = 0x50;                //8位数据,可变波特率
  6.                 AUXR |= 0x04;                //独立波特率发生器时钟为Fosc,即1T
  7.                 BRT = 0xFA;                //设定独立波特率发生器重装值
  8.                 AUXR |= 0x10;                //启动独立波特率发生器
  9.                 IE2 = 0x01;             //Enable UART2 interrupt
  10. }
复制代码

  1. //定时器0初始化函数
  2. void Timer0Init(void)                //10毫秒@22.1184MHz
  3. {
  4.         AUXR |= 0x80;                //定时器时钟1T模式
  5.         TMOD &= 0xF0;                //设置定时器模式
  6.         TMOD |= 0x01;                //设置定时器模式
  7.         TL0 = 0xCD;                //设置定时初值
  8.         TH0 = 0xD4;                //设置定时初值
  9.         TF0 = 0;                //清除TF0标志
  10.         TR0 = 1;                //定时器0开始计时
  11.         EA=1;
  12. }
复制代码
  1. //系统初始化函数
  2. void Sys_Init()
  3. {
  4.         LED=LED_CLOSE;
  5.        
  6.         LCD_Init();
  7.         DelayMs(100);
  8.         LCD_Clear();
  9.         DelayMs(100);
  10.         LCD_Write_String(7,0,"OK");
  11.         InitUart1();                        //初始化串口1
  12.         DelayMs(10);                                                //该延时不可去掉,否则程序卡死
  13.         InitUart2();                        //初始化串口2
  14.         DelayMs(10);                                                //该延时不可去掉,否则程序卡死
  15.         Timer0Init();
  16.         EA=1;
  17. }
复制代码

目前大致知道是AUXR和寄存器TMOD配置有问题,可能是出在那个  TMOD &= 0x0F;  和AUXR &= 0xF7;
但是不知道怎么配置才是正确的

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2017-4-30 21:08:56 | 显示全部楼层
单片机型号是  STC12C5A60S2

出0入0汤圆

发表于 2017-7-8 00:07:38 | 显示全部楼层
中断优先级设置正确吗?

出145入215汤圆

发表于 2017-8-28 05:50:47 来自手机 | 显示全部楼层
查看一下是不是定时器被用作波特率发生器了,51会占用一个定时器做波特率发生器的。如果没有修改优先级是会有默认优先级的,还有就是如果串口是高优先中断,低级别的是不能打断高优先的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 17:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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