51单片机晶振12M 如何编程C实现 每隔一个机器周期发送一个脉宽是20us的脉冲。

51单片机晶振12M 如何编程C实现 每隔一个机器周期发送一个脉宽是20us的脉冲。,第1张

假如晶振是12M,那么按照51规则,12个时钟周期为一个机器周期,机器周期为1M,即1uS

那么每间机器周期隔出一个脉冲,就是2uS。

又假如20uS脉冲宽度不计算脉冲底部时间,最快频率是50K。

所以,会发生第10个脉冲开始了。第1个脉冲还没结束。

结论:1 信号无法在一个端口输出 输出端口必须在10个以上。

2 不能使用2个以上的机器周期汇编指令。

#include <REG52H>

#define uint unsigned int

sbit FANGBO=P2^0;

sbit ZENGJIA=P2^7;

sbit JIANSHAO=P2^6;

uint maikuan;

void delay10ms(void) //延时10ms,我用小助手生成的

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

int main(void)

{ maikuan=50000; //设置晶振为12MHZ时,脉宽为50ms

TMOD=0x01; //设置定时器0为工作方式1

TH0=(65536-maikuan)/256; //装初值

TL0=(65536-maikuan)%256;

EA=1; //开启总中断

ET0=1; //开启定时器0中断

TR0=1; //启动定时器0

while(1)

{

if(ZENGJIA==0)

{ TR0=0; //个人感觉应该这样防止中断影响消抖,下同

delay10ms(); //软件消抖

if(ZENGJIA==0)

maikuan-=2000; //脉宽减少,频率增加

while(!ZENGJIA); //等待按键释放

TR0=1;

}

if(JIANSHAO==0)

{ TR0=0;

delay10ms(); //软件消抖

if(JIANSHAO==0)

maikuan+=2000; //脉宽增加,频率减少

while(!JIANSHAO); //等待按键释放

TR0=1;

}

};

}

void T0_time() interrupt 1

{

TH0=(65536-maikuan)/256; //重装初值

TL0=(65536-maikuan)%256;

FANGBO=~FANGBO; //方波

}

以上就是关于51单片机晶振12M 如何编程C实现 每隔一个机器周期发送一个脉宽是20us的脉冲。全部的内容,包括:51单片机晶振12M 如何编程C实现 每隔一个机器周期发送一个脉宽是20us的脉冲。、求一个单片机C语言程序,P20输出方波,按键P27时频率增加,按键P26时频率减少~、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9748557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存