打印

菜鸟求救。。。。

[复制链接]
3397|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 是不是要定义成静态变量呢

试了一下,结果没变化。

使用特权

评论回复
5
dqyubsh| | 2012-12-17 17:16 | 只看该作者
2us对单片机来说都上天了,你看下反汇编,有多少条语句,加起来算一下中断时间。KEIL效率很低的,如果这款51不是RISC单片机,更别有太高指望。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
ljl457 + 2
6
陌上桑| | 2012-12-17 17:20 | 只看该作者
本人亲自尝试,在STC89C52单片机中,晶振11.0592,程序每执行一步大概用时间就是2us。建议楼主以后再50us一下的程序中不要使用延时函数,可以用for循环。这样做比较准确,特别是串口通讯的时候······

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
ljl457 + 2
7
ljl457|  楼主 | 2012-12-17 17:28 | 只看该作者
多谢5楼6楼。

使用特权

评论回复
8
uet_cache| | 2012-12-17 17:29 | 只看该作者
赋值语句不会费很长时间。程序运行跟编译器没关系。i定义的局问好变量,没定义成静态变量,每次进中断函数,重新初始化赋值为0. trig永远是0。至于定时周期,只跟你定时器有关,你检查你的定时器是自动重装载模式还是16位计数模式,如果是16位计数模式,每次进中断,TH TL需重新赋值。

使用特权

评论回复
9
uet_cache| | 2012-12-17 17:31 | 只看该作者
仿真时,看不到运行时长,另外你的晶振30M,可以看下是不是允许的。看下手册的晶振要求范围。

使用特权

评论回复
10
ljl457|  楼主 | 2012-12-17 17:38 | 只看该作者
uet_cache 发表于 2012-12-17 17:29
赋值语句不会费很长时间。程序运行跟编译器没关系。i定义的局问好变量,没定义成静态变量,每次进中断函数 ...

i 变量已经在3楼的建议下 加上了static,可是效果没变。我定时器用的是八位自动重装的,所以不用赋值,我的波形是能出来 就是频率不对。

使用特权

评论回复
11
ljl457|  楼主 | 2012-12-17 17:41 | 只看该作者
uet_cache 发表于 2012-12-17 17:31
仿真时,看不到运行时长,另外你的晶振30M,可以看下是不是允许的。看下手册的晶振要求范围。 ...

30M晶振我们用很久了,应该没什么问题,还有个现象就是如果我在中断函数中只执行 trig = !trig;这条语句,就能出来250K的波形。所以我怀疑是不是定时时间不够用。

使用特权

评论回复
12
qiliangzhong| | 2012-12-17 19:20 | 只看该作者
你的语句执行时间太长了,对于精确定时2uS

使用特权

评论回复
13
uet_cache| | 2012-12-17 20:57 | 只看该作者
trig 是位变量 ,赋值是INT值,所以不行,需要位数组定义

使用特权

评论回复
14
开启电子| | 2012-12-17 21:36 | 只看该作者
我认为是楼主没有考虑中断服务函数所占用的时间,其中  if(++i == 30) i = 0;  占用的时间较久。

使用特权

评论回复
15
前功尽弃| | 2012-12-18 08:54 | 只看该作者
这个定时器的中断标志位都不软件清零的,中断就只能执行一次

使用特权

评论回复
16
ljl457|  楼主 | 2012-12-18 09:19 | 只看该作者
uet_cache 发表于 2012-12-17 20:57
trig 是位变量 ,赋值是INT值,所以不行,需要位数组定义

请问位数组要怎么定义?

使用特权

评论回复
17
ruiwei0201| | 2012-12-18 09:35 | 只看该作者
变量i都没有赋初值!

使用特权

评论回复
18
uet_cache| | 2012-12-18 10:12 | 只看该作者
位数组定义是非法的。你可以自己 定义一个全局位变量,在主函数中进行I变量的变化,在中断函数中使用对IO进行赋值,赋的值在主函数中提前定义好。另外,还要定义一个全局标志位,每中断进行,标志需要赋值,在主函数中根据此标志进行I的变化,同时将此值清0。这样中断函数里面的语句只有2个,且都是位赋值语句。中断函数执行时间会缩到最短。你试下,看能不能满足要求。如果不能满足要求,就只能用查询方式输出。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
ljl457 + 2
19
corpsee| | 2012-12-18 13:54 | 只看该作者
来学习一下

使用特权

评论回复
20
shenglong127| | 2012-12-18 22:31 | 只看该作者
i要定义为全局变量或静态变量。

使用特权

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

本版积分规则

13

主题

96

帖子

0

粉丝