OpenEdv-开源电子网

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

请问为什么另一个c文件中定义的全局变量在main.c中调用不了?

[复制链接]

20

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-7-19
在线时间
31 小时
发表于 2017-11-2 22:03:54 | 显示全部楼层 |阅读模式
20金钱
我最近在做小车,用定时器调制PWM脉冲控制速度,控制占空比的变量在motor.c中有定义,我主函数中想去改变这个变量的值来改变占空比控制电机的速度
下面这种写法是可以的
1.PNG 2.PNG 3.PNG 4.PNG


但是这种这一种写法就不行,在主程序里面只要给ZKB赋值ZKB就一直保持为0
11.PNG 22.PNG 44.PNG

请问为什么在main函数中调用其它c文件中定义的变量就会出错呢?[mw_shl_code=c,true]#include "Motor.h"

//extern ZKB;

void main(void)
{
        MotorInit();
       
        while(1)
        {
                PWM_change();
        }
}

#ifndef        __MOTOR_H_
#define        __MOTOR_H_

#include <reg52.h>

#define uchar        unsigned char

//#define                GoForward        { Left_Ctrl = 1; Right_Ctrl = 1; Left_IN1 = 1;        Left_IN2 = 0; Right_IN1 = 1; Right_IN2 = 0;}
//#define                Stop                { Left_Ctrl = 0; Right_Ctrl = 0; }
//#define                TurnLeft        { Left_Ctrl = 1; Right_Ctrl = 1; Left_IN1 = 0;        Left_IN2 = 1; Right_IN1 = 1; Right_IN2 = 0;        }
//#define                TurnRight        { Left_Ctrl = 1; Right_Ctrl = 1; Left_IN1 = 1;        Left_IN2 = 0; Right_IN1 = 0; Right_IN2 = 1;        }

#define                GoForward        P2  = 0XAF
#define                Stop                P2 &= 0XF3
#define                TurnLeft        P2  = 0X9F
#define                TurnRight        P2  = 0X6F

sbit        Left_IN1  = P2^7;
sbit        Left_IN2  = P2^6;
sbit        Left_Ctrl = P2^3;

sbit        Right_IN1 = P2^5;
sbit        Right_IN2 = P2^4;
sbit        Right_Ctrl= P2^2;

void        MotorInit(void);
void    PWM_change(void);

#endif


#include "Motor.h"
#include "delay.h"
uchar        counter;
uchar        ZKB;
uchar        ZKB_UpperLimit;

void    PWM_change(void)
{
        uchar i;
        for(i=0;i<200;i++)
        {
                ZKB=i;
                delayms(2);
        }
        for(i=200;i>0;i--)
        {
                ZKB=i;
                delayms(2);
        }
}

void        MotorInit(void)
{
//PWM为500Hz,单周期2MS,设置20级调速,每次中断函数处理时间为100个单指令周期
       
        EA = 1;
        ET0 = 1;
       
        TMOD = 0x02;                        //定时器0自动重载
        TH0 = 0x9C;
        TL0 = 0x9C;
        TR0 = 1;
       
        counter = 0;
        ZKB_UpperLimit = 200;
       
        ZKB = 0.5 * ZKB_UpperLimit;
}

void        Motor_INT()        interrupt        1
{
        counter++;
        if (counter <= ZKB)
        {
                GoForward;
        }
       
        if (counter > ZKB)
        {
                Stop;
        }
       
        if (counter >= ZKB_UpperLimit)
        {
                counter = 0;
        }
}
[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

A.c文件 [mw_shl_code=c,true]//A.c #include A.h int nTmp = 0;[/mw_shl_code] A.h文件 [mw_shl_code=c,true]//A.h extern int nTmp;[/mw_shl_code] main.c文件 [mw_shl_code=applescript,true]//main.c #include A.h //这里可以用nTmp了[/mw_shl_code]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

982

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7862
金钱
7862
注册时间
2014-8-13
在线时间
1584 小时
发表于 2017-11-2 22:03:55 | 显示全部楼层
本帖最后由 mack13013 于 2017-11-3 00:20 编辑

A.c文件
[mw_shl_code=c,true]//A.c
#include A.h
int nTmp = 0;[/mw_shl_code]

A.h文件
[mw_shl_code=c,true]//A.h
extern int nTmp;[/mw_shl_code]

main.c文件
[mw_shl_code=applescript,true]//main.c
#include A.h
//这里可以用nTmp了[/mw_shl_code]

回复

使用道具 举报

20

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-7-19
在线时间
31 小时
 楼主| 发表于 2017-11-2 22:07:50 | 显示全部楼层
不知道我描述清楚没
回复

使用道具 举报

20

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-7-19
在线时间
31 小时
 楼主| 发表于 2017-11-2 22:08:03 | 显示全部楼层
@正点原子 求助原子哥
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-5-20
在线时间
12 小时
发表于 2017-11-2 22:46:20 | 显示全部楼层
extern 数据类型 变量名,会不会因为在main.c声明时没有加数据类型,
回复

使用道具 举报

20

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-7-19
在线时间
31 小时
 楼主| 发表于 2017-11-3 13:19:18 | 显示全部楼层

谢谢。。。。
回复

使用道具 举报

20

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-7-19
在线时间
31 小时
 楼主| 发表于 2017-11-3 13:19:37 | 显示全部楼层
justin2 发表于 2017-11-2 22:46
extern 数据类型 变量名,会不会因为在main.c声明时没有加数据类型,

好的,谢谢。
回复

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2017-11-8 21:24:58 | 显示全部楼层
没加数据类型啊,其他没毛病
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 21:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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