1.12MHZ晶振下所能产生最小方波周期是8us,即高频率是125KHZ
用AT89C51单片机Proteus8.6仿真,用STC89C52RC单片机下载结果一样。
代码如下:
- #include <REG51.h> //AT89S52 @12MHZ晶振
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- void main() //产生周期T=8us的方波
- {
- while(1)
- {
- P1=~P1; //每加1个_nop_(); 周期延长2us
- }
- }
而采用赋值语句达到同样的结果,代码则是这样的:
- void main() //产生周期T=8us的方波 12MHZ晶振
- {
- while(1)
- {
- P1=0xff; _nop_();_nop_(); //不知为何两句的空操作数不一样多?
- P1=0x00; //把两个P1口的赋值顺序改变结果仍不变
- }
- }
2.定时器中断方式
- #include <reg52.h> //AT89S52单片机头文件
- #define LED P1
- #define T0_CNT 1 //定时时间1us,12MHZ晶振
- // =========主程序==========================
- void main(void)
- {
- TMOD = 0x02; //T0模式2,定时
- //IE = 0x82; //使能T0中断
- EA = 1; ET0 = 1; //使能T0中断
- TH0 = 256-T0_CNT ; //载入定时初值
- TL0 = 256-T0_CNT ; //载入定时初值
- TR0 = 1; //启动T0
- while(1); //等待中断
- }
- //======== T0中断=========================
- void T0_zd (void) interrupt 1 //中断编号1
- {
- LED = ~LED; //
- }
定时器定时反而更不准了,结果是高低电平各10us的方波,T0_CNT的值一直改到10结果都一样,把T0_CNT的值逐次加一,一直加到19,则出现周期可变的矩形波,T0_CNT改到20以上才出现方波,用AT89C51单片机Proteus8.6仿真,用STC89C52RC单片机下载结果一样。
3.定时器查询方式
- #include <reg52.h> //52单片机头文件
- #define LED P1
- #define T0_CNT 1 //定时时间1us,12MHZ晶振
- //T0_CNT=1~7:产生周期为14us方波
- //T0_CNT=8:产生周期为7us+9us矩形波
- //T0_CNT=9:产生周期为18us方波
- //T0_CNT=10:产生周期为9us+11us矩形波
- //T0_CNT=11:产生周期为22us方波
- //T0_CNT=12:产生周期为11us+13us矩形波
- //T0_CNT=13:产生周期为26us方波
- //T0_CNT=14:产生周期为15us+13us矩形波
- //T0_CNT=15:产生周期为30us方波
- //T0_CNT=16:产生周期为15us+17us矩形波
- //T0_CNT=17:产生周期为34us方波
- //T0_CNT=18:产生周期为19us+17us矩形波
- //T0_CNT=19:产生周期为38us方波
- //T0_CNT=20:产生周期为19us+21us矩形波
- //T0_CNT=21:产生周期为42us方波
- //T0_CNT=22:产生周期为23us+21us矩形波
- //T0_CNT>=23:产生方波
- // =========主程序==========================
- void main(void)
- {
- TMOD = 0x02; //T0模式2,定时
- TH0 = 256-T0_CNT ; //载入定时初值
- TL0 = 256-T0_CNT ; //载入定时初值
- TR0 = 1; //启动T0
- while(1) //产生周期为14us的方波
- {
- while(0 == TF0); //等待T0溢出
- TF0=0; //清除T0溢出标志
- LED = ~LED; //
- }
- }
-
用AT89C51单片机Proteus8.6仿真,未使用单片机下载。
定时器查询方式的结果则与定时器中断方式有所不同,这就好像三极管有最佳线性区一样,难道51定时器定时难道也有个最佳的定时区?个中缘由还请高手解答。
综上所述,普通51单片机作方波发生器,并不能按理论设想的一样,想获得较高的频率确实不容易,最终的结果还要通过实验来确定,如果想要获得较高的频率,可以换其它单片机。
|