📄 多路数据采集.txt
字号:
{ ret=0;
ret=1;
lcd_mode(1,0,0); //8BitMCU,基本指令集合
display_state(1,0,0); //显示ON,游标OFF,游标位反白OFF
lcd_cls(); //清屏,AC归0
enter_mode_set(1,0); //写入时,游标右移动
}
/////////////////////////////////////////////////
//12864驱动程序结束
//////////////////////////////////////////////////
//////////////////////////////////////////////////
//DS1302程序驱动
////////////////////////////////////////////////////
///////////////////////////////////////
////////////////////////////
//DS1302调试程序
//////////////////////////
/////////////////////////
/**********************************
DS1302内部函数
**********************************/
sbit T_CLK=P2^5;
sbit T_IO=P2^6;
sbit T_RST=P2^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
//常用typedef定义新类型名
//如:typedef 已有类型 新定义类型;这里这样定义主要是为了在后面是为了使用的方便
//有点类似继承的味道
typedef struct SYSTEMTIME
{ uchar Second;
uchar Minute;
uchar Hour;
uchar Week;
uchar Day;
uchar Month;
uchar Year;
uchar DateString[9];
uchar TimeString[9];
}SYSTEMTIME; //定义的时间类型
/**********************************
向DS1302中写入1Byte数据
**********************************/
void WriteB(uchar ucDa)
{ uchar i;
ACC=ucDa;
for(i=8;i>0;i--)
{T_IO=ACC0;
T_CLK=1;//数据在此上升沿被写入
T_CLK=0;//其实答案非常简单,就是按照时序进行编码,根据时序,在这个时候数据被写入芯片
ACC=ACC>>1;
}
}
/**********************************
从DS1302中读出1Byte数据
**********************************/
uchar ReadB(void)
{ uchar i;
for(i=8;i>0;i--)
{ ACC=ACC>>1;
ACC7=T_IO;
T_CLK=1;
T_CLK=0;//数据在此下降沿被读出
}
return(ACC);
}
/**********************************
单字节写,向DS1302某地址中写入命令/数据,先写地址后写命令/数据,单字节写,向DS1302某地址中写入,命令/数据,先写地址后写命令/数据,在完成一个字节的读写操作之后,都要将RST低电平拉低以停止读写操作,使IPTO处高组态,在这里的T_CLK在读写一个字节的时候必须首先是拉低的,由于其在读写单个数据或者字节的时候,T_CLK得是一个高脉冲,不然的话。系统就是感觉不到读写操作了
**********************************/
void W_1302(uchar ucAddr,uchar ucDa)
{ T_RST=0;
T_CLK=0;
T_RST=1;
WriteB(ucAddr);
WriteB(ucDa);
T_CLK=1;
T_RST=0;
}
/**********************************
单字节读,从DS1302某地址中读
出数据,先写地址后写命令/数据
**********************************/
uchar R_1302(uchar ucAddr)
{ uchar ucDa;
T_RST=0;
T_CLK=0;
T_RST=1;
WriteB(ucAddr);
ucDa=ReadB();
T_CLK=1;
T_RST=0;
return(ucDa);
}
/**********************************
设置初始时间,ptda指向初始时间地址
格式为:
秒,分,时,日,月,星期,年
**********************************/
void set_1302()
{ uchar ucAddr=0x80;
W_1302(0x8e,0x00);
W_1302(0x80,0x00);
W_1302(0x82,0x00);
W_1302(0x84,0x00);
W_1302(0x86,0x00);
W_1302(0x88,0x00);
W_1302(0x8a,0x00);
W_1302(0x8c,0x00);
}
/**********************************
读取 DS1302当前时间,
格式为:
秒,分,时,日,月,星期,年
这是由于在DS1302寄存器的各位内容所代表的意思所决定的
如:在秒寄存器中,654位地址所存放的是10SEC,而3210位所存放是则是其SEC的数据,因此需要转换
在内存区域所存放的都是十进制数。因此直接是乘以10就可以了。
**********************************/
void get_1302(SYSTEMTIME *Time)
{ uchar Readtime;
Readtime = R_1302(0x81);
Time->Second = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x83);
Time->Minute = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x85);
Time->Hour = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x87);
Time->Day = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
dd=((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
//Readtime = R_1302(0x8b);
//Time->Week = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x89);
Time->Month = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
mo= ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
Readtime = R_1302(0x8d);
Time->Year = ((Readtime&0x70)>>4)*10 + (Readtime&0x0f);
//将十进制数转换为液晶显示的数值
Time->DateString[0] = Time->Year/10 + '0';//这里的0只是为了后面的在显示部分可以比较方便的判断是不是输出到了最后一个字母
Time->DateString[1] = Time->Year%10 + '0';
Time->DateString[2] = '-';
Time->DateString[3] = Time->Month/10 + '0';
Time->DateString[4] = Time->Month%10 + '0';
Time->DateString[5] = '-';
Time->DateString[6] = Time->Day/10 + '0';
Time->DateString[7] = Time->Day%10 + '0';
Time->DateString[8] = '\0';
//将十进制数转换为液晶显示的数值
Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
Time->TimeString[2] = ':';
Time->TimeString[3] =Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10+ '0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10+ '0';
Time->TimeString[8] = '\0';
//sec=Time->Second%10;
}
////////////////////////////////////////
//DS1302驱动结束
//////////////////////////////////////
//调时用加1程序
/*//////////////////////////////////////////////////
功能:主要是用于设置第二界面
*/
////////////////////////////////////////////////////////
void set_page(unsigned char sel)
{ unsigned char max,mini;
WriteCommand(0x90);
show_flag=0;
if(sel==0) {coding_display("循环工作");max=1; mini=0;sel_flag=sel;} //设置工作模式
if(sel==1) {coding_display("选择工作");max=8; mini=0;sel_flag=sel;} //设置工作模式
if(sel==2) {coding_display("报警通道");max=7; mini=0;sel_flag=sel;} //设置报警温度
if(sel==3) {coding_display("电压设定");max=200; mini=0;sel_flag=sel;}
if(sel==4) {coding_display("历史通道");max=8; mini=0;sel_flag=sel;} //可以读取存放与外部FLASH中的数据
if(sel==5) {coding_display("历史7-13");sel_flag=sel;} //可以读取存放与外部FLASH中的数据
if(sel==6) {coding_display("历史13-18");sel_flag=sel;} //可以读取存放与外部FLASH中的数据
if(sel==7) {coding_display("历史17-20");sel_flag=sel;} //可以读取存放与外部FLASH中的数据
WriteCommand(0x95);
coding_display(" ");
if(KEY_2 == 0){
temp++;//数加 1
}
if(KEY_4 == 0)
{ temp--;//数减 1
}
if(temp>max) temp=mini;//查看数值有效范围
if(temp<mini) temp=max;//
if(sel==2){alarm_td=temp;}
if(sel==3){alarm[alarm_td]=temp;}
byte_write(x_j,0x01C2+alarm_td);
}
///////////////////////////////////////////////////////
/*
功能:更新在第二界面中的参数
*/
/////////////////////////////////////////////////////
void up_data()
{ if(sel_flag==3)
{ WriteCommand(0x95);
show_num(temp/100);
coding_display(".");
show_num(temp/10%10);
show_num(temp%10);
}
else
{ WriteCommand(0x95);
show_num(temp);
coding_display(" ");
}
//显示所选择的属性
}
///////////////////////////////////////////////////////////
/*
设置第一界面
*/
/////////////////////////////////////////////////////////
void up_page()
{ SYSTEMTIME Realtime;
get_1302(&Realtime);//取时间
DDRAM_address(1,2);
coding_display(" 八路采集系统 ");
DDRAM_address(1,3);
coding_display("Time:");
coding_display(Realtime.TimeString);
DDRAM_address(1,4);
coding_display("Date:");
coding_display(Realtime.DateString);
WriteCommand(0x83);
coding_display(" ");
WriteCommand(0x80);
coding_display("[Dis] ");
WriteCommand(0x85);
coding_display(" [Set]");
}
////////////////////////////////////////////////////////////
////函数up_show()此时用于显示用于选择所需要的数据
////////////////////////////////////////////////////////////
void up_show()
{ if(sel_flag==0)
{
if(temp==1)
{
WriteCommand(0x82);
coding_display("循环采样");
WriteCommand(0x90);
show_num(td);
coding_display(": ");//覆盖前面遗留下来的数据,造成错误
show_num(x_tdat[2*td]/10);
coding_display(".");
show_num(x_tdat[2*td]%10);
show_num(x_tdat[2*td+1]/10);
show_num(x_tdat[2*td+1]%10);;
coding_display(" v T=");
show_num(t[td]);
coding_display(" ");//覆盖前面遗留下来的数据,造成错误
td=td+1;
if(td>7){td=0;}
}
}
if(sel_flag==1)
{ WriteCommand(0x82);
coding_display("选择采样");
WriteCommand(0x90);
show_num(temp);
coding_display(": ");//覆盖前面遗留下来的数据,造成错误
show_num(x_tdat[2*temp]/10);
coding_display(".");
show_num(x_tdat[2*temp]%10);
show_num(x_tdat[2*temp+1]/10);
show_num(x_tdat[2*temp+1]%10);
coding_display(" v T=");
show_num(t[temp]);
coding_display(" ");//覆盖前面遗留下来的数据,造成错误
}
if(sel_flag==2)
{ WriteCommand(0x82);
coding_display("报警通道");
WriteCommand(0x90);
coding_display("通道: ");
show_num(alarm_td);
alarm_led=1;
}
if(sel_flag==4)
{ uchar j;
WriteCommand(0x82);
coding_display("回放历史 ");
show_num(temp);
WriteCommand(0x90);
for(j=x_j;j>0;j--)
{ x_rdat[2*(x_j-j)]=byte_read(2*temp+16*j);
x_rdat[2*(x_j-j)+1]=byte_read(2*temp+16*j+1);
}
for(j=19;j>x_j;j--)
{ x_rdat[2*(20-j+x_j)]=byte_read(2*temp+16*j);
x_rdat[2*(20-j+x_j)]=byte_read(2*temp+16*j+1);
}
for(j=1;j<3;j++)
{ show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
WriteCommand(0x88);
for(j=3;j<5;j++)
{ show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
WriteCommand(0x98);
for(j=5;j<7;j++)
{ show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
}
if(sel_flag==5)
{ unsigned char j;
WriteCommand(0x90);
for(j=7;j<9;j++)
{show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
WriteCommand(0x88);
for(j=9;j<11;j++)
{
show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
WriteCommand(0x98);
for(j=11;j<13;j++)
{
show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
show_num(x_rdat[j*2+1]/10);
show_num(x_rdat[j*2+1]%10);
coding_display(" v ");
}
}
if(sel_flag==6)
{ unsigned char j;
WriteCommand(0x90);
for(j=13;j<15;j++)
{
show_num(x_rdat[j*2]/10);
coding_display(".");
show_num(x_rdat[j*2]%10);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -