icl7135_fin99.c

来自「基于AT89C2051的电机阻抗的数据采集程序」· C语言 代码 · 共 235 行

C
235
字号

/*
 winson

*/

/**************************************通信函数库*******************************************/
#include <reg2051.H>
#include <string.h>

/**************************************串口通信宏定义*******************************************/
#define frameStar 0x0a				//帧起始地址
#define frameEnd  0x2a				//帧结束地址

typedef unsigned char uchar ;
typedef unsigned int uint ;

/**************************************串口通信变量声明**************************************/
char data m_dataBuffer[5]	={"99999"};		//全部数据信息(N维数组形式)
char data pre_dataBuffer[5]	={"99999"};		//全部数据信息(N维数组形式)
char data disp_dataBuffer[5]={"54321"};		//全部数据信息(N维数组形式)

/**************************************串口通信子程序声明*******************************************/
initcom(void);
void com_data_send(char dataBuffer[]);

/**************************************通用函数的声明*******************************************/
void delaymsec(unsigned int x);

/**************************************通用端口地址定义*******************************************/
sbit D1 = P3^7;			//IO口位声明
sbit D2 = P1^4;
sbit D3 = P1^5;
sbit D4 = P1^6;
sbit D5 = P1^7;

enum
{
    STATE_D5,
	STATE_D4,
	STATE_D3,
	STATE_D2,
	STATE_D1
};


uchar next_state= STATE_D5;
uchar pre_state;
uchar count = 0;
uint disp_timer = 20;

//定时器0中断子程序
timer0_isp(void)interrupt 1 using 2				//interrupt service pocess 中断服务程序(数据)
{
	TH0 = 0X4B;									//置初值
	TL0 = 0X6A;
	TR0 = 1;										//开定时器0
	ET0 = 1;

	if(disp_timer != 0)
	{
		disp_timer--;
	}	
	
}

main(void)
{	
	initcom();
	EA = 1;
  	do
	{
		switch(next_state)
		{
			case STATE_D5:
				while(D5);		//D5高电平等待
				delaymsec(1);
				m_dataBuffer[0] = ((~P1)&0x0f)|0x30;
				pre_state = STATE_D5;
				next_state = STATE_D4;
				while(!D5);
				break;
	
			case STATE_D4:
				while(D4);
				delaymsec(1);
				m_dataBuffer[1] = ((~P1)&0x0f)|0x30;
				if(pre_state == STATE_D5)
				{
					pre_state = STATE_D4;
					next_state = STATE_D3;
				}
				else
				{
					next_state = STATE_D5;
				}
				while(!D4);
				break;
	
			case STATE_D3:
				while(D3);
				delaymsec(1);
				m_dataBuffer[2] = ((~P1)&0x0f)|0x30;
				if(pre_state == STATE_D4)
				{
					pre_state = STATE_D3;
					next_state = STATE_D2;
				}
				else
				{
					next_state = STATE_D5;
				}
				while(!D3);
				break;
	
			case STATE_D2:
				while(D2);
				delaymsec(1);
				m_dataBuffer[3] = ((~P1)&0x0f)|0x30;
				if(pre_state == STATE_D3)
				{
					pre_state = STATE_D2;
					next_state = STATE_D1;
				}
				else
				{
					next_state = STATE_D5;
				}
				while(!D2);
				break;

			case STATE_D1:
				while(D1);
				delaymsec(1);
				m_dataBuffer[4] = ((~P1)&0x0f)|0x30;
		//校验是否为正确的接收码
				if((m_dataBuffer[0]=='0')||(m_dataBuffer[0]=='1'))
				if('0'<=m_dataBuffer[1]&&m_dataBuffer[1]<='9')
				if('0'<=m_dataBuffer[2]&&m_dataBuffer[2]<='9')
				if('0'<=m_dataBuffer[3]&&m_dataBuffer[3]<='9')
				if('0'<=m_dataBuffer[4]&&m_dataBuffer[4]<='9')
				if(strcmp(m_dataBuffer,pre_dataBuffer))
				{
                	count = 0;
					memcpy(pre_dataBuffer,m_dataBuffer,5);
				}
				else
				{
                    count++; 
				}
				
				if(count == 5)
				{	
					memcpy(disp_dataBuffer,pre_dataBuffer,5);							
					count = 0;
				}
				if(disp_timer == 0)
					{
						disp_timer = 20;
						com_data_send(disp_dataBuffer);						
					}
				
				next_state = STATE_D5;	
 				while(!D1);
				break;	
		}
	}while(1);
}


/**************************************串口通信子程序**************************************/
//初始化串口
initcom(void)
{
	EA = 0;
	TMOD = 0x21;									//定时器T1定义为模式2
	PCON = 0x80;
	SCON = 0X58;									//设置串行口控制字,方式1,允许接收;允许方式2、3第9位数据
	ES = 0;										//允许串口中断
	PS = 1;										//设置串口中断优先级
	
	TH1 = 0xFD;									//置初值
	TL1 = 0XFD;
	TR1 = 1;										//开定时器1
	
	TH0 = 0X4B;									//置初值
	TL0 = 0X6A;
	TR0 = 1;										//开定时器0
	ET0 = 1;
	
	/*EA=1;										//打开单片机中断允许*/
}


//发送子程序
void com_data_send(char dataBuffer[])
{
	uchar m;
	ACC=frameStar;
	TB8=P;
	SBUF=ACC;								//发送帧起始标志
	while(TI != 1);							
	TI = 0;
	for(m=0;m<5;m++)
	{
		ACC=dataBuffer[m];
		TB8=P;
		SBUF=ACC;					//发送数据信息
		while(TI != 1);							
		TI = 0;
	}
	ACC=frameEnd;
	TB8=P;
	SBUF=ACC;								//发送帧结束标志
	while(TI != 1);							
	TI = 0;
}								   


/**************************************通用子程序**************************************/


void delaymsec(unsigned int x)					//延时ms级
{
	uchar j;
	while((x--)!=0)
	{
		for(j=0;j<125;j++)
		{}
	}
}



⌨️ 快捷键说明

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