打印
[51单片机]

中断程序能修改全局变量值吗

[复制链接]
6045|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wu0hgl|  楼主 | 2016-4-5 22:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>

bit cmdArrived = 0;   //命令到达标志,即接收到上位机下发的命令
unsigned char cmdIndex = 0;
unsigned char *ptrTxd;
unsigned char cntTxd = 0;

unsigned char array1[1] = {1};
unsigned char array2[2] = {1,2};
unsigned char array3[4] = {1,2,3,4};
unsigned char array4[8] = {1,2,3,4,5,6,7,8};
void ConfigUART(unsigned int baud);
void main()
{
    EA = 1;  //开总中断
    ConfigUART(9600);  //配置波特率为9600
   
    while (1)
    {
                if(cmdArrived)
                {
                        cmdArrived = 0;
                        switch(cmdIndex)      C语言中 不是指针子程序不改变主函数的值
                        {
                                case 1:
                                        ptrTxd = array1;
                                        cntTxd = sizeof(array1);
                                        TI = 1;
                                        break;
                                case 2:
                                        ptrTxd = array2;
                                        cntTxd = sizeof(array2);
                                        TI = 1;
                                        break;
                                case 3:
                                        ptrTxd = array3;
                                        cntTxd = sizeof(array3);
                                        TI = 1;
                                        break;
                                case 4:
                                        ptrTxd = array4;
                                        cntTxd = sizeof(array4);
                                        TI = 1;
                                        break;
                                default:
                                        break;       
                        }       
                }
        
    }
}

void ConfigUART(unsigned int baud)
{
    SCON  = 0x50;  //配置串口为模式1
    TMOD &= 0x0F;  //清零T1的控制位
    TMOD |= 0x20;  //配置T1为模式2
    TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值
    TL1 = TH1;     //初值等于重载值
    ET1 = 0;       //禁止T1中断
    ES  = 1;       //使能串口中断
    TR1 = 1;       //启动T1
}

void InterruptUART() interrupt 4
{
    if (RI)  //接收到字节
    {
        RI = 0;  //清零接收中断标志位
                cmdIndex = SBUF;
                cmdArrived = 1;      
    }
    if (TI)  //字节发送完毕
    {
        TI = 0;  //清零发送中断标志位
                                if(cntTxd > 0)
                                {
                                        SBUF = *ptrTxd;
                                        cntTxd--;
                                        ptrTxd++;
                                }
        
    }
}

相关帖子

沙发
wu0hgl|  楼主 | 2016-4-5 22:19 | 只看该作者
上面cmdIndex值是怎么修改的

使用特权

评论回复
板凳
wu0hgl|  楼主 | 2016-4-5 22:25 | 只看该作者
C语言中

BaiduShurufa_2016-4-5_22-23-40.jpg (135.82 KB )

BaiduShurufa_2016-4-5_22-23-40.jpg

使用特权

评论回复
地板
yirongfu| | 2016-4-6 00:50 | 只看该作者
可以啊

使用特权

评论回复
5
wu0hgl|  楼主 | 2016-4-6 07:31 | 只看该作者

中断程序可以改变全局变量?

使用特权

评论回复
6
poorhack| | 2016-4-6 09:14 | 只看该作者
本帖最后由 poorhack 于 2016-4-6 09:18 编辑

你在这个例子里的printf函数中的i是全局变量i,不是add函数里的i,add函数里的i是局部变量,你可以把add(i)改成i=add(i)试试。

使用特权

评论回复
7
wu0hgl|  楼主 | 2016-4-6 11:42 | 只看该作者
poorhack 发表于 2016-4-6 09:14
你在这个例子里的printf函数中的i是全局变量i,不是add函数里的i,add函数里的i是局部变量,你可以把add(i ...

请问单片机中那个switch(cmdIndex)中 cmdIndex是怎么赋值的

使用特权

评论回复
8
wu0hgl|  楼主 | 2016-4-6 11:47 | 只看该作者
poorhack 发表于 2016-4-6 09:14
你在这个例子里的printf函数中的i是全局变量i,不是add函数里的i,add函数里的i是局部变量,你可以把add(i ...

中断程序没有返回cmdIndex

使用特权

评论回复
9
poorhack| | 2016-4-6 13:13 | 只看该作者
本帖最后由 poorhack 于 2016-4-6 13:14 编辑
wu0hgl 发表于 2016-4-6 11:47
中断程序没有返回cmdIndex

中断程序可以改变全局变量,你被你自己的C程序绕晕了

使用特权

评论回复
10
wu0hgl|  楼主 | 2016-4-6 13:14 | 只看该作者
poorhack 发表于 2016-4-6 13:13
中断程序可以改变全局变量

跪谢

使用特权

评论回复
11
ywlzh| | 2016-4-6 21:09 | 只看该作者
哈哈哈,回答你的问题,能!有一种情况,就是你的中断服务程序与全局变量的定义不在一个文件里,如果想要改变,就在中断服务程序的文件前声明一下这个变量,或着在头文件里声明,然后在中断服务程序的文件前#include一下你的头文件

使用特权

评论回复
12
Ketose| | 2016-4-6 21:18 | 只看该作者
当然可以。。。

使用特权

评论回复
13
不厉害| | 2018-8-18 23:04 | 只看该作者
怎么修改啊?

使用特权

评论回复
14
linqing171| | 2018-8-19 22:55 | 只看该作者
cmdIndex = SBUF; 这句改的啊。串口中断收到数之后,把SBUF里面收到的数放入了全局变量。

bit cmdArrived = 0;   //命令到达标志,即接收到上位机下发的命令
unsigned char cmdIndex = 0;
这两句前面最后加上volatile修饰一下。

如果你用终端的话,发ascii好一点,比如
cmdIndex = SBUF;  ===》  cmdIndex = SBUF & 0x07;
SBUF = *ptrTxd;     ===》 SBUF = 0x30 + *ptrTxd;

你3楼的应该是  i=add(i); 你把i传入到人家add函数里面了,人家里面的i和你外面的i不是一个东西。只是你的i通过函数名后面的括号传到他的i里面了。你把他的i都改成j,看起来方便一点。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝