找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 2277 | 评论数: 8 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-8-14 10:33

正文摘要:

我用的是STC8G1K08-38I-SOP16单片机,串口1与定时器0的初始化都是参照STC-ISP生成的,但是两个中断优先级都处于最低级(PS=0;PT0=0),向屏幕发送数据并显示所发送的数据,却没有显示。即使只是在主程序定时器0初始 ...

回复

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 在代码中添加了定时器中断程序,的确是这样.

查看全部评分

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??就不能正常显示。并且这已经是我的全部代码了,并没有隐藏
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中断与串口中断不会互扰,只有在不恰当使用中断才会发生上述意外。楼主代码不全,看不出楼主想实现的具体功能,也就无法给出具体建议。
ID:861694 发表于 2023-8-14 17:26

应该不是这个问题,串口1的IO口直接用就好了,不用专门配置
ID:213173 发表于 2023-8-14 16:11

ID:861694 发表于 2023-8-14 14:31
tyrl800 发表于 2023-8-14 13:40
定时器0没有中断函数,程序跑飞了

我刚才按层主的意思去把定时器0 中断使能关了(ET0 = 0),程序能正常运行,但是我把串口2中断使能开了,并且没写中断函数,程序也能正常运行,请问这是咋回事儿呀?
ID:275826 发表于 2023-8-14 13:40
定时器0没有中断函数,程序跑飞了

评分

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

查看全部评分

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

Powered by 单片机教程网

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