51单片机用12MHZ晶振最高可以产生周期是8us的方波,代码如下:
#include <REG51.h> //12MHZ晶振
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void main() //产生周期T=8us的方波
{
while(1)
{
P0=0xff; _nop_();_nop_();
P0=0x00;
}
}
周期8us的方波,Proteus8.6仿真波形精准,下载后用示波器测试波形有失真,为何P0后的空操作必须不一样多?P0先输出1还是先输出0,结果一样。
无限循环的两句P0后各加1个空操作,则出现周期10us的方波,下载波形有失真;以此类推,这样可以获得更低频率的方波。这样反而比用定时器更精准。
更简单的代码如下:
void main() //产生周期T=8us的方波 //12MHZ晶振
{
while(1)
{
P0 ^= 0xff; //或者P0 = ~P0;
}
}
加1个空操作,周期延长2个控操作的时间,看来51单片机产生方波,最短周期是机器周期的8倍,即最高频率是机器周期的1/8,这还是在不考虑波形失真的情况下得到的,当然这也可能是示波器的问题,示波器采用亚龙YLDS1102D,100M,500MSa/s。Proteus仿真波形不失真。
这其中的道理,请高手解释一下。
|