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

📄 io.c

📁 C51单片机端
💻 C
字号:

#include <stdarg.h> 
#include <string.h> 

#include "compiler.h"
#include "config.h"
#include "isp.h"
#include "system.h"
#include "hex.h"

extern void uart_tx(unsigned char tx_data);

char ptxt[40];
unsigned char SreialStr;

void uart0(void) interrupt 4 using 0
{
	if (RI == 1) 
	{
		RI = 0;
		SreialStr = 0;
		hex_decoder(SBUF0);
	}
}


void uart1(void) interrupt 7 using 0
{
	if (RI1 == 1) 
	{
		RI1 = 0;
		SreialStr = 1;
		hex_decoder(SBUF1);
	}
}

void uart_tx(Uchar tx_data)
{
	if(SreialStr == 0)
	{
		SBUF0 = tx_data;
		while (TI==0); 
		TI=0;
	}
	else if(SreialStr == 1)
	{
		SBUF1 = tx_data;
		while (TI1==0); 
		TI1=0;
	}
	else
	{
		SBUF0 = tx_data;
		while (TI==0); 
		TI=0;
	}
}

void vInitUart(void)
{
#if Sp756P==1
/*	
	CKCON |= 0x31;	 //T1、T2时钟Clk/4
	//串口1的设置     
	TMOD  |= 0x20;   //定时器1工作在模式1,8位重载     
	SCON1 |= 0x50;   //模式1: 异步10位波特率可变,允许接收
	//串口0的设置     
	SCON  |= 0x50;   //模式1: 异步10位波特率可变,允许接收 
	T2CON |= 0x30;   //用定时器2做串口0的波特率发生器     

	PCON  |= 0x80;   //串口0波特率加倍
	WDCON |= 0x80;   //串口1波特率加倍
	
	TL1	   = 0xFD;   //波特率=57600     
	TH1    = 0xFD;     
	RCAP2H = 0xFF;   
	RCAP2L = 0xFD;   //波特率=115200       
	
	EA     = 1;		 //EA=1;ES1=1;ES0=1
	ES0    = 1;      //串口0中断允许
	ES1    = 1;      //串口1中断允许
		
	TR2    = 1;     
	TR1    = 1;
*/
	//0xFD(57600) 0xFA(28800) 0xF7(19200) 0xEE(9600)
	CKCON |= 0x31;   //T1时钟Clk1/4
	TMOD  |= 0x20;   //定时器1:模式2,8位重载
	SCON  |= 0x50;   //模式1: 异步10位波特率可变,允许接收
	SCON1 |= 0x50;   //模式1: 异步10位波特率可变,允许接收
	
	PCON  |= 0x80;   //串口0波特率加倍
	WDCON |= 0x80;   //串口1波特率加倍
	
	TL1    = 0xFD;      
	TH1    = 0xFD;     
	IE    |= 0xD0;   //EA=1;ES1=1;ES0=1
	TR1    = 1;
#else
	//0xFD(57600) 0xFA(28800) 0xF7(19200) 0xEE(9600)
	CKCON |= 0x31;   //T1时钟Clk1/4
	TMOD  |= 0x20;   //定时器1:模式2,8位重载
	SCON  |= 0x50;   //模式1: 异步10位波特率可变,允许接收
	SCON1 |= 0x50;   //模式1: 异步10位波特率可变,允许接收
	
	PCON  |= 0x80;   //串口0波特率加倍
	WDCON |= 0x80;   //串口1波特率加倍
	
	TL1    = 0xFD;      
	TH1    = 0xFD;     
	IE    |= 0xD0;   //EA=1;ES1=1;ES0=1
	TR1    = 1;
#endif	  
}

void vSendBuff(unsigned int sDdress,unsigned int mISector,unsigned char sBackBank)
{
	unsigned char data sxBchar;
	unsigned int sxnum;
	unsigned char CheckSum; 
	unsigned int snum;
	
	sxnum = sDdress;
   	CheckSum = 0;
	uart_tx(':');    //包头
		
	if(mISector==256)sxBchar=0xFF;  //数据长度
	if(mISector==128)sxBchar=0x80;
	CheckSum += sxBchar;
	SendBinToChar(sxBchar);	

	sxBchar = (unsigned char)(sDdress/256);  //扇区地址
	CheckSum += sxBchar;
	SendBinToChar(sxBchar);	
	
	sxBchar = (unsigned char)(sDdress%256);  //扇区地址
	CheckSum += sxBchar;
	SendBinToChar(sxBchar);	

	uart_tx('0');   //数据类型 
	uart_tx('0');     
	CheckSum += 0x00;

	vBankSet(sBackBank);

	for(snum=0;snum <mISector;snum++)
	{
		sxBchar = vReadFlash(sxnum++);
		CheckSum += sxBchar;
		SendBinToChar(sxBchar);	
	}
	
	CheckSum = ~CheckSum;
	CheckSum +=1;
	sxBchar = CheckSum;  //和校验
	SendBinToChar(sxBchar);	
}

void vCOmSend(unsigned char m_ComLength, unsigned char m_ComType, unsigned short int m_AdderData)
{
	//数据包格式: :ll kk aaaa tt [dd...] cc
	//:     包头
	//ll    数据长度
	//kk    程序分区数
	//aaaa  扇区地址
	//dd... 数据域
	//cc    和校验 cc = 0x01H + NOT(ll + kk + aa +aa +tt + dd...)
	unsigned char Txchar;
	unsigned char CheckSum; 
				
	CheckSum = 0;
	uart_tx(':');    //包头
			
	Txchar = m_ComLength;      //数据长度
	CheckSum += Txchar;
	
	SendBinToChar(Txchar);		
   
	Txchar = 0x00;              //地址
	CheckSum += Txchar;
	SendBinToChar(Txchar);		
	Txchar = 0x00;  
	CheckSum += Txchar;
	SendBinToChar(Txchar);		

	Txchar = m_ComType;          //数据类型
	CheckSum += Txchar;
	SendBinToChar(Txchar);		
	
	if(m_ComLength !=0)
	{
		Txchar  = (unsigned char)(m_AdderData/256);	
		CheckSum += Txchar;
		SendBinToChar(Txchar);		
		Txchar  = (unsigned char)(m_AdderData%256);	
		CheckSum += Txchar;
		SendBinToChar(Txchar);		
	}
	CheckSum = ~CheckSum;
	CheckSum +=1;
	Txchar = (unsigned char)CheckSum;  //和校验
	SendBinToChar(Txchar);		
}

void SendBinToChar(unsigned char BinChar)
{
	unsigned char byte;
	unsigned char SendHexChar;  
	  
	byte = BinChar;
	byte >>= 4;
	
	if(0<= byte && byte <=9)
	{
		byte += '0';
		SendHexChar = byte;
	}
	else
	{
		byte += 'A' - 10;
		SendHexChar = byte;
	}

	uart_tx(SendHexChar);
	
	byte = BinChar;
	byte &= 0x0F;
	if(0<= byte && byte <=9)
	{
		byte += '0';
		SendHexChar = byte;
	}
	else
	{
		byte += 'A' - 10;
		SendHexChar = byte;
	}

	uart_tx(SendHexChar);
}

⌨️ 快捷键说明

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