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

📄 多路数据采集.txt

📁 多路数据采集系统
💻 TXT
📖 第 1 页 / 共 3 页
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define  WriteDeviceAddress 0xa0	//写驱动地址指令
#define  ReadDeviceAddress 0xa1		//读驱动地址指令
//变量说明:
//I循环发送时存放的通道数
//td用于循环显示电压的变量值
//time  show_time          time为128ms扫描一次的时间标志位    屏幕刷新的频率,大约是=16时累计时间为1秒
//temp为属性变量寄存器,即页面属性的变量寄存器
//sel_flag,show_flag为为sel的菜单状态寄存器和显示结果的状态标志位,根据不同的情况调出不同的菜单
//x_sw,x_gw,x_time 分别代表的是十位,个位,即计数的个数
//x_dat=0,x_add=0; x_sz=0,代表的是X5045的双字节读写时数据和地址。以及读取出数字数据暂存变量
uchar e=0,sec=1,select;                                                  //sec为秒的十位
uchar at_add=0;
unsigned int sec_page;
uchar idata x_rdat[40];                                                   //at_add为在AT24C02中所存的数值(掉电)
bit w = 0; //调时标志位
uchar at_i=0; //用于作为通道的标志位
uchar idata t[10]={0,0,0,0,0,0,0,0};                             //作为温度显示
uchar alarm[8]={0,0,0,0,0,0,0,0},alarm_td,alarm_flag,alarm_stop=0,x_j,alarm_i;
uchar idata x_tdat[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned int r_dat;
unsigned char time, show_time;
unsigned char temp,sel_flag,show_flag;
unsigned char fs_td,td;                                         // td用于循环显示的通道数目
//键盘引脚定义
sbit dog=P2^0;
sbit alarm_led=P2^1;
sbit e_485 = P2^4;       //485数据传输和接收使能端。
sbit KEY_1 = P1^6;	 //左上		功能:退出  显示数据功能
sbit KEY_2 = P1^7;	 //左下		功能:加一
sbit KEY_3 = P1^5;	 //右上		功能:设置时间
sbit KEY_4 = P1^4;	 //右下		功能:减一
sbit ep_sck=P2^2;
sbit ep_si=P2^3;
sbit ep_so=P3^5;
sbit ep_cs=P3^4;
//向5045中写入数据
void xinput(unsigned char v)
{	unsigned char data v1;
  	for(v1=0;v1<8;v1++)
  	{		ep_sck=0;		//拉低时钟
  		ep_si=v&0x80;		//送出一位数据
  		ep_sck=1;		//拉高时钟触发移位寄存器
  		v=v<<1; }//准备输出下一位
   	ep_si=1;}
//数据的读出
//辅助函数:从5045输入一个字节8位数据,首先输出高位。
unsigned char xout()
{	unsigned char data v1,x,y;
        ep_sck=0;			//拉低时钟
  	for(v1=0;v1<8;v1++)
  	{		ep_sck=1;		//拉高时钟
		x=x<<1;			//输出字节先左移
  		y=ep_so;		//获得一位输出
		x=x|y;			//组装输出结果
  		ep_sck=0;}
  	return x;}
//辅助函数:写结束测试
void wip_poll()
  {	unsigned char data v;
	do
	{	ep_cs=1;
		ep_cs=0;
		xinput(0x05);		//准备读状态寄存器
		v=xout();
		ep_cs=1;
		v=v&0x01;}
	while(v==1); }			//测试寄存器低位,为零则写结束。
//辅助函数:打开写开关,所有写操作前必须运行本程序,命令字为06H
void wren()
{	ep_cs=1;
	ep_cs=0;
	xinput(0x06);			//发出打开开关命令
	ep_cs=1;}
//辅助函数:关闭写开关,所有写操作后必须运行本程序,以防止误写,命令字为04H
void wrdi()
{	ep_cs=1;
	ep_cs=0;
	xinput(0x04);
	ep_cs=1;}
//辅助函数:写状态寄存器,包含WREN_CMD命令。
//功能:改变块锁定控制位BL1,BL0(D3,D2)及看门狗超时控制位WD1,WD0(D5,D4)
void wrsr(unsigned char x)
{	wren();				//打开写开关
	ep_cs=1;
	ep_cs=0;
	xinput(0x01);			//送入命令
	xinput(x);
	ep_cs=1;
	wip_poll();			//测试写结束
	wrdi();}//关闭写开关
//辅助函数:读状态寄存器。
unsigned char  rdsr()
  {	unsigned char data x;
	ep_cs=1;
	ep_cs=0;
	xinput(0x05);
	x=xout();
	ep_cs=1;
	return x; }
//单字节写子程序,使用中调用wren()。如果使用了块锁定,还需要先写状态寄存器解除锁定。
//函数带有形参wrdat和wradd,前者为写入的字符型数据,后者为整形地址。
void byte_write(unsigned char wrdat,unsigned int wradd)
{	unsigned char data x;
	wren();
	ep_cs=1;
	ep_cs=0;
	if(wradd<256)		//据输入地址决定写前256地址块或者后256块
	 	xinput(0x02);		//02表示使用低256区块
	else
	 	xinput(0x0a);		//0a表示使用高256区块
	x=wradd%256;		//高位地址已经输入,此处只需要输入低8位地址
	xinput(x);
	xinput(wrdat);
	ep_cs=1;
    	wip_poll();
    	wrdi();}
//单字节读子程序,本函数返回字符型结果
unsigned char byte_read(unsigned int rdadd)
{	unsigned char data x;
	ep_cs=1;
	ep_cs=0;
	if(rdadd<256)			//根据要读取的地址写入命令字
     		xinput(0x03);
	else
	 	xinput(0x0b);
	x=rdadd%256;
	xinput(x);
	x=xout();
	ep_cs=1;
	return(x); }
//双字节写子程序。使用中调用wren()。如果使用了块锁定,还需要先解除锁定。
//函数带有形参wrdat1和wradd1,前者为写入的整型数据,后者为整形地址。
void word_write(unsigned int wrdat1,unsigned int wradd1)
{	unsigned char data x;
	wren();
	ep_cs=1;
	ep_cs=0;
	if(wradd1<256)
     		xinput(0x02);			//根据地址写入命令字
	else
	 	xinput(0x0a);
	x=wradd1%256;
	xinput(x);
	x=wrdat1>>8;				//写入高字节
	xinput(x);
	x=wrdat1%256;				//写入低字节
	xinput(x);
	ep_cs=1;
    	wip_poll();
    	wrdi();}
//双字节读子程序,本函数返回整形结果
unsigned int word_read(unsigned int rdadd1)
  {	unsigned char data x;
	unsigned int data rddat1;
	ep_cs=1;
	ep_cs=0;
	if(rdadd1<256)
      		xinput(0x03);
	else
	  	xinput(0x0b);
	rddat1=rdadd1%256;
	xinput(rddat1);
	x=xout();
	rddat1=100*x;
	x=xout();
	rddat1=rddat1+x;
	ep_cs=1;
	return(rddat1);
}
//----------------------------------------------------------------------
//////////////////////
//LCD12864程序
////////////////////////
sbit cs=P1^0 ;//对应RS
sbit sid=P1^1 ;//对应R/W
sbit clk=P1^2;//对应E
sbit ret=P1^3;//对应ret
unsigned char mo,dd;//定义时间映射全局变量(专用寄存器)
void Delay_Xus(unsigned char x)		//x取值1~255;
{	while(--x); }
void delayms(unsigned char ms)
// 延时子程序
{	unsigned char i;
	while(ms--)
	{		for(i = 0; i < 120; i++);}}
//串口发送一个字节
void SendByte(unsigned char Dbyte)
{     	unsigned char i ;
     	for(i=0;i<8 ;i++)
     	{   	clk = 0 ;
           	Dbyte=Dbyte<<1 ;      //左移一位
           	sid = CY;            //移出的位给sid
           	clk = 1;
           	clk = 0; }}
//串口接收一个字节
//仅在读取数据的时候用到
//而读出的数据是一次只能读出4bit的
unsigned char ReceiveByte(void)
{	unsigned char i,temp1,temp2;
     	temp1=temp2=0 ;
     	for(i=0;i<8;i++)
     	{  	temp1=temp1<<1;
           	clk = 0 ;
           	clk = 1 ;
           	clk = 0 ;
           	if(sid)
           	 	temp1++ ;
     	}
     	for(i=0;i<8;i++)
     	{ 	temp2=temp2<<1 ;
           	clk = 0 ;
           	clk = 1 ;
           	clk = 0 ;
           	if(sid)
           		temp2++ ;
     	}
    	 return ((0xf0&temp1)+(0x0f&temp2)) ;
}
void CheckBusy( void )
{     	do   SendByte(0xfc) ;      		//11111,RW(1),RS(0),0
     	while(0x80&ReceiveByte()) ;      	//BF(.7)=1 Busy
}
void WriteCommand( unsigned char Cbyte )
{     	cs = 1;
     	CheckBusy() ;
     	SendByte(0xf8) ;            		//11111,RW(0),RS(0),0
     	SendByte(0xf0&Cbyte) ;      		//高四位
     	SendByte(0xf0&Cbyte<<4) ;		//低四位(先执行<<4)
     	cs = 0 ;
}

void WriteData( unsigned char Dbyte )
{     	cs = 1 ;
     	CheckBusy() ;
     	SendByte(0xfa) ;            	//11111,RW(0),RS(1),0
     	SendByte(0xf0&Dbyte) ;      	//高四位
     	SendByte(0xf0&Dbyte<<4) ;	//低四位(先执行<<;)
     	cs = 0 ;
}
unsigned char ReadData()
{	unsigned char tmp;
     	cs = 1 ;
     	CheckBusy() ;
     //	SendByte(0xfe) ;            	//11111,RW(1),RS(0),0
		//	return ReceiveByte();
			do   SendByte(0xfe) ;      		//11111,RW(1),RS(0),0
     	while((tmp=ReceiveByte())!=0x00) ;
     	return tmp;
     	cs = 0 ;
}
////////////
//清除显示//
////////////
void lcd_cls()
{	WriteCommand(0x01);
}
////////////
//地址归位//
////////////
void address_reset()
{	WriteCommand(0x02);
}
////////////////////////////
//      进入点设定        //
//  S  I/D  description   //
//  0   0    光标左移     //
//  0   1    光标右移     //
//  1   0   书面整体向右  //
//  1   1   书面整体向左  //
////////////////////////////
void enter_mode_set(bit i_d,bit s)
{	unsigned char cmd=0x04;
	if (i_d) cmd|=0x02;
	if (s) cmd|=0x01;
	WriteCommand(cmd);
}
////////////////////////////
// 显  示  状  态  开  关 //
//  D=1: 整体显示 ON      //
//  C=1: 游标ON           //
//  B=1:游标位置反白允许  //
////////////////////////////
void display_state(bit d,bit c,bit b)
{	unsigned char cmd=0x08;
	if (d) cmd|=0x04;
	if (c) cmd|=0x02;
	if (b) cmd|=0x01;
	WriteCommand(cmd);
}
////////////////////////////////
//      光标或显示控制        //
//  S/C  R/L    description   //
//   0    0     光标向左移动  //
//   0    1     光标向右移动  //
//   1    0     显示向左移动  //
//   1    1     显示向右移动  //
////////////////////////////////
void cursor_display(bit s_c,bit r_l)
{	unsigned char cmd =0x10;
	if (s_c) cmd|=0x08;
	if (r_l) cmd|=0x04;
	WriteCommand(cmd);
}
////////////////////////////////
//        (扩充)功能设置      //
//  DL='1',为8 BIT MPU控制界面//
//  DL='0',为4 BIT MPU控制界面//
//  RE='1',为扩充指令集       //
//  RE='0',为基本指令集       //
//  G='1',绘图显示ON          //
//  G='0',绘图显示OFF         //
////////////////////////////////
void lcd_mode(bit dl,bit re,bit g)
{	unsigned char cmd =0x20;
	if (dl) cmd|=0x10;
	if (g) cmd|=0x02;
	WriteCommand(cmd);
	if (re) cmd|=0x04;
	WriteCommand(cmd);
}
////////////////////
//  设定DDRAM地址 //
//  AC6固定为0    //
////////////////////
void DDRAM_address(unsigned char x,unsigned char y)
{	unsigned char temp=y-1;
	if (y==2) temp=2;
	if (y==3) temp=1;
	WriteCommand(0x80+temp*8+x-1);
}
////////////////
//  待命模式  //
//            //
////////////////
void await_orders()
{	lcd_cls();
	//WriteCommand(0x01);
}
//输入要显示的字
void coding_display(const char *s)
{	while(*s)
	{	WriteData(*s++);
	}
}
void show_num(unsigned int num)
{	unsigned char d[5];
	d[0]=num/10000+0x30;
	d[1]=num%10000/1000+0x30;
	d[2]=num%1000/100+0x30;
	d[3]=num%100/10+0x30;
	d[4]=num%10+0x30;
	if (d[0]!=0x30)
		{			coding_display(d);
		}
		else if (d[1]!=0x30)
			{				coding_display(d+1);//表示的是在d[0]=0的时候,不显示最高位的值。
			}
			else if (d[2]!=0x30)
				{coding_display(d+2);
				}
				else if (d[3]!=0x30)
					{						coding_display(d+3);
					}
					else
						{							coding_display(d+4);
						}
}
void lcd_init()

⌨️ 快捷键说明

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