找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1108|回复: 8
打印 上一主题 下一主题
收起左侧

关于单片机定时器0与串口1优先级问题

[复制链接]
跳转到指定楼层
楼主
我用的是STC8G1K08-38I-SOP16单片机,串口1与定时器0的初始化都是参照STC-ISP生成的,但是两个中断优先级都处于最低级(PS=0;PT0=0),向屏幕发送数据并显示所发送的数据,却没有显示。即使只是在主程序定时器0初始化,没有定时器0中断函数,也会这样。当设置PS=1;PT0=0 或者注释掉主程序的定时器0初始化,程序就可以正常运行了。请大家帮忙看看
  1. //定时器0初始化函数
  2. void Timer0_Init(void)                //500微秒@6.000MHz
  3. {
  4.         AUXR |= 0x80;                //定时器时钟1T模式
  5.         TMOD &= 0xF0;                //设置定时器模式
  6.         TL0 = 0x90;                //设置定时初值
  7.         TH0 = 0xE8;                //设置定时初值
  8.         TF0 = 0;                //清除TF0标志
  9.         TR0 = 1;                //定时器0开始计时
  10.         
  11.         ET0 = 1;
  12.         PT0 = 0;
  13. }

  14. //串口1初始化函数
  15. void Uart1_Init(void)                //57600bps@6.000MHz
  16. {
  17.         SCON = 0x50;                        //8位数据,可变波特率
  18.         AUXR |= 0x40;                        //定时器1时钟为Fosc,即1T
  19.         AUXR &= 0xFE;                        //串口1选择定时器1为波特率发生器
  20.         TMOD &= 0x0F;                        //设定定时器1为16位自动重装方式
  21.         TL1 = 0xE6;                                //设定定时初值
  22.         TH1 = 0xFF;                                //设定定时初值
  23.         ET1 = 0;                                //禁止定时器1中断
  24.         TR1 = 1;                                //启动定时器1
  25.         
  26.         ES = 1;
  27.         PS = 0;                                        //串口1 优先级 较低
  28. }

  29. //串口1中断
  30. void Uart1_Routine(void) interrupt 4
  31. {
  32.         if(TI==1)
  33.         {
  34.                 TI = 0;
  35.         }
  36.         
  37.         if(RI==1)
  38.         {
  39.                 RI = 0;
  40.                 if(F_RX1_OK==0)
  41.                 {
  42.                         R_data = SBUF;
  43.                         T_data = R_data;
  44.                         F_RX1_OK = 1;
  45.                 }
  46.         }
  47. }

  48. void main(void)
  49. {
  50.         EA = 1;
  51.         P1M0 |= 0x40;
  52.         P1M1 = 0;
  53.         Timer0_Init();
  54.         Uart1_Init();
  55.         Light = 1;
  56.         while(1)
  57.         {
  58.                 if(F_RX1_OK==1)
  59.                 {
  60.                         SBUF = T_data;
  61.                         F_RX1_OK = 0;
  62.                 }
  63.         }
  64. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:275826 发表于 2023-8-14 13:40 | 只看该作者
定时器0没有中断函数,程序跑飞了

评分

参与人数 1黑币 +10 收起 理由
戡拤 + 10 正是如此,谢谢解答

查看全部评分

回复

使用道具 举报

板凳
ID:861694 发表于 2023-8-14 13:45 | 只看该作者
就像这样,向芯片发送0x66,接收缓冲区并没有显示0x66

串口1、定时器0.png (14.69 KB, 下载次数: 56)

串口1、定时器0.png
回复

使用道具 举报

地板
ID:861694 发表于 2023-8-14 14:31 | 只看该作者
tyrl800 发表于 2023-8-14 13:40
定时器0没有中断函数,程序跑飞了

我刚才按层主的意思去把定时器0 中断使能关了(ET0 = 0),程序能正常运行,但是我把串口2中断使能开了,并且没写中断函数,程序也能正常运行,请问这是咋回事儿呀?
回复

使用道具 举报

5#
ID:213173 发表于 2023-8-14 16:11 | 只看该作者

回复

使用道具 举报

6#
ID:861694 发表于 2023-8-14 17:26 | 只看该作者

应该不是这个问题,串口1的IO口直接用就好了,不用专门配置
回复

使用道具 举报

7#
ID:213173 发表于 2023-8-14 21:20 | 只看该作者
戡拤 发表于 2023-8-14 17:26
应该不是这个问题,串口1的IO口直接用就好了,不用专门配置

串口1的IO口是不用专门配置,P3.0、P3.1默认准双向,但其它所有IO口均为高阻,必须按需求进行配置。楼主只对P1口做配置,难道其它P3、P5的IO口都没有使用?正常情况T1中断与串口中断不会互扰,只有在不恰当使用中断才会发生上述意外。楼主代码不全,看不出楼主想实现的具体功能,也就无法给出具体建议。
回复

使用道具 举报

8#
ID:861694 发表于 2023-8-15 17:25 | 只看该作者
wulin 发表于 2023-8-14 21:20
串口1的IO口是不用专门配置,P3.0、P3.1默认准双向,但其它所有IO口均为高阻,必须按需求进行配置。楼主 ...

我就配置了P1.6口做为LED提示,我的目的是:电脑向串口1发送 0x??,然后0x??,在STC-ISP自带的串口助手上的接收缓冲区显示。然而在实验中,只要出现定时器0初始化,0x??就不能正常显示。并且这已经是我的全部代码了,并没有隐藏
回复

使用道具 举报

9#
ID:213173 发表于 2023-8-15 21:32 | 只看该作者
戡拤 发表于 2023-8-15 17:25
我就配置了P1.6口做为LED提示,我的目的是:电脑向串口1发送 0x??,然后0x??,在STC-ISP自带的串口助手上 ...

核心问题是你开了定时器0中断,但没有T0中断函数导致出错


  1. #include <STC8G.H>

  2. sbit LED=P1^6;
  3. unsigned char R_data;
  4. bit F_RX1_OK;
  5. bit busy;

  6. //定时器0初始化函数
  7. void Timer0_Init(void)                //65毫秒@11.0592MHz
  8. {
  9.         AUXR &= 0x7F;                        //定时器时钟12T模式
  10.         TMOD &= 0xF0;                        //设置定时器模式
  11.         TL0 = 0x00;                                //设置定时初始值
  12.         TH0 = 0x16;                                //设置定时初始值
  13.         TF0 = 0;                                //清除TF0标志
  14.         TR0 = 1;                                //定时器0开始计时
  15. }
  16. //串口1初始化函数
  17. void Uart1_Init(void)                //57600bps@11.0592MHz
  18. {
  19.         SCON = 0x50;                //8位数据,可变波特率
  20.         AUXR |= 0x40;                //定时器时钟1T模式
  21.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  22.         TMOD &= 0x0F;                //设置定时器模式
  23.         TL1 = 0xD0;                        //设置定时初始值
  24.         TH1 = 0xFF;                        //设置定时初始值
  25.         ET1 = 0;                        //禁止定时器中断
  26.         TR1 = 1;                        //定时器1开始计时}
  27. }

  28. void main(void)
  29. {
  30.         P1M0 = 0x40;
  31.         P1M1 = 0x00;
  32.         P3M0 = 0x00;
  33.         P3M1 = 0x00;
  34.         P5M0 = 0x40;
  35.         P5M1 = 0x00;
  36.         Timer0_Init();
  37.         Uart1_Init();
  38.         EA = 1;
  39.         ET0= 1;
  40.         ES = 1;     
  41.         busy = 0;
  42.         while(1)
  43.         {
  44.                 if(F_RX1_OK==1)
  45.                 {
  46.                         F_RX1_OK = 0;
  47.                         while (busy);
  48.                         busy = 1;
  49.                         SBUF = R_data;
  50.                 }
  51.         }
  52. }
  53. //T0中断
  54. void Timer0Interrupt(void) interrupt 1
  55. {
  56.         LED=~LED;
  57. }
  58. //串口1中断
  59. void Uart1_Routine(void) interrupt 4
  60. {
  61.         if(TI)
  62.         {
  63.                 TI = 0;
  64.                 busy=0;
  65.         }
  66.         if(RI)
  67.         {
  68.                 RI = 0;
  69.                 R_data = SBUF;
  70.                 F_RX1_OK = 1;
  71.         }
  72. }
复制代码



评分

参与人数 1黑币 +10 收起 理由
戡拤 + 10 在代码中添加了定时器中断程序,的确是这样.

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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