程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 模擬紅外協議發送源程序

模擬紅外協議發送源程序

編輯:C++入門知識

/********************************************* 簡介: 本程序為模擬紅外協議的發送程序 包含起始碼和數據碼 本程序現固定一次性發送16BIT的數據 起始碼與數據碼長度定義如下圖(用戶可自行更改):

//文件singlelinetsmt.h
#ifndef _SINGLELINETSMT_H_
#define _SINGLELINETSMT_H_
//#include "singlelinetsmt.h"


#define		P_Transmit		PF4_OUT  //單線發送IO口定義

#define		PortIr_Low		P_Transmit = 0   
#define		PortIr_High		P_Transmit = 1 


//=====紅外接收模式=====
#define		MIR_RST			(uint8)0  //空閒狀態
#define		MIR_P1			(uint8)1 //正接收起始碼
#define		MIR_P2			(uint8)2 //正接收數據


//一次性發送的數據字節長度
#define		IrDatLong     (uint8)2  
//起始碼脈寬定義
#define		TST_LOW				(uint8)50 //起始低脈寬
#define		TST_HIGH			(uint8)100 //起始高脈寬 1字節

//數據碼脈寬定義
#define		TDAT_LOW			(uint8)25  //數據低脈寬
#define		TDAT_HIGH			(uint8)50  //數據高脈寬


//====工作數據定義結構體====
typedef	struct IrTsmtData
{
	
		uint8 RMIR ; //發送模式
		uint8 Ircont ; //發送脈寬計時
		uint8 BitNum ;//發送多少位數 16BIT
		uint16 IrDatTsmt ;	//發送的數據
		
		uint8 IrTmp1 ; //臨時變量
		
}tIrTsmtData ;
extern tIrTsmtData	IrTsmtDat ;

#define		RMIR				IrTsmtDat.RMIR
#define		Ircont			IrTsmtDat.Ircont
#define		BitNum			IrTsmtDat.BitNum
#define		IrDatTsmt		IrTsmtDat.IrDatTsmt
#define		IrTmp1			IrTsmtDat.IrTmp1

//=============================
//====標志位定義結構體====
typedef	struct IrFlag
{
		uint8 Flg1: 1 ;
		uint8 Flg2: 1 ;
		uint8 Flg3: 1 ;
		uint8 Flg4: 1 ;
		uint8 Flg5: 1 ;
		uint8 Flg6: 1 ;
		uint8 Flg7: 1 ;
		uint8 Flg8: 1 ;	
		
}tIrFlg ;
extern tIrFlg	tIrF1 ;

#define		F_IrTsmt					tIrF1.Flg1 //發送期間
#define		F_IrStatus				tIrF1.Flg2 //發送高 低狀態

//=================================
extern void CmdTansmitData(uint16 Data,uint8 Time)  ;
extern void CmdIrTsmtDat(void) ;

#endif




/*
文件singlelinetsmt.c
1 發送中斷為50U中斷一次
*/
#include "global.h"
#include "singlelinetsmt.h"


tIrTsmtData	IrTsmtDat ;
tIrFlg	tIrF1 ;

//***************************************
// 函數名稱:CmdTansmitData
// 函數功能:以固定周期發送數據
// 入口參數:要發送的數據 發送周期 10MS跑一次
// 出口參數:無
//***************************************
void CmdTansmitData(uint16 Data,uint8 Time) 
{
		static uint8 Tcon = 0 ;
		
		Tcon ++ ;
		if(Tcon >= Time) //1s 發送一次
		{
				Tcon = 0 ; 
				
				RMIR = MIR_P1 ; //發送狀態復位
				F_IrStatus = 0 ; //先發送起始低
				Ircont = 0 ;
				F_IrTsmt = 1 ;//允許發送
		
				IrDatTsmt = Data ;
		}

}
//***************************************
// 函數名稱:CmdIrTsmtDat
// 函數功能:中斷發送單線數據 50U中斷一次
// 入口參數:無
// 出口參數:無
//***************************************
void CmdIrTsmtDat(void) 
{

		if(!F_IrTsmt) return ;

		Ircont ++ ;	//發送脈寬計時器
		
		//----22222--發送起始碼-----------------
		if(RMIR == MIR_P1)//
		{
				if(!F_IrStatus)//發送起始低
				{
						PortIr_Low ;
						if(Ircont >= TST_LOW)
						{
								Ircont = 0 ;
								F_IrStatus = 1 ;
						}
				}
				else //發送起始高
				{
						PortIr_High ;
						if(Ircont >= TST_HIGH)
						{
								Ircont = 0 ;
								RMIR = MIR_P2 ;
								F_IrStatus = 0 ;//發送低
								BitNum = 0 ;
						}	
				}
		}
		//----33333--發送數據碼--------------
		else if(RMIR == MIR_P2) //
		{
				if(!F_IrStatus)	//發送低
				{
						PortIr_Low ;
						if(Ircont >= TDAT_LOW)
						{
								Ircont = 0 ;
								F_IrStatus = 1 ; 
						}
				}
				else //發送高
				{
						PortIr_High ;
						
						if(IrDatTsmt & 0x01) //發送1
						{
								IrTmp1 = TDAT_HIGH ;
						}
						else
						{
								IrTmp1 = TDAT_LOW ;//發送0
						}
						if(Ircont >= IrTmp1)
						{
								Ircont = 0 ;
								IrDatTsmt >>= 1 ;
								F_IrStatus = 0 ;
								BitNum ++ ;
								if(BitNum >= (IrDatLong *8 +1))//一次發送16個BIT
								{
										BitNum = 0 ;
										F_IrTsmt = 0 ;//發送結束
								}
						}					
				}
		}		
}




//文件main.c
void main(void)
{
	uint16 R_DspIrDat ;

	while(1)
	{		
		if(T_10MS >= 200)//200*50u=10ms 跑一次主程序
		{
			T_10MS = 0 ;

			R_DspIrDat = 1234 ;
			CmdTansmitData(R_DspIrDat,100) ;//發送1234 間隔100*10MS=1S 發送1次					

		}
	}	
}

//中斷服務程序
void interrupt  server(void) //中斷進入時間50U
{		
		uint8 Tmp ;
		uint8 *pTmp ;
		
		TIM6_SR1 = 0x00;  // 清除更新標志 50u 中斷一 次
		
		T_10MS ++ ;
	
		CmdIrTsmtDat() ; //控制發送
		
}

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved