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

📄 taskgetf.c

📁 单体电容测试仪源码程序 可测电压、有A/D转换等。
💻 C
字号:
#include "sm5964reg.h"
#include "newtype.h"
#include "SerialNewType.h"
#include "ht1621.h"

//定义串行通讯缓冲区
//unsigned char idata cv_SerialReceiverBuf[42];
unsigned char idata cv_SerialReceiverBuf[4];
unsigned char idata cv_SerialSendBuf[60];


//定义串行通信缓冲区的读写指针。
unsigned char ReceiverBufWritePoint;
unsigned char ReceiverBufReadPoint;
unsigned char SendBufWritePoint;
unsigned char SendBufReadPoint;
unsigned char ReceiverPackWritePoint;
//超级终端相关变量
unsigned char command_point;					//命令开始读指针
unsigned char command_point_new;				//新命令开始读指针


//串口发送缓冲区空闲标志
bit Ti;		//Ti=1,串口准备好,可以发送数据
bit Ri;		//Ri=1,接收缓冲区有数据要接收
bit SendBufFullFlag=0;		//=1,发送缓冲区满


extern unsigned char code Versoin[];		//定义版本号常量
extern unsigned char data Mesure_state;		//侧量状态
extern unsigned char data disp_flag;		//动态显示电压标志
extern unsigned char data stop_flag;		//停止测试标志
extern unsigned char data second;		//秒	
extern unsigned char Display_state;

//葛同府所写模块初始化函数。
void InitialGeTF(void)
{
	ReceiverBufWritePoint=0;
	ReceiverBufReadPoint=0;
	SendBufWritePoint=0;
	SendBufReadPoint=0;

	Ti=0;			//Ti=1,串口准备好,可以发送数据
	Ri=0;			//Ri=0,接收缓冲区无数据要接收

}

//串口中断函数
void SerialCom() interrupt 4
{
	unsigned char temp;

	//有接收中断,写入接收缓冲区
	if(RI==1) {
		RI=0;
		Ri=1;		//Ri=1,接收缓冲区有数据要接收
		temp=SBUF;
		cv_SerialReceiverBuf[ReceiverBufWritePoint]=temp;
		//接收缓冲区写指针+1
		//接收缓冲区写指针大于接收数组最大值,置0
		if(++ReceiverBufWritePoint>=sizeof(cv_SerialReceiverBuf)) {ReceiverBufWritePoint=0;}
	}

	//有发送中断,置Ti标志为1
	if(TI==1) {
		TI=0;
		if (SendBufWritePoint != SendBufReadPoint) {
			//从接收缓冲区读数据
			SBUF=cv_SerialSendBuf[SendBufReadPoint];
			//发送缓冲区读指针+1
			SendBufReadPoint++;
			//发送缓冲区读指针大于接收数组最大值,置0
			if (SendBufReadPoint >= sizeof(cv_SerialSendBuf)) SendBufReadPoint=0;
		}
		else Ti=0;
	}
}



//从串口接收缓冲区读数函数
char SerialReceiveBufRead(void)
{
	unsigned char RecByte;
	ES=0;
	//从接收缓冲区读数据
	RecByte=cv_SerialReceiverBuf[ReceiverBufReadPoint];
	//接收缓冲区读指针+1
	//接收缓冲区读指针大于接收数组最大值,置0
	if (++ReceiverBufReadPoint >= sizeof(cv_SerialReceiverBuf)) ReceiverBufReadPoint=0;
	
	if (ReceiverBufWritePoint != ReceiverBufReadPoint) {
		Ri=1;	//Ri=1,从接收缓冲区读出数据
	}
	else{
		Ri=0;	//Ri=0,接收缓冲区无数据
	}
	ES=1;
	return RecByte;
}

//数据放串口发送缓冲区
void SerialSendBufWrite(unsigned char SenByte)
{
	ES=0;
	if  (SendBufWritePoint+1 != SendBufReadPoint ) {
		//如果发送缓冲区不满,数据放发送缓冲区
		cv_SerialSendBuf[SendBufWritePoint]=SenByte;
		//发送缓冲区写指针+1
		SendBufWritePoint=++SendBufWritePoint;
		//发送缓冲区写指针大于接收数组最大值,置0
		if (SendBufWritePoint >= sizeof(cv_SerialSendBuf)) SendBufWritePoint=0;
		SendBufFullFlag=0;		//发送缓冲区未满
	}
	else SendBufFullFlag=1;		//发送缓冲区未满
	//如果串口中断没有发送数据,置发送中断标志
	if(Ti==0) {
		Ti=1;   //表示正在发送数据
		TI=1;   //产生串口中断
	}
	ES=1;
}


//打印字符串函数
//遇到'/'字符,输出回车换行
//例如:	
//	print("ok/");	//打OK,并回车换行
//	print("err");	//只打印err,不回车换行
void print(unsigned char *p_string)
{
	unsigned char c;	

	while(*p_string != 0x00){
		if (*p_string != '/') {
			SerialSendBufWrite(*p_string);
		}
		else{
			c=0x0d;
			SerialSendBufWrite(c);
			c=0x0a;
			SerialSendBufWrite(c);
		}
		p_string++;	
	}
}

/*
//十六进制数(<=0f)转ASCII字符
unsigned char hex_to_char(unsigned char c)
{
	if (c<0xa){
	c=c | 0x30;
	}
	else{
	c=c+0x37;
	}
	return c;
} 

/*
//向串口发送字符函数
void printc (unsigned char c)
{	
	SerialSendBufWrite( hex_to_char((c & 0xf0)>>4 ) );
	SerialSendBufWrite( hex_to_char(c & 0x0f) );
	SerialSendBufWrite( 0x20);
} */
/*
//向串口发送整数函数
void printic(unsigned int i)
{
	if (SendBufFullFlag==1) return ;		//=1,发送缓冲区满
	SerialSendBufWrite( hex_to_char((char)((i & 0xf000)>>12)) );
	if (SendBufFullFlag==1) return ;		//=1,发送缓冲区满
	SerialSendBufWrite( hex_to_char((char)((i & 0x0f00)>>8 )) );
	if (SendBufFullFlag==1) return ;		//=1,发送缓冲区满
	SerialSendBufWrite( hex_to_char((char)((i & 0x00f0)>>4 )) );
	if (SendBufFullFlag==1) return ;		//=1,发送缓冲区满
	SerialSendBufWrite( hex_to_char((char)(i & 0x000f)) );
	if (SendBufFullFlag==1) return ;		//=1,发送缓冲区满
	SerialSendBufWrite( 0x20);
} */

/*
//向串口发送整数函数
void printc(unsigned char i)
{
	SerialSendBufWrite( hex_to_char((char)((i & 0xf0)>>4 )) );
	SerialSendBufWrite( hex_to_char((char)(i & 0x0f)) );
	SerialSendBufWrite( 0x20);
} */

/**/
//葛同府所写任务调用。
void TaskGeTF(void)
{
	unsigned char temp;

	//如果串口有数据,接收并处理
	if (Ri==1) {
		temp=SerialReceiveBufRead();	//接收字符
		//超级终端命令处理(命令最大6字节)
		command_analyse(temp);
	}
}

//命令解释器(命令最大6字节)
void command_analyse(unsigned char RecByte)
{
	unsigned char i,j,temp,temp_point,t[8];
	//unsigned char cv_TempBuf[3];
	if (RecByte == 0x0d) {
		///命令开始读指针
		command_point=temp_point=command_point_new;
		//新命令开始读指针
		command_point_new=ReceiverBufReadPoint;
		//读命令
		j=0;
		for (i=0;i<sizeof(t);i++) {
			temp=cv_SerialReceiverBuf[temp_point];
			if (temp != 0x0a) {		//滤除换行符
				t[j]=temp;	j++;
			}
			//接收缓冲区读指针+1,接收缓冲区读指针大于接收数组最大值,置0
			if (++temp_point >= sizeof(cv_SerialReceiverBuf)) temp_point=0;
			if (temp_point == command_point_new) i=sizeof(t);	//读完后表示没有命令
		}
		//显示命令提示符>
		printh(0x0d); printh(0x0a); 
		//printh('>'); printh(' ');
		//ver命令
		if ((t[0]=='v') && (t[1]=='e') && (t[2]=='r') && (t[3]==0x0d)) {
			printh(':'); print(Versoin); printh(0x0d); printh(0x0a);
		  return;
		}
		//显示电压
		if (((t[0]=='v') || (t[0]=='V')|| (t[0]=='i') || (t[0]=='I') )&& (t[1]==0x0d)) {
			if (disp_flag==1) disp_flag=0;
			else disp_flag=1;
			return;
		}
		//停止测试
		//显示电压
		if (((t[0]=='s') || (t[0]=='S'))&& (t[1]==0x0d)) {
			stop_flag=1;
			Swich_Ctr=1;				//停止放电
			return;
		}
		//调整时间
		if (((t[0]=='+') || (t[0]=='-'))&& (t[1]==0x0d)) {
			if (t[0]=='+') second++;
			if (t[0]=='-') second--;
			return;
		}
		//显示测试
		if (((t[0]=='d') || (t[0]=='D'))&& (t[1]==0x0d)) {
			Display_state=Display_test;
			return;
		}
		//显示测试
		if (((t[0]=='d') || (t[0]=='D'))&& ((t[1]=='a') || (t[1]=='A'))&& (t[2]==0x0d)) {
			disp_all();
			return;
		}
	}
	else {
		printh(RecByte);		//打印字符
	}
}

⌨️ 快捷键说明

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