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 + -
显示快捷键?