怎么让单片机产生间歇式的方波
答案:3 悬赏:70 手机版
解决时间 2021-01-21 01:48
- 提问者网友:爱唱彩虹
- 2021-01-20 15:00
怎么让单片机产生间歇式的方波
最佳答案
- 五星知识达人网友:由着我着迷
- 2021-01-20 16:31
是这样的,你这个不是很好做,原因是你没有把你的硬件情况介绍出来.
如果你的晶振是12MHz的,那么,无法产生40KHz的方波,可以产生 41.67KHz,或者38.46KHZ
原因很简单,40KHz方波,周期是25us,所以半周期是12.5us,而12MHz无法产生0.5us,所以,比较接近的是产生12或者13us的半周期,所以周期是24或者26us,所以得到的频率是41.67KHz,或者38.46KHZ.
如果你要是用24MHz或者其他的晶振,兴许可以,你如果晶振不是12M,或者不是40K,可以继续追问,我给你解答一下.追问额额,是12M,那用13us的怎么写追答说实话,你这程序真不好写,你的机器周期1us,却要产生13us的中断,所以,中断函数要尽量的短,
如果中断函数超过10条汇编指令,则无法正确产生13us中断,会有偏差:
#include
unsigned char Counter = 0; //----用于计数,一次输出8个,即翻16次.
sbit Pulse = P1^0; //---用于输出方波
void main(void)
{
TMOD = 0x21; //----定时器1工作于方式2,定时器0工作于方式1;
TH1 = 0xF3; //----装入初值,定时器1每13us产生中断,用于产生 38.46KHz频率
TL1 = 0xF3;
TH0 = 0x15; //----装入初值,定时器0每60ms产生中断,用于产生,用于8次的间隔
TL0 = 0xA0;
TR1 = 1; //----启动定时器1
ET1 = 1; //----允许定时器1中断
IP = 0x08; //----定时器1的中断优先级高于定时器0的中断
ET0 = 1; //----允许定时器0中断
EA = 1; //----开总中断
for(;;)
{
if( Counter & 0xF0) //----Counter & 0xF0的意思是Counter >= 16
{ //----即已经输出了8个周期的脉冲
//----这种写法效率比if(Counter >= 16)效率高
TR1 = 0; //----停止输出
TR0 = 1; //----开启定时器0,计时60ms
Counter = 0; //---清零计数,以便下次再输出8个.
}
}
}
void ISR_Timer1(void) interrupt 3
{
Pulse = ~Pulse; //----输出脉冲
Counter ++; //----监视输出脉冲的个数
}
//----60ms时间到,进入此中断
void ISR_Timer0(void) interrupt 1
{
TR1 = 1; //----开启定时器1,输出脉冲
TR0 = 0; //----关闭定时器0
TH0 = 0x15; //----装入初值,产生下次的60ms产生中断
TL0 = 0xA0;
}
当然,你也可以用for循环的方式写,但是精度没有这种写法高
如果你的晶振是12MHz的,那么,无法产生40KHz的方波,可以产生 41.67KHz,或者38.46KHZ
原因很简单,40KHz方波,周期是25us,所以半周期是12.5us,而12MHz无法产生0.5us,所以,比较接近的是产生12或者13us的半周期,所以周期是24或者26us,所以得到的频率是41.67KHz,或者38.46KHZ.
如果你要是用24MHz或者其他的晶振,兴许可以,你如果晶振不是12M,或者不是40K,可以继续追问,我给你解答一下.追问额额,是12M,那用13us的怎么写追答说实话,你这程序真不好写,你的机器周期1us,却要产生13us的中断,所以,中断函数要尽量的短,
如果中断函数超过10条汇编指令,则无法正确产生13us中断,会有偏差:
#include
unsigned char Counter = 0; //----用于计数,一次输出8个,即翻16次.
sbit Pulse = P1^0; //---用于输出方波
void main(void)
{
TMOD = 0x21; //----定时器1工作于方式2,定时器0工作于方式1;
TH1 = 0xF3; //----装入初值,定时器1每13us产生中断,用于产生 38.46KHz频率
TL1 = 0xF3;
TH0 = 0x15; //----装入初值,定时器0每60ms产生中断,用于产生,用于8次的间隔
TL0 = 0xA0;
TR1 = 1; //----启动定时器1
ET1 = 1; //----允许定时器1中断
IP = 0x08; //----定时器1的中断优先级高于定时器0的中断
ET0 = 1; //----允许定时器0中断
EA = 1; //----开总中断
for(;;)
{
if( Counter & 0xF0) //----Counter & 0xF0的意思是Counter >= 16
{ //----即已经输出了8个周期的脉冲
//----这种写法效率比if(Counter >= 16)效率高
TR1 = 0; //----停止输出
TR0 = 1; //----开启定时器0,计时60ms
Counter = 0; //---清零计数,以便下次再输出8个.
}
}
}
void ISR_Timer1(void) interrupt 3
{
Pulse = ~Pulse; //----输出脉冲
Counter ++; //----监视输出脉冲的个数
}
//----60ms时间到,进入此中断
void ISR_Timer0(void) interrupt 1
{
TR1 = 1; //----开启定时器1,输出脉冲
TR0 = 0; //----关闭定时器0
TH0 = 0x15; //----装入初值,产生下次的60ms产生中断
TL0 = 0xA0;
}
当然,你也可以用for循环的方式写,但是精度没有这种写法高
全部回答
- 1楼网友:西风乍起
- 2021-01-20 17:44
c52好下载程序吗?这个程序用c语言写到是不难。追问额。。。知道怎么写就好了
- 2楼网友:蕴藏春秋
- 2021-01-20 16:40
频率是单位时间内某事件重复发生的次数,在物理学中通常以符号 f 或 ν 表示。采用国际单位制,其单位为赫兹(Hz)。设 τ 时间内某事件重复发生 n 次,则此事件发生的频率为 f = n / τ 赫兹。又因为周期定义为重复事件发生的最小时间间隔,故频率也可以表示为周期的倒数:
其中,T 表示周期。
假设是1KHZ,就是T为1S;变成方波就是高电平0.5S,低电平0.5S,如此重复。
其中,T 表示周期。
假设是1KHZ,就是T为1S;变成方波就是高电平0.5S,低电平0.5S,如此重复。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯