📄 点滴测量从机.c
字号:
#include <AT89X51.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]={"0123456789"};
uchar code table2[]={"NO."};
uchar code table3[]={"SPEED:"};
uchar code table4[]={"TOO LOW!!!!"};
uchar code table5[]={"BROKEN!!!!"};
uchar code table6[]={"SET"};
uchar code table7[]={"NOR"};
uchar code table8[]={"INPUT DATA"};
uchar code table9[]={"ERROR!!!!"};
uchar code table10[]={"WELCOME TO USE"};
uchar code table11[]={"THE EXTENSION"};
uchar no[3];
uchar speed[4];
sbit RS=P3^7;
sbit WR1=P3^6;
sbit E=P3^5;
sbit RDat=P3^4;
sbit TD=P3^3;
sbit PLAY=P1^1;
uchar count=0,i=0,j=0;
uchar p;
bit l=1;
bit q;
/****************************延时子函数********************************/
void mDelay(uchar j)
{
uint i;
for(;j>0;j--)
{
for(i=125;i>0;i--)
{;}
}
}
void delay1() //键盘去抖动延时
{uchar i;
for(i=200;i>0;i--)
{}
}
void delay(uchar n)
{uchar f,m;
for(m=n;m>0;m--)
//for(n=15;n>0;n++)
for(f=248;f>0;f--)
{} }
/****************************液晶显示子函数********************************/
/*虚拟同步串行通信*/
void corr(uchar dat) //164使用共阴代码
{uchar ADS,n;
ADS=dat;
for(n=8;n>0;n--)
{
TD=0;
RDat=ADS&0x80;
TD=1;
ADS=ADS<<1;
}
}
void lcd_com(unsigned char a)
{ E=1;
RS=0;
WR1=0;
corr(a);
/*f_buzy(); */
delay(1);
E=0;
}
/*数据发送*/
void lcd_dat(unsigned char b)
{ E=1;
RS=1;
WR1=0;
corr(b);
/*f_buzy(); */
delay(1);
E=0;
}
/*液晶数据缓冲*/
lcd_dis(uchar k[],char r)
{char n;
lcd_com(r);
//delay(1);
for(n=0;k[n]!=0x00;n++)
{lcd_dat(k[n]);
}
}
/****************************PID算法子函数********************************/
/****************************声光报警子函数***********************************/
speak(uchar a)
{
P3=a;
PLAY=0;
delay(65);
PLAY=1;
P3=0xff;
}
/***************************** 数据通讯子函数******************************/
worknet(uchar t)
{
SBUF=t;
while(!TI);
TI=0;
}
void receive()interrupt 4 using 0 //接收程序
{
if(RI)
{
RI=0;
p=SBUF;
no[0]=p;//table1[p];
//q=1;
}
}
/****************************键盘处理子函数*******************************/
select(uchar a) //键值选择
{l=0;
if(count==1) //设置
{if(j<=2)
{ speed[j]=table1[a];
j++;
speed[j]=0x00;
lcd_dis(speed,0x8c);
}}}
enter() //回车键
{uchar n;
l=0;
if(count==1)
{if(no[1]==0x00)
{n=(no[0]&0x0f);
worknet(n);}
else
{n=(no[0]&0x0f)*10+(no[1]&0x0f);
worknet(n);}
}
}
normal() //正常模式
{//delay(2);
while((P1&0xf0)!=0xf0);
count=0;
l=0;
lcd_com(0x01); //清屏
delay(2);
lcd_dis(table2,0x80);
lcd_dis(table3,0x86);
lcd_dis(table7,0xcd);
while(1)
{lcd_dis(no,0x83);
// P1=0xf0;
if((P1&0xf0)!=0xf0) break;
}}
set() //设置模式
{j=0;i=0;
count=1;
l=0;
lcd_com(0x01); //清屏
delay(2);
lcd_dis(table2,0x80);
lcd_dis(table3,0x86);
lcd_dis(no,0x83);
lcd_dis(table8,0xc0);
lcd_dis(table6,0xcd);
}
uchar key(void) //键盘扫描
{uchar sccode,recode;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{delay1();
if((P1&0xf0)!=0xf0)
{delay(100);
if((P1&0xf0)==0xf0)l=1;
sccode=0xfe;
while((sccode&0x10)!=0)
{P1=sccode;
if((P1&0xf0)!=0xf0)
{recode=(P1&0xf0)|0x0f;
P1=0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
P1=0xf0;
return(0);
}
sweep()
{uchar i;
i=key();
if(l==1)
{
switch(i)
{
case 0x11:select(1);break; //表值对应
case 0x21:select(2);break;
case 0x41:select(3);break;
//case 0x81:check(); break;
case 0x12:select(4);break;
case 0x22:select(5);break;
case 0x42:select(6);break;
case 0x82:normal(); break;
case 0x14:select(7);break;
case 0x24:select(8);break;
case 0x44:select(9);break;
case 0x84:set(); break;
case 0x18:enter(); break;
case 0x28:select(0);break;
//case 0x48:warn(); break;
//case 0x88:broken(); break;
}
}}
/****************************单片机初此化子函数*******************************/
init()
{uchar u;
TMOD=0x20;//串行口设置 //波特率2400
TL1=0xf3;
TH1=0xf3;
PCON=0x00;
SCON=0xd0;
TR1=1;
EA=1;ES=1;PS=1;
delay(20);
lcd_com(0x0f); //显示开关控制,开显示,开光标,闪烁?
lcd_com(0x38); //8位数据总线,两行显示,5X7点阵
lcd_com(0x01); //清屏
delay(2);
lcd_com(0x06); //AC自动加1,显示不动
u=P0&0x0f;
no[0]=table1[(u/10)];
no[1]=table1[(u%10)];
no[2]=0x00;
lcd_dis(table10,0x80);
lcd_dis(table11,0xc3);
}
/****************************主函数******************************/
main()
{init();
while(1)
{sweep();}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -