菜鸟求救。。。。

[复制链接]
 楼主| ljl457 发表于 2012-12-17 16:57 | 显示全部楼层 |阅读模式
sbit trig = P1^3;
unsigned int Dform_code[30]={0,1,0,1,0,1,0,1,0,1,
                             0,0,1,1,0,0,1,1,0,0,
                             1,1,0,0,1,1,0,0,1,1};
//定时器0中断程序
void T0int() interrupt 1
{
     BYTE i;
     trig = Dform_code[i];
     if(++i == 30) i = 0;          
}


晶振30M,MCU是用STC的,定时时间是2us,主函数就一些初始化,别的什么都没做。
最后用示波器测的波形周期不是预定的250K,这是为什么?
是不是这条语句运行的时间过长了: trig = Dform_code[i];
在仿真里面怎么看这个表达式运行花了多长时间?
编译器是用keil 3
 楼主| ljl457 发表于 2012-12-17 17:01 | 显示全部楼层
自己顶一个。。。。。。。
anazel 发表于 2012-12-17 17:10 | 显示全部楼层
i 是不是要定义成静态变量呢
 楼主| ljl457 发表于 2012-12-17 17:14 | 显示全部楼层
anazel 发表于 2012-12-17 17:10
i 是不是要定义成静态变量呢

试了一下,结果没变化。
dqyubsh 发表于 2012-12-17 17:16 | 显示全部楼层
2us对单片机来说都上天了,你看下反汇编,有多少条语句,加起来算一下中断时间。KEIL效率很低的,如果这款51不是RISC单片机,更别有太高指望。

评分

参与人数 1威望 +2 收起 理由
ljl457 + 2

查看全部评分

陌上桑 发表于 2012-12-17 17:20 | 显示全部楼层
本人亲自尝试,在STC89C52单片机中,晶振11.0592,程序每执行一步大概用时间就是2us。建议楼主以后再50us一下的程序中不要使用延时函数,可以用for循环。这样做比较准确,特别是串口通讯的时候······

评分

参与人数 1威望 +2 收起 理由
ljl457 + 2

查看全部评分

 楼主| ljl457 发表于 2012-12-17 17:28 | 显示全部楼层
多谢5楼6楼。
uet_cache 发表于 2012-12-17 17:29 | 显示全部楼层
赋值语句不会费很长时间。程序运行跟编译器没关系。i定义的局问好变量,没定义成静态变量,每次进中断函数,重新初始化赋值为0. trig永远是0。至于定时周期,只跟你定时器有关,你检查你的定时器是自动重装载模式还是16位计数模式,如果是16位计数模式,每次进中断,TH TL需重新赋值。
uet_cache 发表于 2012-12-17 17:31 | 显示全部楼层
仿真时,看不到运行时长,另外你的晶振30M,可以看下是不是允许的。看下手册的晶振要求范围。
 楼主| ljl457 发表于 2012-12-17 17:38 | 显示全部楼层
uet_cache 发表于 2012-12-17 17:29
赋值语句不会费很长时间。程序运行跟编译器没关系。i定义的局问好变量,没定义成静态变量,每次进中断函数 ...

i 变量已经在3楼的建议下 加上了static,可是效果没变。我定时器用的是八位自动重装的,所以不用赋值,我的波形是能出来 就是频率不对。
 楼主| ljl457 发表于 2012-12-17 17:41 | 显示全部楼层
uet_cache 发表于 2012-12-17 17:31
仿真时,看不到运行时长,另外你的晶振30M,可以看下是不是允许的。看下手册的晶振要求范围。 ...

30M晶振我们用很久了,应该没什么问题,还有个现象就是如果我在中断函数中只执行 trig = !trig;这条语句,就能出来250K的波形。所以我怀疑是不是定时时间不够用。
qiliangzhong 发表于 2012-12-17 19:20 | 显示全部楼层
你的语句执行时间太长了,对于精确定时2uS
uet_cache 发表于 2012-12-17 20:57 | 显示全部楼层
trig 是位变量 ,赋值是INT值,所以不行,需要位数组定义
开启电子 发表于 2012-12-17 21:36 | 显示全部楼层
我认为是楼主没有考虑中断服务函数所占用的时间,其中  if(++i == 30) i = 0;  占用的时间较久。
前功尽弃 发表于 2012-12-18 08:54 | 显示全部楼层
这个定时器的中断标志位都不软件清零的,中断就只能执行一次
 楼主| ljl457 发表于 2012-12-18 09:19 | 显示全部楼层
uet_cache 发表于 2012-12-17 20:57
trig 是位变量 ,赋值是INT值,所以不行,需要位数组定义

请问位数组要怎么定义?
ruiwei0201 发表于 2012-12-18 09:35 | 显示全部楼层
变量i都没有赋初值!
uet_cache 发表于 2012-12-18 10:12 | 显示全部楼层
位数组定义是非法的。你可以自己 定义一个全局位变量,在主函数中进行I变量的变化,在中断函数中使用对IO进行赋值,赋的值在主函数中提前定义好。另外,还要定义一个全局标志位,每中断进行,标志需要赋值,在主函数中根据此标志进行I的变化,同时将此值清0。这样中断函数里面的语句只有2个,且都是位赋值语句。中断函数执行时间会缩到最短。你试下,看能不能满足要求。如果不能满足要求,就只能用查询方式输出。

评分

参与人数 1威望 +2 收起 理由
ljl457 + 2

查看全部评分

corpsee 发表于 2012-12-18 13:54 | 显示全部楼层
来学习一下
shenglong127 发表于 2012-12-18 22:31 | 显示全部楼层
i要定义为全局变量或静态变量。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

96

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部