查看: 952|回复: 12
打印 上一主题 下一主题

C51中断里unsigned int不能用?

[复制链接] qrcode

580

主题

638

帖子

1860

积分

金牌会员

Rank: 6Rank: 6

积分
1860
楼主
跳转到指定楼层
发表于 2015-12-1 11:54 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用了一款STC的单片机,在定时器中断0里面有个数组的下标要累加,一开我定义为unsigned char Num;能够正常运转,现在由于数组变大,下标超过了255,我就定义为unsigned int Num;但是程序一运算Num++; 就死机了...

void timer0() interrupt 1
{
if(m_flag)
{
TH0 = Timer_speed[1]/256;
TL0 = Timer_speed[1]%256;
CK = 1;
m_flag = 0;
}
else
{
TH0 = Timer_speed[1]/256;
TL0 = Timer_speed[1]%256;
CK = 0;
m_flag = 1;

//----------------------------------------------------------------------
if(UP_flag) //加速部分
{
if(Speed_Count==0)
{
Speed_Count = Speed_Step; //每个定时器速度运算Speed_Step次
Timer_speed[1] = T1_time[T1_Num];//赋值定时器值
T1_Num++;
if(T1_Num>=500) //到达预定速度
{
UP_flag = False; //加速标志去除,进入匀速
UP_Count = 0;
T1_Num--;
}
UP_Count++;
if(UP_Count>=UP_Rate) //速度等级判断,当要求较慢速度时的调节
{
UP_flag = False;
UP_Count = 0;
T1_Num--;
}
}
}
Speed_Count--;
}
if(Down_flag&&(UP_flag==0)) //减速部分
{
if(Speed_Count==0)
{
Speed_Count = Speed_Step;
Timer_speed[1] = T1_time[T1_Num];
T1_Num--;
if((T1_Num<=1)||(Timer_speed[1]<=Timer_speed[0]))
{
Timer_speed[1] = Timer_speed[0]; //[0]是串口数据发来的速度的最低限制
Down_flag = False;
}
}
Speed_Count--;

}
if(Motor_Count {
Down_flag = True;
UP_flag = False;
}
Motor_Count--;
Motor_Count0--;
if(Motor_Count0==0)Motor_Stop();//电机停止初始值复位
}
程序有点长:具体意思就是一个步进电机的加速,匀速,减速,到停止
回复

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
沙发
发表于 2015-12-27 11:19 AM | 只看该作者
不是吧
跟中断,INT类型 没关系吧
重建个工程看看
回复 支持 反对

使用道具 举报

0

主题

3

帖子

8

积分

新手上路

Rank: 1

积分
8
板凳
发表于 2015-1-26 04:04 AM | 只看该作者
同意楼上的观点,你看一下程序的逻辑是否正确,是否死锁,还有要定义成全局变量……                                                                                                                                                                       
回复 支持 反对

使用道具 举报

1

主题

6

帖子

15

积分

新手上路

Rank: 1

积分
15
地板
发表于 2015-3-18 12:52 PM | 只看该作者
你的数组是存RAM里还是存ROM里啊?                                                                                                                                                                       
回复 支持 反对

使用道具 举报

21

主题

447

帖子

753

积分

高级会员

Rank: 4

积分
753
5#
发表于 2015-8-29 02:02 AM | 只看该作者
在哪声明的,是否内存溢出了?或者是在8位区内存申请了16位的RAM,建议在XDATA中申请                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
6#
发表于 2015-8-29 03:05 AM | 只看该作者
你试试把你的累加的数据NUM放到ROM里面,也就是 unsigned int code num=0;                                                                                                                                                                       
回复 支持 反对

使用道具 举报

15

主题

456

帖子

991

积分

高级会员

Rank: 4

积分
991
7#
发表于 2015-10-27 11:13 AM | 只看该作者
这种问题我也遇到过,51用unsigned char是正确的,因为就是8位的处理器。如果换成unsigned int,编译器不会报错,但是运行到那一步就会重启,这是编译器的问题。你要是非得用大于255的Num。建议你定义两个unsigned char,然后手动去定义他们之间的高低关系。不要信任编译器。                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
8#
发表于 2015-10-27 01:05 PM | 只看该作者
同意楼上的                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

10

帖子

22

积分

新手上路

Rank: 1

积分
22
9#
发表于 2015-10-27 03:54 PM | 只看该作者
和中断无关,你内存太小了
51也敢开这么大的数组
回复 支持 反对

使用道具 举报

15

主题

456

帖子

991

积分

高级会员

Rank: 4

积分
991
10#
发表于 2015-10-27 04:14 PM | 只看该作者
你怎么知道死机了?                                                                                                                                                                       
回复 支持 反对

使用道具 举报

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

本版积分规则

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