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

[复制链接]
9542|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 | 显示全部楼层
的确,思路是对的,定时器中断来完成。重新考虑赋值关系吧。在中断里反转信号引脚状态。
sherwood1314 发表于 2012-11-13 11:27 | 显示全部楼层
PWM 不是更直接吗??呵呵
hlzhaowu 发表于 2012-11-13 14:23 | 显示全部楼层
楼主的程序执行到最后就是在等待中断了,好像是少了些什么
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

查看全部评分

wang1979 发表于 2012-11-13 16:37 | 显示全部楼层
应该是这样吧!
单片机匠 发表于 2012-11-14 10:40 | 显示全部楼层
本帖最后由 单片机匠 于 2012-11-14 11:19 编辑

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

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

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
zhenxing2000 发表于 2012-11-14 14:03 | 显示全部楼层
楼主是用于红外还是超声?
如果用中断方式的话,不能一直发送38Khz的方波,应该每隔N段时间后再发,给单片机一个反应时间。
hlzhaowu 发表于 2012-11-14 16:53 | 显示全部楼层
用单片机是完全能输出38KHZ的方波的,看楼主上载的程序确实是有不妥之处,主是是程序执行到最后就没有动作了,就只是等待中断,这样就算有中断也改变不了输出口的状态,那怎么能有方法输出。
闲来玩玩 发表于 2012-11-14 18:15 | 显示全部楼层
学习。
liuyongliuyong 发表于 2012-11-14 20:52 | 显示全部楼层
用定时中断产生!直接用一个计算初值的计算器,你要产生38KHz,大概是26us,每13us反转一次就行了!!!!
T_X_T 发表于 2012-11-14 21:36 | 显示全部楼层
实在不行用汇编,呵呵
Yang_Jia 发表于 2012-11-15 08:42 | 显示全部楼层
你应该把反转IO函数放到中断里。
woshixinshou 发表于 2012-11-15 11:27 | 显示全部楼层
奇怪了
为什么不用定时器2呢,好好的频率发生器不用,折腾中断啊~
zhhbncwu 发表于 2012-11-15 21:43 | 显示全部楼层
最好用定时器2按照工作方式2来产生。
zenith1032 发表于 2012-11-16 10:02 | 显示全部楼层
从头到尾我都没看见TF0 = 0;
中断标志会自动清0??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

0

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