📄 主机.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
data union {float word;struct {uchar hand;uchar ten;uchar several;uchar point;}byte;}union_variary;
//data union {long word;struct {uchar hand;uchar ten;uchar several;uchar point;}byte;}variary;
uchar data m=0,n=0;//分别记录按键的行和列值
uchar code tab[4][4]={{0xee,0xed,0xeb,0xe7},{0xde,0xdd,0xdb,0xd7},{0xbe,0xbd,0xbb,0xb7},{0x7e,0x7d,0x7b,0x77}};//0到15个键值
uchar code www[]={"按键提示"};
uchar code aa[]={"滚屏请按"};//1
uchar code bb[]={"显示时间按"};//2
uchar code cc[]={"修改时间按"};//3
uchar code dd[]={"温度上限按"};//4
uchar code ee[]={"温度下限按"};//5
uchar code ff[]={"显示温度请按"};
//uchar code gg[]={"取二号温度按"};//7
uchar code hh[]={"设置上限按"};//8
uchar code ii[]={"设置下限按"};//9
uchar code jj[]={"温度校准按"};//10
uchar code kk[]={"当前时间为"};
uchar code ll[]={"温度上限为"};
uchar code mm[]={"温度下限为"};
uchar code nn[]={"放弃请按"};
uchar code oo[]={"确定请按"};
uchar code pp[]={"并按一或二确认"};
uchar code qq[]={"当前温度为"};
//uchar code rr[]={"二号温度为"};
uchar code ss[]={"送满度误差按"};
uchar code tt[]={"送零点误差按"};
uchar code uu[]={"子机一校准成功"};
uchar code vv[]={"子机二校准成功"};
uchar code ww[]={"送误差按"};
uchar code ww1[]={"按一送零点误差"};
uchar code ww2[]={"按二送满度误差"};
uchar code ww3[]={"读误差按"};
uchar code ww4[]={"确定地址按"};
uchar code www1[]={"进行编号"};
uchar code w1[]={"成功"};
uchar code xml[]={2,1,0,3,4,5,6};//写1302命令表
uchar code dml[]={0,1,2,3,4,5,6};//读1302命令表
uchar idata time[6]={0,0,0,0,0,0};
uchar idata Timee[6]={0,0,0,0,0,0};//存放时间
uchar idata uplim1[6]={0,0,0,0,0,0},uplim2[6]={0,0,0,0,0,0};//存放温度上限
uchar idata downlim1[6]={0,0,0,0,0,0},downlim2[6]={0,0,0,0,0,0};//存放温度下限
uchar idata lim[8]={0,0,0,0,0,0,0,0};
uchar idata firstT[4]={0,0,0,0};//存放一号温度
uchar idata secondT[4]={0,0,0,0};//存放二号温度
uchar idata buff[9]={0,0,0,0,0,0,0,0,0};//接收缓冲区
uchar idata sendbuf[9]={0,0,0,0,0,0,0,0,0};//发送缓冲区
uchar idata error[9]={0,0,0,0,0,0,0,0,0};//存误差
idata uint i=0,f=0,j1=0;
idata unsigned long j=0;
idata uchar overtime=0;//超时标志
uchar data k=3;//上移计数器
uchar data unmber=0;//控制显示的子机温度
uchar data num=0;//子机地址号
uchar data times=0;//校准次数
uchar data uplim[4]={0,0,0,0};
uchar data downlim[4]={0,0,0,0};
uchar data * limm;
uint data word=0;
sbit req=P2^6;
sbit busy=P2^7;
sbit rest=P2^5;
sbit sclk=P3^2;//ds1302时钟线
sbit trx=P2^1;
sbit IO=P3^3;
sbit Rst=P3^4;
//////////////////////////////////////
send_byte(unsigned char xx)//向液晶写数据
{
while(busy==1);
P1=xx;
req=1;
while(busy==0);
req=0;
}
//显示1个汉字,需要一个全局变量(1个汉字)支持
dis_word(unsigned char x,unsigned char y,unsigned char command)//液晶显示
{
unsigned char data i;
if(command==0xf0)//显示汉字
{
i=command;
send_byte(i);
send_byte(x);
send_byte(y);
i=word/256;
send_byte(i);
i=word%256;
send_byte(i);
}
if(command==0xf9) //显示字符
{
i=command;
send_byte(i);
send_byte(x);
send_byte(y);
i=word;
send_byte(i);
}
if(command==0xf4||command==0xf5) //清屏或者上移
{
i=command;
send_byte(i);
}
}
void send()
{
unsigned char data i;
trx=1; //485发 送允许
TI=0;
for(i=0;i<9;i++)
{
SBUF=sendbuf[i];
while(TI==0)
{}
TI=0;
}
for(i=0;i<30;i++)
{}
trx=0;
for(i=0;i<255;i++)
{}
RI=0;
}
/****************************************************************************************
*****************************************BCD码转换到ASC码********************************
****************************************************************************************/
void bcdtoasc(unsigned char *lvalue)
{
m=*lvalue=((*lvalue)&0x0f)+10*( ((*lvalue)&0xf0)>>4);
}
/****************************************************************************************
*****************************************ASC码转换到BCD码********************************
****************************************************************************************/
void asctobcd(unsigned char *lvalue)
{
*lvalue=(((*lvalue)/10)<<4)|(((*lvalue)%10)&0x0f);
}
/******************************************************************************************
*************************************对于1302的读和写函数**********************************
******************************************************************************************/
void write_byte(unsigned char te) //往ds1302 写入一个字节
{
unsigned char i;
//T_RST=1;
for(i=0;i<8;i++)
{
IO=te&0x01; //取最后一位
sclk=1; //模拟脉冲
sclk=0;
te= te>>1; //右移一位
}
}
unsigned char read_byte() //从ds1302 读出一个字节
{
unsigned char data i,j,k;
IO=1;
j=0;
for(i=0;i<8;i++)
{
j=j>>1; //左移一
k=IO; //传送数据
k=k<<7; //接受位右移
j=j|k;
sclk=1; //模拟脉冲
sclk=0;
}
return j;
}
void write_word(unsigned char add,unsigned char word,unsigned char flag) //写1302先写命令再写数据
{
sclk=0;
Rst=0; //时钟初始化
Rst=1;
add=add<<1;
add=add|0x80;
if(flag==1)
{
add=add|0x40;
}
write_byte(add); //写入命令
write_byte(word); //写入数据
Rst=0; //清时钟
sclk=0;
}
unsigned char read_word(unsigned char addr,unsigned char flag) //读1302先写命令再读数据
{
unsigned char data i;
sclk=0;
Rst=0; //时钟初始化
Rst=1;
addr=addr<<1;
addr=addr|0x81;
if(flag==1)
{
addr=addr|0x40;
}
write_byte(addr); //写入命令
i=read_byte(); //读出数据
Rst=0;
sclk=0;
return i;
}
void xsz1302()
{
uchar data a,b,i;
uchar code * data e;
uchar data *c; //反复调用函数将数据写完
for(i=0;i<3;i++)
{
e=xml+i;
a=*e;
c=time+i;
asctobcd(c);
time[i]=*c;
b=time[i];
write_word(a,b,0);
//bcdtoasc(c);
//time[i]=*c;
}
}
/******************************************************************************************
*************************************从1302读出时钟数据************************************
******************************************************************************************/
kaiguan(uchar a)
{
switch(a)
{
case 0:
Timee[f]=48;
break;
case 1:
Timee[f]=49;
break;
case 2:
Timee[f]=50;
break;
case 3:
Timee[f]=51;
break;
case 4:
Timee[f]=52;
break;
case 5:
Timee[f]=53;
break;
case 6:
Timee[f]=54;
break;
case 7:
Timee[f]=55;
break;
case 8:
Timee[f]=56;
break;
case 9:
Timee[f]=57;
break;
}
f++;
if(f==6)
{
f=0;
send_byte(0xf4);
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(kk[i]-0xa0)+kk[i+1]-0xa0;
dis_word(j+3,0,0xf0);
}
word=Timee[5];
dis_word(0x06,15,0xf9);
word=Timee[4];
dis_word(0x07,15,0xf9);
word=':';
dis_word(0x08,15,0xf9);
word=Timee[3];
dis_word(0x09,15,0xf9);
word=Timee[2];
dis_word(0x0a,15,0xf9);
word=':';
dis_word(0x0b,15,0xf9);
word=Timee[1];
dis_word(0x0c,15,0xf9);
word=Timee[0];
dis_word(0x0d,15,0xf9);
}
}
void dsz1302()
{
uchar data i,a,c; //反复调用函数将数据读完
uchar data *b;
uchar code * data e;
for(i=0;i<7;i++)
{
e=dml+i;
a=*e;
b=time+i;
c=read_word(a,0);
b=&c;
bcdtoasc(b);
time[i]=*b;
}
kaiguan(time[0]%10);
kaiguan(time[0]/10);
kaiguan(time[1]%10);
kaiguan(time[1]/10);
kaiguan(time[2]%10);
kaiguan(time[2]/10);
}
///////////////////////////////////////////////
void delay(unsigned char wai,unsigned char nei)
{ unsigned char i;
unsigned char j;
for(i=0;i<wai;i++)
for(j=0;j<nei;j++);
}
////////////////////////////
bit pkey()//去抖动
{
P0=0xf0;
if(P0!=0xf0)
{
delay(5,250);
if(P0!=0xf0)
return 1;
else
return 0;
}
else
return 0;
}
retur()
{
for(i=0,j=0;i<7;i=i+2,j++)
{
word=256*(www[i]-0xa0)+www[i+1]-0xa0;
dis_word(j+4,0,0xf0);
}
//////////////////
for(i=0,j=0;i<7;i=i+2,j++)
{
word=256*(aa[i]-0xa0)+aa[i+1]-0xa0;
dis_word(j+3,1,0xf0);
}
word='1';
dis_word(0x11,16,0xf9);
/////////////
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(bb[i]-0xa0)+bb[i+1]-0xa0;
dis_word(j+3,2,0xf0);
}
word='2';
dis_word(0x11,33,0xf9);
///////////////
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(cc[i]-0xa0)+cc[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='3';
dis_word(0x11,50,0xf9);
}
void Up()//上移
{
if(k==19)
k=0;
else
k++;
for(i=0;i<16;i++)
{
send_byte(0xf5);
}
if(k==0)
{
for(i=0,j=0;i<7;i=i+2,j++)
{
word=256*(www[i]-0xa0)+www[i+1]-0xa0;
dis_word(j+4,3,0xf0);
}
}
if(k==1)
{
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(aa[i]-0xa0)+aa[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='1';
dis_word(0x11,50,0xf9);
}
if(k==2)
{
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(bb[i]-0xa0)+bb[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='2';
dis_word(0x11,50,0xf9);
}
if(k==3)
{
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(cc[i]-0xa0)+cc[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='3';
dis_word(0x11,50,0xf9);
}
if(k==4)
{
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(dd[i]-0xa0)+dd[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='4';
dis_word(0x11,50,0xf9);
}
if(k==5)
{
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(ee[i]-0xa0)+ee[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='5';
dis_word(0x11,50,0xf9);
}
if(k==6)
{
for(i=0,j=0;i<11;i=i+2,j++)
{
word=256*(ff[i]-0xa0)+ff[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='6';
dis_word(0x13,50,0xf9);
}
/*if(k==7)
{
for(i=0,j=0;i<11;i=i+2,j++)
{
word=256*(gg[i]-0xa0)+gg[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='7';
dis_word(0x13,50,0xf9);
}*/
if(k==7)
{
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(hh[i]-0xa0)+hh[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='7';
dis_word(0x11,50,0xf9);
}
if(k==8)
{
for(i=0,j=0;i<13;i=i+2,j++)
{
word=256*(pp[i]-0xa0)+pp[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
}
if(k==9)
{
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(ii[i]-0xa0)+ii[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='8';
dis_word(0x11,50,0xf9);
}
if(k==10)
{
for(i=0,j=0;i<13;i=i+2,j++)
{
word=256*(pp[i]-0xa0)+pp[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
}
if(k==11)
{
for(i=0,j=0;i<9;i=i+2,j++)
{
word=256*(jj[i]-0xa0)+jj[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='9';
dis_word(0x11,50,0xf9);
//word='0';
//dis_word(0x12,50,0xf9);
}
if(k==17)
{
for(i=0,j=0;i<7;i=i+2,j++)
{
word=256*(nn[i]-0xa0)+nn[i+1]-0xa0;
dis_word(j+3,3,0xf0);
}
word='C';
dis_word(0x0f,50,0xf9);
word='a';
dis_word(0x10,50,0xf9);
word='n';
dis_word(0x11,50,0xf9);
word='c';
dis_word(0x12,50,0xf9);
word='e';
dis_word(0x13,50,0xf9);
}
if(k==18)
{
for(i=0,j=0;i<7;i=i+2,j++)
{
word=256*(oo[i]-0xa0)+oo[i+1]-0xa0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -