单片机在IO端口产生38KHZ的方波
扫描二维码
随时随地手机看文章
/**********************************************
该函数会在单片机的P3^0口持续产生38KHZ的方波
**********************************************/
#include
sbit P3_0=P3^0;
void main()
{
TMOD = 0x02;//TMOD是定时器方式控制寄存器,这里选用定时器0,工作在模式2
TL0 = 0xF3;//定时器初值
TH0 = 0xF3;//定时器初值
EA = 1;//开总中断
ET0 = 1;//开CPU中断和T0中断
TR0 = 1;//启动定时器
while(1);
}
void time0_int(void) interrupt 1//定时器0中断服务程序,除函数名自己取名外,其他部分要按照这样的格式写。
{
P3_0 = ~P3_0;
}
/*
******定时器初值的计算***********
如果采用的是定时器0,工作在模式1下:
(2^8 - X)*振荡周期*12 = 定时时间
这里我采用的晶振为12MHZ,即振荡周期为1/12MHZ = 1微秒.
要产生38KHZ的方波,即在1/38KHZ =26微秒,所以定时器的定时时间应该为13微秒,以保证能在P3^0口产生周期为26微秒的方波。计算可得计数初值X = 253(0xF3)
*/
/*
***************定时器模式选择*******************
定时器有四种工作模式,原则上工作在任何模式下都可以,可是工作在模式2下,更加准确,误差较小,这是因为模式2下定时器有自动重装初值的特点。
*/
/*
********中断服务程序的编写***********
void 函数名() interrupt 中断号
{
}
中断号
0 外中断0
1 定时器0
2 外中断1
3 定时器1
4 串行中断
这里我们用的是定时器0,所以中断函数写为
void void time0_int(void) interrupt 1
{}
*/
/*
********定时器的启动与停止**********
只要设置TR0 = 1,即启动定时器0,TR0 = 0,即停止定时器0
*/