OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5482|回复: 5

求助串口数据控制定时器时间

[复制链接]

15

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-9-29
在线时间
19 小时
发表于 2019-9-29 17:37:37 | 显示全部楼层 |阅读模式
1金钱
想用串口接收到的数据控制定时器时间,实验时单片机对串口接收有反应,但不能有效控制,有什么方法吗

#include<reg52.h>

#include <stdio.h>

unsigned int num;

static unsigned int i;
       
sbit led0=P1^0;

//IP=0X10;
void main (void)
{
//
                IP=0X10;
    TMOD=0x21;
          EA = 1;

    TH0 = 0x0FC;
    TL0 = 0x66;

    ET0 = 1;
    TR0 = 1;

    TMOD = 0x20;
    SCON = 0x50;
          TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    ES = 1;
    TR1 = 1;
                while(1)
                {
                                if(num==i)
                                                {
                                                        num=0;
                                                        led0=~led0;
                                                }
                }
}

void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x0FF;
    TL0 = 0x9C;
    num++;
}

void UARTInterrupt(void) interrupt 4
{
    if(RI)
    {
                                i=SBUF;
        RI = 0;
    }

}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-9-30 03:25:32 | 显示全部楼层
回复

使用道具 举报

15

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-9-29
在线时间
19 小时
 楼主| 发表于 2019-9-30 18:00:18 | 显示全部楼层
问题应该出在定时器这块,可以返回正确数据

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
       
uint num;
uint i[1];
uchar flag;

sbit led=P2^0;

/*void delay100us(void)   
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=47;a>0;a--);
}*/


void main (void)
{
                IP|=0X10;
                TMOD|=0x21;       
                EA=1;
       
       
    TH0 = 0x0FC;
    TL0 = 0x18;
    ET0 = 1;
    TR0 = 1;

    SCON = 0x50;
    TH1 = 0xE6;
    TL1 = TH1;
    PCON = 0x00;
    ES = 1;
    TR1 = 1;
       
        while(1);
        /*{

                        if(num==i)
                        {
                                num=0;
                                led0=~led0;
                        }

        }*/
}


void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x0FC;
    TL0 = 0x18;
    num++;
        if(num==i[0])
        {
                num=0;
                led=~led;
        }
}
       
void UARTInterrupt(void) interrupt 4
{
        uint j;
    if(RI)
    {
        RI = 0;
        j=SBUF;
                        i[0]=j;
                        SBUF=i[0];
    }
    if(TI)
        TI = 0;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-10-4 01:18:30 | 显示全部楼层
帮顶
回复

使用道具 举报

5

主题

47

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2019-5-18
在线时间
101 小时
发表于 2019-10-19 21:37:24 | 显示全部楼层
while循环在判断串口接收数据与num相等后,先关闭定时器,再修改num的值,修改完成后再开启定时器
  1. while(1)
  2. {
  3.           if(num==i)
  4.           {
  5.                        TR0 = 0;
  6.                        num=0;
  7.                        led0=~led0;
  8.                       TR0 = 1;
  9.           }
  10. }
复制代码
回复

使用道具 举报

2

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2019-4-24
在线时间
78 小时
发表于 2019-10-22 23:02:23 来自手机 | 显示全部楼层
七月的风 发表于 2019-10-19 21:37
while循环在判断串口接收数据与num相等后,先关闭定时器,再修改num的值,修改完成后再开启定时器

这是不是对num有函数重入的意思?在whil中正在调用num,这个时候中断又调用了,导致错误,暂时关闭中断就是要避免这个错误的发生?在以后的程序中也要避免在中断中使用的数据在其他函数中只读取不修改这样行吗?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-1 04:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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