亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? softuart.c

?? 嵌入式C8051F020源碼
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
//------------------------------------------------------------------------------------
//
// Copyright 2001	Cygnal Integrated Products, Inc.
//
// FILE NAME		: SoftUart.c
// TARGET DEVICE	: C8051F02x
// Modify ON		: 01/10/02
// Modify BY		: WWW.XHL.COM.CN
//
// Software UART program, using PCA as baud rate source.
// PCA module 4 is used as receive baud rate source and START detector.  For START
// detection, module 4 is configured in negative-edge capture mode.  For all other
// SW_UART operations, module 4 is configured as a software timer.  Module match
// interrupts are used to generate the baud rate.  Module 3 generates the transmit
// baud rate in software timer mode. 
// Code assumes an external crystal is attached between the XTAL1 and XTAL2 pins.
// The frequency of the external crystal should be defined in the SYSCLK constant.
// 
// INITIALIZATION PROCEDURE:
// 1) Define SYSCLK according to external crystal frequency.
// 2) Define desired BAUD_RATE.
// 3) Call SW_UART_INIT().
// 4) Set SREN to enable SW_UART receiver.
// 5) Set SES only if user-level interrupt support is desired.
// 6) Call SW_UART_ENABLE().
//
// TO TRANSMIT:
// 1) Poll STXBSY for zero.
// 2) Write data to TDR.
// 3) Set CCF1 to initiate transmit.
// 4) STI will be set upon transmit completion.  An IE7 interrupt is generated if 
//    user-level interrupts are enabled.
//
// TO RECEIVE:
// 1) If in polled mode, poll SRI.  If in interrupt mode, check SRI in IE7 Interrupt
//    Service Routine.
// 2) Read data from RDR.
// 
// P1.2 ->  CEX0 (SW_UART0 TX)
// P1.3 ->  CEX1 (SW_UART0 RX)
// P1.4 ->  CEX0 (SW_UART1 TX)
// P1.5 ->  CEX1 (SW_UART1 RX)

//

/*  端口配置
	XBR0 = 0x27;	// XBAR0: Initial Reset Value
	XBR1 = 0x00;	// XBAR1: Initial Reset Value
	XBR2 = 0x44;	// XBAR2: Initial Reset Value
    P0MDOUT = 0x1D; // Output configuration for P0 
    P1MDOUT = 0x01; // Output configuration for P1 
		// P0.0 = UART TX0        (Push-Pull Output)
		// P0.1 = UART RX0        (Open-Drain Output/Input)
		// P0.2 = SPI Bus SCK     (Push-Pull Output)
		// P0.3 = SPI Bus MISO    (Push-Pull Output)
		// P0.4 = SPI Bus MOSI    (Push-Pull Output)
		// P0.5 = SPI Bus NSS     (Open-Drain Output/Input)
		// P0.6 = SMBus SDA       (Open-Drain Output/Input)
		// P0.7 = SMBus SCL       (Open-Drain Output/Input)


		// Port 1

		// P1.0 = UART TX1        (Push-Pull Output)
		// P1.1 = UART RX1        (Open-Drain Output/Input)
		// P1.2 = PCA CEX0        (Push-Pull Output)
		// P1.3 = PCA CEX1        (Push-Pull Output)
		// P1.4 = PCA CEX2        (Push-Pull Output)
		// P1.5 = PCA CEX3        (Push-Pull Output)
		// P1.6 = GP I/O          (Open-Drain Output/Input)
		// P1.7 = GP I/O          (Open-Drain Output/Input)
*/ 
//-----------------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------------

#include "TestSerial.h"

#define	BAUDRATE2		19200		// 用戶定義的SW_UART 波特率
#define	UART2_TIMER		SYSCLK/BAUDRATE2/4	//對(duì)應(yīng)一個(gè)位時(shí)間的PCA 計(jì)數(shù)值(PCA 配置為對(duì)SYSCLK/4 計(jì)數(shù))
#define	UART2_STARTTIME	UART2_TIMER*3/2		// 3/2 位時(shí)間用于接收到一個(gè)起始位后在起始位邊沿之后RX 
											//應(yīng)在一個(gè)位時(shí)間內(nèi)保持低電平第一個(gè)位采樣在下一個(gè)位時(shí)間的中間開始

#define	BAUDRATE3		19200		
#define	UART3_TIMER		SYSCLK/BAUDRATE3/4	
#define	UART3_STARTTIME	UART3_TIMER*3/2		
											


#define NULL ((void *) 0L)
#define DB_SENDMAXSIZE2 0xf0
#define DB_RECMAXSIZE2 0xf0

#define DB_SENDMAXSIZE3 0xf0
#define DB_RECMAXSIZE3 0xf0

bit FlagRecComm2,SendItComm2;
unsigned char CommSendBufferHead2, CommSendBufferTail2;
unsigned char xdata CommSendBuffer2[DB_SENDMAXSIZE2]; 
unsigned char CommRecBufferHead2, CommRecBufferTail2;
unsigned char xdata CommRecBuffer2[DB_RECMAXSIZE2]; 

bit FlagRecComm3,SendItComm3;
unsigned char CommSendBufferHead3, CommSendBufferTail3;
unsigned char xdata CommSendBuffer3[DB_SENDMAXSIZE3]; 
unsigned char CommRecBufferHead3, CommRecBufferTail3;
unsigned char xdata CommRecBuffer3[DB_RECMAXSIZE3]; 


//-----------------------------------------------------------------------------------
//Global VARIABLES
//-----------------------------------------------------------------------------------
bit	SRI0;					// SW_UART Receive Complete Indicator
bit	STI0;					// SW_UART Transmit Complete Indicator
bit	STXBSY0;				// SW_UART TX Busy flag
bit SREN0;					// SW_UART RX Enable
bit	SES0;					// SW_UART User-level Interrupt Support Enable
sbit SW_RX0 = P1^3;  		// SW_UART Receive pin
sbit SW_TX0 = P1^2;  		// SW_UART Transmit pin
char TDR0;					// SW_UART TX Data Register
char RDR0;					// SW_UART RX Data Register (latch)

bit	SRI1;					// SW_UART Receive Complete Indicator
bit	STI1;					// SW_UART Transmit Complete Indicator
bit	STXBSY1;				// SW_UART TX Busy flag
bit SREN1;					// SW_UART RX Enable
bit	SES1;					// SW_UART User-level Interrupt Support Enable
sbit SW_RX1 = P1^5;  		// SW_UART Receive pin
sbit SW_TX1 = P1^4;  		// SW_UART Transmit pin
char TDR1;					// SW_UART TX Data Register
char RDR1;					// SW_UART RX Data Register (latch)

//------------------------------------------------------------------------------------
// Function PROTOTYPES
//------------------------------------------------------------------------------------

void	SW_UART_INIT0();			// SW_UART initialization routine
void	SW_UART_ENABLE0();			// SW_UART enable routine
void	PCA_ISR();					// SW_UART interrupt service routine
void 	USER_ISR0(void);			// SW_UART test interrupt service routine
void	SW_UART_INIT1();			// SW_UART initialization routine
void	SW_UART_ENABLE1();			// SW_UART enable routine
void 	USER_ISR1(void);			// SW_UART test interrupt service routine



void ClearCommRecBuffer2(void)
{
	CommRecBufferHead2=CommRecBufferTail2=0;
	FlagRecComm2=0;
}

void SendCommChar2(char ch)			//發(fā)送一字節(jié)
{
	CommSendBuffer2[CommSendBufferTail2]=ch;   // 將欲發(fā)送的字節(jié)存入發(fā)送緩沖區(qū)
	CommSendBufferTail2++; 					   // 移動(dòng)發(fā)送緩沖區(qū)隊(duì)列指針
	if (CommSendBufferTail2==DB_SENDMAXSIZE2)  // 檢查循環(huán)隊(duì)列指針
	{ 	
		CommSendBufferTail2=0;				   	
	}
	if (SendItComm2)						   // 空閑狀態(tài)啟動(dòng)發(fā)送
	{	 
		STXBSY0 = 1; 						   // 發(fā)送標(biāo)志置位
       	TDR0 = CommSendBuffer2[CommSendBufferHead2]; 
		CCF0 = 1;							   // 強(qiáng)制PCA模塊0中斷,啟動(dòng)發(fā)送
	}
	return ;
}

void SendCommBuffer2(unsigned char *base, unsigned char size)  //發(fā)送多字節(jié)
{
unsigned char i=0;
	if (!size) return; 			// 發(fā)送字節(jié)為空
	while (i<size) 				// 將發(fā)送的數(shù)據(jù)存入發(fā)送緩沖區(qū),注意緩沖區(qū)的大小,本例程未考慮緩沖區(qū)溢出情況
	{	 
		CommSendBuffer2[CommSendBufferTail2]=base[i]; 
		i++;
		CommSendBufferTail2++; 
		if (CommSendBufferTail2==DB_SENDMAXSIZE2)
		{ 
			CommSendBufferTail2=0;
		}
	}
	if (SendItComm2)
	{
		STXBSY0 = 1; 
       	TDR0 = CommSendBuffer2[CommSendBufferHead2]; 
		CCF0 = 1;	
	}
}

bit GetCommChar2(unsigned char idata *ch)    //讀取一字節(jié)數(shù)據(jù),  有數(shù)據(jù)返回1,無數(shù)據(jù)返回0.
{ 
	if (CommRecBufferTail2==CommRecBufferHead2) return 0;     
	*ch=CommRecBuffer2[CommRecBufferHead2];
	CommRecBufferHead2++;
	if (CommRecBufferHead2==DB_RECMAXSIZE2)
	{
		CommRecBufferHead2=0;
	}
	if (CommRecBufferTail2==CommRecBufferHead2) FlagRecComm2=0;
	return 1;
}

//------------------------------------------------------------------------------------------
// SW_UART_INIT: 軟件UART 初始化程序
// - 配置PCA: 模塊1 設(shè)置為下跳沿捕捉方式; 模塊0 設(shè)置為軟件定時(shí)方式
//   PCA 時(shí)基 = 系統(tǒng)時(shí)鐘/4; 關(guān)閉PCA中斷 
//
void	SW_UART_INIT0(void)
{
	PCA0CPM1 = 0x10;		// Module 1 in negative capture mode; module 1 interrupt disabled.
	PCA0CPM0 = 0x48; 		// Module 0 in software timer mode; module  0 interrupt disabled.	
	PCA0CN = 0;				// Leave PCA disabled
	PCA0MD = 0x02;			// PCA timebase = SYSCLK/4; PCA counter
							// interrupt disabled.
	CCF1 = 0;				// Clear pending PCA module 0 and
	CCF0 = 0;				// module 1 capture/compare interrupts.
	SRI0 = 0;				// Clear Receive complete flag.
	STI0 = 0;				// Clear Transmit complete flag.
	SW_TX0 = 1;				// TX line initially high.	
	STXBSY0 = 0;				// Clear SW_UART Busy flag

	SREN0 = 1;				// Enable SW_UART Receiver
	SES0 = 1;				// User-level interrupt support enabled.
	SendItComm2=1;
}

//------------------------------------------------------------------------------------------
// SW_UART_ENABLE: SW_UART Enable Routine
// Enables SW_UART for use.
// - Enables PCA module 0 interrupts
// - Enables PCA module 1 interrupts
// - Starts PCA counter.
//
void	SW_UART_ENABLE0(void)
{
	PCA0CPM1 |= 0x01;		// Enable module 1 (receive) interrupts.
	PCA0CPM0 |= 0x01;		// Enable module 0 (transmit) interrupts.
	CR = 1;					// Start PCA counter.
	EIE1 |= 0x08;			// Enable PCA interrupts
	EA = 1;					// Globally enable interrupts
}

void ClearCommRecBuffer3(void)
{
	CommRecBufferHead3=CommRecBufferTail3=0;
	FlagRecComm3=0;
}

void SendCommChar3(char ch)			//發(fā)送一字節(jié)
{
	CommSendBuffer3[CommSendBufferTail3]=ch;   // 將欲發(fā)送的字節(jié)存入發(fā)送緩沖區(qū)
	CommSendBufferTail3++; 					   // 移動(dòng)發(fā)送緩沖區(qū)隊(duì)列指針
	if (CommSendBufferTail3==DB_SENDMAXSIZE3)  // 檢查循環(huán)隊(duì)列指針
	{ 	
		CommSendBufferTail3=0;				   	
	}
	if (SendItComm3)						   // 空閑狀態(tài)啟動(dòng)發(fā)送
	{	 
		STXBSY1 = 1; 						   // 發(fā)送標(biāo)志置位
       	TDR1 = CommSendBuffer3[CommSendBufferHead3]; 
		CCF2 = 1;							   // 強(qiáng)制PCA模塊0中斷,啟動(dòng)發(fā)送
	}
	return ;
}

void SendCommBuffer3(unsigned char *base, unsigned char size)  //發(fā)送多字節(jié)
{
unsigned char i=0;
	if (!size) return; 			// 發(fā)送字節(jié)為空
	while (i<size) 				// 將發(fā)送的數(shù)據(jù)存入發(fā)送緩沖區(qū),注意緩沖區(qū)的大小,本例程未考慮緩沖區(qū)溢出情況
	{	 
		CommSendBuffer3[CommSendBufferTail3]=base[i]; 
		i++;
		CommSendBufferTail3++; 
		if (CommSendBufferTail3==DB_SENDMAXSIZE3)
		{ 
			CommSendBufferTail3=0;
		}
	}
	if (SendItComm3)
	{
		STXBSY1 = 1; 
       	TDR1 = CommSendBuffer2[CommSendBufferHead2]; 
		CCF2 = 1;	
	}
}

bit GetCommChar3(unsigned char idata *ch)    //讀取一字節(jié)數(shù)據(jù),  有數(shù)據(jù)返回1,無數(shù)據(jù)返回0.
{ 
	if (CommRecBufferTail3==CommRecBufferHead3) return 0;     
	*ch=CommRecBuffer3[CommRecBufferHead3];
	CommRecBufferHead3++;
	if (CommRecBufferHead3==DB_RECMAXSIZE2)
	{
		CommRecBufferHead3=0;
	}
	if (CommRecBufferTail3==CommRecBufferHead3) FlagRecComm3=0;
	return 1;
}



void	SW_UART_INIT1(void)
{
	PCA0CPM3 = 0x10;		// Module 1 in negative capture mode; module 1 interrupt disabled.
	PCA0CPM2 = 0x48; 		// Module 0 in software timer mode; module  0 interrupt disabled.	
	PCA0CN = 0;				// Leave PCA disabled
	PCA0MD = 0x02;			// PCA timebase = SYSCLK/4; PCA counter
							// interrupt disabled.
	CCF3 = 0;				// Clear pending PCA module 0 and
	CCF2 = 0;				// module 1 capture/compare interrupts.
	SRI1 = 0;				// Clear Receive complete flag.
	STI1 = 0;				// Clear Transmit complete flag.
	SW_TX1 = 1;				// TX line initially high.	
	STXBSY1 = 0;				// Clear SW_UART Busy flag

	SREN1 = 1;				// Enable SW_UART Receiver
	SES1 = 1;				// User-level interrupt support enabled.
	SendItComm3=1;
}

void	SW_UART_ENABLE1(void)
{
	PCA0CPM3 |= 0x01;		// Enable module 1 (receive) interrupts.
	PCA0CPM2 |= 0x01;		// Enable module 0 (transmit) interrupts.
	CR = 1;					// Start PCA counter.
	EIE1 |= 0x08;			// Enable PCA interrupts
	EA=1;
}

//------------------------------------------------------------------------------------
// Interrupt Service Routines
//------------------------------------------------------------------------------------
//
// PCA_ISR: PCA Interrupt Service Routine.
// This ISR is triggered by both transmit and receive functions, for each bit that

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩精品三区| 一本久久a久久免费精品不卡| 日本一区二区三区视频视频| 色一情一乱一乱一91av| 毛片av一区二区| 亚洲裸体在线观看| 2024国产精品| 91老师片黄在线观看| 国产资源在线一区| 日日摸夜夜添夜夜添精品视频| 久久精品视频一区二区| 欧美一区二区三区免费观看视频| 丁香另类激情小说| 美女在线观看视频一区二区| 一区二区三区日韩精品视频| 国产午夜久久久久| 日韩色在线观看| 色av成人天堂桃色av| 成人性色生活片免费看爆迷你毛片| 日本美女一区二区| 亚洲午夜精品一区二区三区他趣| 中文字幕国产一区| 久久久国产午夜精品| 日韩一区二区三区视频| 欧美亚洲愉拍一区二区| 色综合久久久久久久久久久| 国产成人自拍高清视频在线免费播放| 日韩av成人高清| 视频一区视频二区在线观看| 亚洲影视在线播放| 亚洲一区在线观看免费| 一区二区三区在线观看网站| 中文字幕制服丝袜成人av| 国产欧美日韩中文久久| 欧美精品一区二区三区四区 | 国产jizzjizz一区二区| 美女尤物国产一区| 午夜激情一区二区三区| 午夜精品久久久久久| 亚洲国产三级在线| 五月激情综合婷婷| 日韩中文欧美在线| 免费不卡在线视频| 麻豆91在线看| 国产一区福利在线| 国产在线一区二区| 丰满白嫩尤物一区二区| 成人小视频在线观看| 99久久婷婷国产综合精品电影| 成人免费高清视频在线观看| 北岛玲一区二区三区四区| 99久久精品国产网站| 91美女福利视频| 欧美日韩三级视频| 日韩视频中午一区| www日韩大片| 国产精品五月天| 亚洲免费av高清| 日韩和欧美的一区| 紧缚捆绑精品一区二区| 国产传媒欧美日韩成人| 99视频热这里只有精品免费| 欧美三级乱人伦电影| 欧美一区二区三区影视| 日韩一区二区三区免费观看| 国产欧美精品在线观看| 亚洲国产精品一区二区久久| 亚洲精品久久久久久国产精华液 | 日本中文字幕一区| 日本成人在线电影网| 国产最新精品免费| 99精品久久99久久久久| 欧美色国产精品| 精品国产第一区二区三区观看体验| 国产日本欧洲亚洲| 亚洲图片欧美视频| 韩国理伦片一区二区三区在线播放| 国产成人激情av| 在线观看亚洲精品视频| 欧美成人欧美edvon| 欧美国产视频在线| 午夜欧美电影在线观看| 国产精一区二区三区| 色琪琪一区二区三区亚洲区| 欧美一区二区黄| 一区在线观看视频| 免费成人av资源网| 91福利视频久久久久| 久久日韩精品一区二区五区| 亚洲免费视频中文字幕| 九九九久久久精品| 欧美综合在线视频| 国产亲近乱来精品视频| 奇米色一区二区| 一本一道久久a久久精品综合蜜臀| 日韩欧美亚洲国产精品字幕久久久 | 亚洲裸体xxx| 国产美女精品一区二区三区| 欧美午夜寂寞影院| 国产精品素人一区二区| 捆绑紧缚一区二区三区视频| 日本道色综合久久| 欧美国产精品中文字幕| 奇米影视7777精品一区二区| 99久久伊人精品| 久久久蜜桃精品| 日本成人在线网站| 欧美午夜一区二区三区| 亚洲欧洲国产日韩| 国产精品88888| 精品伦理精品一区| 丝袜美腿一区二区三区| 在线精品视频一区二区| 中文字幕视频一区| 国产精品亚洲专一区二区三区| 91麻豆精品国产91久久久使用方法 | 波波电影院一区二区三区| 久久综合久久99| 日本亚洲三级在线| 欧美无砖专区一中文字| 一区二区三区中文免费| 成人动漫av在线| 国产亚洲欧美一区在线观看| 麻豆国产91在线播放| 欧美一卡在线观看| 日韩福利视频网| 欧美日本精品一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 成人免费av网站| 日本一区二区三区四区在线视频| 国产精品99久久久久久久vr| 欧美刺激午夜性久久久久久久| 日韩成人一区二区| 日韩欧美123| 激情五月婷婷综合网| 精品国产伦一区二区三区免费| 免费av成人在线| 日韩欧美资源站| 久久99精品一区二区三区| 精品国产伦一区二区三区观看体验 | 国产无遮挡一区二区三区毛片日本| 精品在线观看视频| 国产亚洲婷婷免费| 福利一区在线观看| 国产精品嫩草影院com| 99精品国产热久久91蜜凸| 亚洲另类春色国产| 欧美在线观看一区二区| 日韩精品视频网| 精品国产欧美一区二区| 国产乱理伦片在线观看夜一区| 亚洲国产电影在线观看| 色综合中文字幕| 一区二区三区精品在线观看| 欧美视频一区二区三区在线观看 | 精品一区二区三区久久久| 久久精品一区蜜桃臀影院| jlzzjlzz亚洲女人18| 亚洲一区影音先锋| 日韩免费福利电影在线观看| 国产福利精品一区| 一区二区三区四区精品在线视频| 欧美日韩一区二区三区四区五区| 日本少妇一区二区| 欧美激情资源网| 欧美在线综合视频| 精品一区二区三区不卡| 中文字幕一区二区三区色视频| 日本高清不卡在线观看| 日本少妇一区二区| 中文字幕不卡在线观看| 欧美日韩一区中文字幕| 国产原创一区二区三区| 亚洲激情男女视频| 欧美成人精品福利| av毛片久久久久**hd| 日韩电影一二三区| 日韩一区有码在线| 欧美一区二区三区四区视频| 国产成人免费av在线| 亚洲aⅴ怡春院| 国产情人综合久久777777| 欧美日精品一区视频| 韩国一区二区在线观看| 一区二区三区精品在线| 久久综合99re88久久爱| 欧美综合一区二区三区| 国产在线精品一区二区不卡了| 亚洲柠檬福利资源导航| 精品国精品国产| 91高清在线观看| 国产69精品久久99不卡| 天天亚洲美女在线视频| ●精品国产综合乱码久久久久| 欧美一区二区三区小说| 日本道精品一区二区三区| 国产成人午夜99999| 美女久久久精品| 亚洲国产一区二区在线播放| 国产精品对白交换视频|