C51中遇到一个有关data与xdata的问题,已解决

环境:

我在某个C文件定义了一个结构体变量,然后该变量只是在本文件内被一个函数使用,然后又在中断中调用了该函数,目的是改变一个IO口的输出状态,结果执行时怎么也达不到要的效果。

struct BE
{
	unsigned int	CountFR;	//定时器计数值,通过改变计数值改变音频频率
	unsigned char PWR_time; 	//开启时间,单位为10mS
	unsigned char FREQ_time; 	//音频供给时间,单位为10mS
	unsigned char index;	 	//音符计数,指示当前需要演奏的音符
};
struct BE Beep;

/*******************************************************************************
* 函 数 名 :Timer1Int
* 函数功能 :定时器1中断服务函数, 控制节拍时长 10ms
* 输    入 :无
* 输    出 :无
*******************************************************************************/
void Timer1Int()	interrupt 3	using 3 //采用中断3 控制频率	
{	
	if(flag == 1)
	{
		TH1=(65536-10000)/256;
		TL1=(65536-10000)%256;	//10ms定时
	//	BeepControl(); 
		Beep_control(); 
		return;
	}
	
		//--进入一次中断,表明计数到了65536--//
	Freq=Freq+65536;	
	
}	 

现象:

使用示波器查看IO口输出,奇葩的是当断开外设,引脚悬空时(51单片机输出默认是上拉为高的),在复位启动的情况下IO口输出正常,但是在断电启动的情况下,IO口输出异常;当引脚接外设,外设是一个三极管,连基极,如果很快断电重启,输出也为正常,只是偶尔会变形。在异常情况下,IO口输出一直保持低电平,但是另一个IO口输出正常,另一个IO口是在另一个优先级较高的定时器里实现的。模拟仿真时,输出波形也是对的,就是实时运行时不对。

/*******************************************************************************
* 函 数 名 :Timer0Int
* 函数功能 :定时器0中断函数 , 每隔TIME_MS ms进入
* 输    入 :无
* 输    出 :无
*******************************************************************************/
void Timer0Int() interrupt 1 using 1
{
	static unsigned int count1s = 0;
	
	if(flag == 1)
	{
			TH0=Beep.CountFR/256;	 
			TL0=Beep.CountFR%256;	
			BUZZER_IO = ~BUZZER_IO;	
			return;
	}


解决方法:

将该结构体变量添加data修饰就好了,如下:

data struct BE Beep;
现在还不知道为什么会这样,添加之后,可以看编译结果该变量存储到data区域了,反正后面运行均正常。具体原因,有时间再研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值