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

📄 main.c

📁 书中详细说明了多路数据采集的方法,以及怎么样用AD来采集数据哟,大家不妨看看嘛,说不定有所帮助哟?
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <c8051f020.h>
#include <stdio.h>
#include "CPU_Init.h"
#include "RS485M.h"
#include "LCD_send.h"
#include "ZLG7290_key.h"

void LCDSend_Int(void);
void Key_Disp(void);
void UARTRX_Disp(void);
void Help_1(void);
void KeyDisp_F0(void);
void KeyDisp_KX(unsigned char pass_data);
void PASS_Disp(unsigned char pass_data);
unsigned char Sum_verify(unsigned char verify[],unsigned char ii);
void CYC_Disp(void);

unsigned char RX[10];//UART0接收数据存放数组
unsigned char TX[10];//UART0发送数据存放数组
unsigned char key;   //按键键值 
unsigned char pass_data;//选择的采集通道

bit ReceiveBit=0;  //接收完成标志
bit key_sign=0;    //按键标志
bit F0_sign=0;     //F0按键标志
bit KX_sign=0;   //处理通道已选标志
bit F2_sign=0;     //循环采集标志

void main(void)
{
    WDTCN = 0xde;   //关闭看门狗
    WDTCN = 0xad;
    Init_Device();
	LCDSend_Int();
	EA=1;
    DE_RE = 0;
	while(1)
	{
        if(key_sign==1) //有按键
	    {
		    key_sign=0;
		    Key_Disp(); //按键处理
        }
	}
} 

void UARTRX_Disp(void)
{
   UART0_TX(TX,5);
}

void Key_Disp(void)
{
    if(key==F0)
    {
        F0_sign=1;
        KX_sign=0; 
        F2_sign=0;
        lcd_init();
        send_asc16str(0,0,"->");
        send_hz(1,0,"请选择采集通道");
        send_asc16str(2,16,"K1-K8:");
        send_hz(4,1,"通道");
        send_asc16str(12,16,"1-8");
        send_asc16str(2,32,"F2:");
        send_hz(3,2,"循环采集");
    }
    if(key==F1)
    {
        Help_1();
    }
    if(F0_sign==1&&F2_sign==0&&(key==K1||key==K2||key==K3||key==K4||key==K5||key==K6||key==K7||key==K8))
    {
        KX_sign=1; //单路采集模式
	    F2_sign=0; //选择循环采集模式
        pass_data=(key%8)+(key/8)*4;
	    lcd_init(); //通道已选择显示
        send_hz(1,0,"单路采集模式");
        send_hz(1,1,"采集通道");
        send_asc16str(10,16,":");
        send_ascii16(12,16,pass_data+0x30);
        send_asc16str(4,32,"F3->");
	    send_hz(4,2,"确定");
        send_asc16str(4,48,"F0->");
	    send_hz(4,3,"返回");
    }
    if(F0_sign==1&&key==F2&&KX_sign==0)
    {
        F2_sign=1; //选择循环采集模式
        KX_sign=0; //关闭通道选择
        lcd_init();
        send_hz(1,0,"循环采集模式");
        send_asc16str(4,16,"F3->");
	    send_hz(4,1,"确定");
        send_asc16str(4,32,"F0->");
	    send_hz(4,2,"返回");
    }
    if(KX_sign==1&& key==F3)
    {
        KX_sign=0; //只有再次按下F0键以后才能重新操作
	    F0_sign=0;
        F2_sign=0;
	    PASS_Disp(pass_data);//通道选择确定后数据处理
    }
    if(F2_sign==1&& key==F3)
    {
        KX_sign=0; //只有再次按下F0键以后才能重新操作
	    F0_sign=0;
        F2_sign=0;
        CYC_Disp();
    }
       
}

void LCDSend_Int(void)
{
    lcd_init();
    send_asc16str(0,0,"**");
    send_asc16str(14,0,"**");;
    send_hz(1,0,"多路采集系统");
	send_asc16str(2,16,"F0:");
    send_hz(3,1,"通道选择");
    send_asc16str(2,32,"F1:");
	send_hz(3,2,"帮助");
}

void Help_1(void) //显示帮助内容
{
    lcd_init();
    send_asc16str(0,0,"**");
    send_asc16str(14,0,"**");;
    send_hz(1,0,"按键功能定义");
    send_asc16str(2,16,"F0:");
    send_hz(3,1,"通道选择");
    send_asc16str(2,32,"F2:");
    send_hz(3,2,"选择确定");
    send_asc16str(2,48,"K1-K8:");
    send_hz(4,3,"通道");
}

void PASS_Disp(unsigned char pass_data)
{
    bit exit_sign=0; //数据处理结束标志
    unsigned char TX_time=0;//数据重发次数计数
    unsigned char Verify_data=0;//接收和检验值
	unsigned char Verify_ET=0; //和校验错误发生次数
	unsigned char anew_TX[3]={0x01,0x00,0x00};//要求从机重发指令数组
	unsigned char send_Num=0; //条码显示计数
	unsigned char delay_num=0; //超时计数
    bit RX_sign=0;//接收数据是否为第一次数据标志
	unsigned int i;//定时控制变量

    lcd_init();
	send_asc16str(2,0,"->");
    send_hz(2,0,"采集通道");
    send_asc16str(12,0,":");
    send_ascii16(13,0,pass_data+0x30);
    send_hz(0,1,"系统处理中请稍后");
    TX[0]=0x01; //从机地址
	TX[1]=0x01; //数据采集命令字
    TX[2]=0x02; //数据长度
    TX[3]=pass_data-1;//采集通道值(0-7)
	TX[4]=pass_data-1;//和检验
	UART0_TX(TX,5);					
    while(exit_sign==0)
    {
		 for(i=65535;i>0;i--);
         if(ReceiveBit==0)
         {
             UART0_TX(TX,5);
         }         
		 if(RX_sign==0)
		 {
		     send_asc16str(send_Num,32,">");//动态显示系统处理状态">>>>>>>>>>>>>>>>"
			 send_Num++;
			 if(send_Num==15)
			 {
			     send_Num=0;
			     send_asc16str(0,32,"                ");
	             delay_num++;
				 if(delay_num==3)
				 {
				     delay_num=0;
	                 lcd_init();
	                 send_hz(2,1,"通讯超时");
	                 send_asc16str(0,32,"->");
	                 send_hz(1,2,"请检查通信网络");
	                 exit_sign=1;
				 }
	         }
	     }
         if(ReceiveBit==1) //接收到一帧数据
         {
             ReceiveBit=0; //清除接收完成标志
             if(RX[1]==0)  //从机要求重发数据
             {
			     REN0=1;//重新允许接收
                 UART0_TX(TX,5);
                 TX_time++;
                 if(TX_time==3)//重发次数超过三次报警
                 {
                     TX_time=0;
                     lcd_init();
                     send_hz(1,1,"从机通讯错误");
                     send_asc16str(0,32,"->");
                     send_hz(1,2,"请检查通讯线路");
                     exit_sign=1;
                 }   
            }         
            else
            {
                if(RX[1]==1)
                {
                    Verify_data=Sum_verify(RX+3,4);//对接收的数据(一字节通道字节数据)进行和校验
                    if(Verify_data==RX[7]) //和校验正确,显示采集数值
                    {
					    if(RX_sign==0)//第一次数据发送
						{
						    RX_sign=1;
						    lcd_init();
		                    send_asc16str(0,0,">>            <<");
	                        send_hz(1,0,"采集通道");
	                        send_asc16str(10,0,":");
	                        send_ascii16(12,0,RX[3]+0x30);
	                        send_hz(1,2,"采集值");
	                        send_asc16str(8,32,":");
	                        send_ascii16(9,32,RX[4]+0x30);
	                        send_ascii16(10,32,'.');
	                        send_ascii16(11,32,RX[5]+0x30);
	                        send_ascii16(12,32,RX[6]+0x30);
							send_ascii16(13,32,'V');
                        }
						else
						{
						    send_ascii16(12,0,RX[3]+0x30);
							send_ascii16(9,32,RX[4]+0x30);
	                        send_ascii16(11,32,RX[5]+0x30);
	                        send_ascii16(12,32,RX[6]+0x30);
						}
                        for(i=65535;i>0;i--);
                        TX[0]=0x01; //从机地址
	                    TX[1]=0x01; //数据采集命令字
                        TX[2]=0x02; //数据长度
                        TX[3]=pass_data;//采集通道值
	                    TX[4]=pass_data;//和检验
	                    UART0_TX(TX,5);
					    REN0=1;//重新允许接收
					    if(key_sign==1) //有按键
                            exit_sign=1;
					}
			        else //和校验错误
					{
					    REN0=1;//重新允许接收
					    UART0_TX(anew_TX,3);//请求从机重新发送上一次数据

⌨️ 快捷键说明

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