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

📄 www

📁 采用LPC的芯片做的气体排放检测,包括气体成分分析,数据的处理,数据传输给工作站.
💻
字号:
/*=====================================**
**
**
**=====================================*/

REG8  US3_rbuf[US2RBUF_LEN], US3_tbuf[US2TBUF_LEN];
REG32 US3r_r, US3r_w, US3t_r, US3t_w;
REG32 US3r_stat, US3r_byte, US3r_count, US3t_stat, US3t_byte, US3t_count, US3_div, US3_tmp, US3_enable;
/*
extern void Set_US2_TX(void);
extern void Clr_US2_TX(void);
extern U32  Tst_US2_RX(void);*/
#define		Set_US3_TX()	(IOSET = TXD3)
#define		Clr_US3_TX()	(IOCLR = TXD3)
#define		Tst_US3_RX()	(IOPIN0&RXD3)
void US3_interrupt(void)					// UART2软件串口中断处理程序(17.361us)
{
	U32 tmp;
	if(US3_enable&&(--US3_tmp==0)){
		US3_tmp=US2_div;
		if(US3r_stat==0){						// US2输入处理,空闲状态
			if(Tst_US3_RX()==0){				// 输入低电平
				US3r_count=4;					// 第一次延时1.3T
				US3r_stat=1;
				US3r_byte=0;
			}
		}else if(US3r_stat<9){				// 8位数据位
			if(--US3r_count==0){
				US3r_byte>>=1;
				if(Tst_US3_RX())
					US3r_byte|=0x100;
				US3r_count=3;					// 以后每次延时1T
				US3r_stat++;
			}
		}else if(US3r_stat==9){				// 1位停止位
			if(--US3r_count==0){
				if(Tst_US3_RX()){				// 停止位有效
					US3r_stat=0;				// 重新允许接收
					if(US3r_r!=US3r_w){		// 缓冲区未满
						US3_rbuf[US3r_w]=(US3r_byte>>1);
						//if(UART2RxdCount<UART2_MAX_LENGTH)	UART2_RxdBuf[UART2RxdCount++]=US2_rbuf[US2r_w];
						US3r_w++; 
						if(US3r_w>=US3RBUF_LEN)	// 缓冲区回绕
							US3r_w=0;
					}
				}else
					US3r_stat=10;
			}
		}else
//			if(TST_US2_RX)						// 若停止位无效则必须等待高电平才能开始下一个字节的接收
			if(Tst_US3_RX())					// 若停止位无效则必须等待高电平才能开始下一个字节的接收
				US3r_stat=0;
		if(US3t_stat==0){						// US2输出处理,空闲状态
			tmp=US3t_r+1;
			if(tmp>=US3TBUF_LEN)
				tmp=0;
			if(tmp!=US3t_w){
				US3t_r=tmp;
				US3t_byte=(US2_tbuf[tmp]|0x100);		// 停止位为1
				US3t_stat=1;
				US3t_count=3;
				Clr_US3_TX();
//				CLR_US2_TX;						// 开始位为0
			}
		}else if(US3t_stat<10){				// 加上停止位共9位数据
			if(--US3t_count==0){
				if(US3t_byte&1)
					Set_US3_TX();
//					SET_US2_TX;
				else
					Clr_US3_TX();
//					CLR_US2_TX;
				US3t_byte>>=1;
				US3t_count=3;
				US3t_stat++;
			}
		}else										// 停止位有效时间
			if(--US3t_count==0)
				US3t_stat=0;
	}
}

void US3_init(U32 baudrate)				// baudrate<=9600
{
	US3_tmp=US3_div=9600/baudrate;
	US3r_w=US3t_w=1;
	US3r_r=US3t_r=US3r_stat=US3t_stat=0;
	US2_enable=1;
}

void US3_control(U32 stat)
{
	US3_enable=stat;
}

int US3_getchar(void)						// 从UART输入缓冲区读数据,空则返回-1
{
	U32 tmp;
	tmp=US3r_r+1;
	if(tmp>=US3RBUF_LEN)
		tmp=0;
	if(tmp!=US3r_w){
		US3r_r=tmp;
		return (US3_rbuf[tmp]&0xFF);
	}else
		return -1;
}

void US3_putchar(const U8 ch)						// 向UART输出缓冲区写数据,若满则等待
{
	while(US3t_r==US3t_w);					// 发送缓冲区满则等待
	US3_tbuf[US3t_w++]=ch;
	if(US3t_w>=US3TBUF_LEN)					// 缓冲区回绕
		US3t_w=0;
}

⌨️ 快捷键说明

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