📄 多路数据采集.txt
字号:
#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 + -