打印

51单片机怎么产生38khz方波?

[复制链接]
8692|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ivanshi11|  楼主 | 2012-11-12 14:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit fb=P2^0;
uchar num;
void main()
{
TMOD=0x00;
TH0=(8192-12)/32;
TL0=(8192-12)%32;
EA=1;
ET0=1;
TR0=1;
fb=~fb;
}
void T0_time()interrupt 1
{
TH0=(8192-12)/32;
TH0=(8192-12)%32;

这个程序可以吗?我的晶振是11.多mhz,24个机器周期是26us左右,所以每计数12次就让p2^0电平取反,但是我用示波器测p2^0出来的方波是1khz多的,不知道为什么?我是想用38khz方波加电流放大电路来驱动红外led的
}

相关帖子

沙发
ljl457| | 2012-11-12 15:53 | 只看该作者
中断定时器重新赋值不对....

使用特权

评论回复
板凳
tcwdbtx1989| | 2012-11-13 08:54 | 只看该作者
思路很对,考察程序

使用特权

评论回复
地板
PZHengwf| | 2012-11-13 09:29 | 只看该作者
的确,思路是对的,定时器中断来完成。重新考虑赋值关系吧。在中断里反转信号引脚状态。

使用特权

评论回复
5
sherwood1314| | 2012-11-13 11:27 | 只看该作者
PWM 不是更直接吗??呵呵

使用特权

评论回复
6
hlzhaowu| | 2012-11-13 14:23 | 只看该作者
楼主的程序执行到最后就是在等待中断了,好像是少了些什么

使用特权

评论回复
7
wang1979| | 2012-11-13 16:36 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit fb=P2^0;
uchar num;
void main()
{
TMOD=0x00;
TH0=(8192-12)/32;
TL0=(8192-12)%32;
EA=1;
ET0=1;
TR0=1;
}
void T0_time()interrupt 1
{
TH0=(8192-12)/32;
TH0=(8192-12)%32;
fb=~fb;
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wm2590 + 1
8
wang1979| | 2012-11-13 16:37 | 只看该作者
应该是这样吧!

使用特权

评论回复
9
单片机匠| | 2012-11-14 10:40 | 只看该作者
本帖最后由 单片机匠 于 2012-11-14 11:19 编辑

1# ivanshi11
回楼主,首先,你程序是有问题的,在主程序main函数中,你应该加上while循环,让程序一直循环等待,等定时器溢出时再进入定时器中断,将P2.0取反,还有你给定时器赋初值也是不对的,可以参考我楼下给出的形式,不过我在写38KHZ的波形是也遇到过一个问题,我起初用的是定时方式1,但怎么也产生不了38KHZ的波形,很是纳闷费解,后来我改成了方式2可以按照理论产生相应频率的波形了,至于其他方式产生的频率为什么和理论计算相差甚远,我到现在还没搞明白。

使用特权

评论回复
10
单片机匠| | 2012-11-14 10:50 | 只看该作者
本帖最后由 单片机匠 于 2012-11-14 10:53 编辑

关于这个我还写了个测试程序,当然不是产生38KHZ,用的是定时器0,定时方式1,在定时中断中将单片机的一个管脚取反
TH0 = (65536-10)/256;
TL0 = (65536-10)%256;
用示波器观察结果如下:

当我把定时方式改为定时方式2,
TMOD = 0x02;
TH0 = 256-10;
TL0 = 256-10;

这样我再次用示波器观察波形如下:

使用特权

评论回复
11
zhenxing2000| | 2012-11-14 14:03 | 只看该作者
楼主是用于红外还是超声?
如果用中断方式的话,不能一直发送38Khz的方波,应该每隔N段时间后再发,给单片机一个反应时间。

使用特权

评论回复
12
hlzhaowu| | 2012-11-14 16:53 | 只看该作者
用单片机是完全能输出38KHZ的方波的,看楼主上载的程序确实是有不妥之处,主是是程序执行到最后就没有动作了,就只是等待中断,这样就算有中断也改变不了输出口的状态,那怎么能有方法输出。

使用特权

评论回复
13
闲来玩玩| | 2012-11-14 18:15 | 只看该作者
学习。

使用特权

评论回复
14
liuyongliuyong| | 2012-11-14 20:52 | 只看该作者
用定时中断产生!直接用一个计算初值的计算器,你要产生38KHz,大概是26us,每13us反转一次就行了!!!!

使用特权

评论回复
15
T_X_T| | 2012-11-14 21:36 | 只看该作者
实在不行用汇编,呵呵

使用特权

评论回复
16
Yang_Jia| | 2012-11-15 08:42 | 只看该作者
你应该把反转IO函数放到中断里。

使用特权

评论回复
17
woshixinshou| | 2012-11-15 11:27 | 只看该作者
奇怪了
为什么不用定时器2呢,好好的频率发生器不用,折腾中断啊~

使用特权

评论回复
18
zhhbncwu| | 2012-11-15 21:43 | 只看该作者
最好用定时器2按照工作方式2来产生。

使用特权

评论回复
19
zenith1032| | 2012-11-16 10:02 | 只看该作者
从头到尾我都没看见TF0 = 0;
中断标志会自动清0??

使用特权

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

本版积分规则

0

主题

1

帖子

0

粉丝