⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 carrier.c

📁 利用51单片机的两个定时器同时产生两路脉冲
💻 C
字号:
#include<reg51.h>
#include"inc/define.h"
#include"inc/config.h"
#include"inc/carrier.h"


static u8 tmr_sel;

u8 SerialData[SerialLen];
u8 SerialPos = 0;

u8 freq_h,freq_l;

/******************************************************
*说明:对用于产生串行数据流的定时器进行初始化
*函数名称:carrier_init
*参数:
*tmr:指定用于产生PWM的定时器  0:定时器0   其他:定时器1 
*baud:脉冲频率
*返回值:
*其他:
*********************************************************/
void carrier_init(u8 tmr,u16 baud)
{
	freq_h = (u32)(65536 - (F_CPU/baud))/256;	
	freq_l = (u32)(65536 - (F_CPU/baud))%256;

	if(1==tmr || 0==tmr)
		tmr_sel = tmr;
	else 
		tmr_sel = 1;
	if(1 == tmr_sel)
	{	
		TMOD &= 0x0F; 
		TMOD |= 0x10;   /* 定时器1方式1:16位手动装载模式 */
	
		TH1 = freq_h;
		TL1 = freq_l;
	

		EA    = 1; 	 /* 开启全局中断	*/
		ET1   = 1;   /* 开启定时器1中断 */
		TR1   = 1;   /* 启动定时器1 */
	}
	else	/* 0 == tmr_sel */ 
	{
		TMOD &= 0xF0; 
		TMOD |= 0x01;   /* 定时器0方式1:16位手动装载模式 */
		
		TH0 = freq_h;
		TL0 = freq_l;

		EA    = 1; 	 /* 开启全局中断	*/
		ET0   = 1;   /* 开启定时器0中断 */
		TR0   = 1;   /* 启动定时器0 */
	}
}


/*****************************************************
*说明:使用定时器0产生串行数据载波时起作用
*函数名称:Timer0_ISR
*参数:
*返回值:
*其他:
*******************************************************/
void Timer0_ISR(void) interrupt 1
{
	TH0 = freq_h;	
	TL0 = freq_l;

	if(SerialPos < (SerialLen * 8))
		SerialPos++;
	else 
		SerialPos = 0;
 	CarrierPort = ((SerialData[SerialPos/8] & (1 << (SerialPos%8))) << CarrierPIN );
}

/*****************************************************
*说明:使用定时器1产生PWM时起作用
*函数名称:Timer1_ISR
*参数:
*返回值:
*其他:
*******************************************************
void Timer1_ISR(void) interrupt 3
{	
	TH1 = freq_h;	
	TL1 = freq_l;
	
	if(SerialPos < (SerialLen * 8))
		SerialPos++;
	else 
		SerialPos = 0;	
	CarrierPort = ((SerialData[SerialPos/8] & (1 << (SerialPos%8))) << CarrierPIN ); 
	
}
*******************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -