假如晶振是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时频率减少~、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)