📄 minsys.c
字号:
#include<at89x52.h>
#include<absacc.h>
#include<memory.h>
#include<lcm.h>
#define Retry 0x80
unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char code DataSeclete[]={ //在发送数据前先发此,用来选择模式的代号
0x81, //0 停止用的包头代号
0x82, //1 查询用的包头代号
0x83 //2 设置用的包头代号
};
unsigned char DataBase[]={ //向下设置的数值
0xff, //0 地址(密码)
0xff, //1 总开关(0x00为关,0xff为开)
0x00, //2 分钟
0x0a, //3 小时(最大99)
0x1d, //4 时间修正值(修正值是计数器溢出次数24-33,默认值是29,分10个档,设置时对应为0~9,设置值+24=修正值)
0xB2, //5 温度上限,默认是50度(最高位为正负号,1为正,0为负,后面7位为温度值,范围为-9~+99)
0x80, //6 温度下限,默认是0度(最高位为正负号,1为正,0为负,后面7位为温度值,范围为-9~+99)
0x03, //7 震动灵敏度(灵敏度是25毫秒内震动的次数2-20,设置时对应为0~9,设置值*2+2=灵敏度)
};
unsigned char DataReceive[]={ //向上读取的数值,把地址改为是否已经报警
0x00, //0 是否已经报警(1不报警,0报警)
0x00, //1 工作状态0x00为不工作,0xff为工作
0x00, //2 分钟
0x00, //3 小时(最大99)
};
sbit KeyA=P1^0;
sbit KeyB=P1^1;
sbit KeyC=P1^2;
sbit KeyD=P1^3;
sbit HzOut=P3^3;
unsigned char KEYA = 1,//按键A被按下为0,未按为零,,下同
KEYB = 1,
KEYC = 1,
KEYD = 1;
unsigned char LiuCheng1 = 1, //停止流程,1未开始,0开始,下同
LiuCheng1_1 = 1,//工作子流程-设置对应的地址 DispSetAddress(unsigned char HH,HL,sign)//输入被控板的地址,输入数值,位置
LiuCheng1_password[8], //流程1的地址暂存数组
LiuCheng1_1_Sign = 8, //焦点位置
//LiuCheng1_password[0]地址8位
//LiuCheng1_password[1]地址7位
//LiuCheng1_password[2]地址6位
//LiuCheng1_password[3]地址5位
//LiuCheng1_password[4]地址4位
//LiuCheng1_password[5]地址3位
//LiuCheng1_password[6]地址2位
//LiuCheng1_password[7]地址1位
LiuCheng2 = 1, //查询流程
LiuCheng3 = 1, //工作流程
LiuCheng3_1 = 1,//工作子流程-设时间
LiuCheng3_1_HH, //小时十位
LiuCheng3_1_HL, //小时个位
LiuCheng3_1_LH, //小时十位
LiuCheng3_1_LL, //小时个位
LiuCheng3_1_Sign = 4, //焦点位置
LiuCheng3_2 = 1,//工作子流程-时间修正值
LiuCheng3_2_Num, //修正值
LiuCheng3_3 = 1,//工作子流程-温度上限
LiuCheng3_3_HH, //温度十位
LiuCheng3_3_HL, //温度个位
LiuCheng3_3_Sign, //温度正负号
LiuCheng3_3_WeiZhi = 3,//焦点位置
LiuCheng3_4 = 1,//工作子流程-温度下限
LiuCheng3_4_HH, //温度十位
LiuCheng3_4_HL, //温度个位
LiuCheng3_4_Sign, //温度正负号
LiuCheng3_4_WeiZhi = 3,//焦点位置
LiuCheng3_5 = 1,//工作子流程-震动灵敏度
LiuCheng3_5_Num = 0, //灵敏度
LiuCheng3_6 = 1,//工作子流程-设置对应的地址 DispSetAddress(unsigned char HH,HL,sign)//输入被控板的地址,输入数值,位置
LiuCheng3_password[8],//流程3的地址暂存数组
//LiuCheng3_password[0]地址8位
//LiuCheng3_password[1]地址7位
//LiuCheng3_password[2]地址6位
//LiuCheng3_password[3]地址5位
//LiuCheng3_password[4]地址4位
//LiuCheng3_password[5]地址3位
//LiuCheng3_password[6]地址2位
//LiuCheng3_password[7]地址1位
LiuCheng3_6_Sign = 8; //焦点位置
unsigned char LiuCheng1Enable = 1,//停止流程使能
LiuCheng2Enable = 1,//查询流程使能
LiuCheng3Enable = 1;//工作流程使能
////////////////////////////////////////////////////////////////////////////////////////////////////////////菜单显示函数
void DispPasswordError(void)
{
/****************
Password Wrong.
Please Retry!
****************/
printx(0,0,"Password Wrong. ");
printx(0,1,"Please Retry! ");
}
void DispSetTime(unsigned char HH,HL,LH,LL,weizhi)//设置时间,输入小时十位,小时个位,分钟十位,分钟个位,焦点相对位置
{
/****************
(hour:min) 00:00
set time: ^
****************/
printx(0,0,"(hour:min) : ");
DispOneChar(11,0,table[HH]);
DispOneChar(12,0,table[HL]);
DispOneChar(14,0,table[LH]);
DispOneChar(15,0,table[LL]);
if(weizhi == 1)
{
printx(0,1,"set time: ^ ");
}
if(weizhi == 2)
{
printx(0,1,"set time: ^ ");
}
if(weizhi == 3)
{
printx(0,1,"set time: ^ ");
}
if(weizhi == 4)
{
printx(0,1,"set time: ^");
}
}
void DispSetRevise(unsigned char num)//设置时间修正值,输入数值
{
/****************
( 0 - 9 ) 0
Xiu Zheng : ^
****************/
printx(0,0,"( 0 - 9 ) ");
printx(0,1,"Xiu Zheng : ^ ");
DispOneChar(14,0,table[num]);
}
void DispTemUp(unsigned char HH,HL,sign,weizhi)//设置温度上限十位,上限个位,输入符号(0为负,1为正),数值,位置
{
/****************
(-9 - +99) x00
Tem up : ^
****************/
printx(0,0,"(-9 - +99) ");
if(sign == 0)
{
DispOneChar(12,0,'-');
}
else
{
DispOneChar(12,0,'+');
}
DispOneChar(13,0,table[HH]);
DispOneChar(14,0,table[HL]);
if(weizhi == 1)
{
printx(0,1,"Tem up : ^ ");
}
if(weizhi == 2)
{
printx(0,1,"Tem up : ^ ");
}
if(weizhi == 3)
{
printx(0,1,"Tem up : ^ ");
}
}
void DispTemDown(unsigned char HH,HL,sign,weizhi)//设置温度下限十位,上限个位,输入符号(0为负,1为正),数值,位置
{
/****************
(-9 - +99) x00
Tem down: ^
****************/
printx(0,0,"(-9 - +99) ");
if(sign == 0)
{
DispOneChar(12,0,'-');
}
else
{
DispOneChar(12,0,'+');
}
DispOneChar(13,0,table[HH]);
DispOneChar(14,0,table[HL]);
if(weizhi == 1)
{
printx(0,1,"Tem down: ^ ");
}
if(weizhi == 2)
{
printx(0,1,"Tem down: ^ ");
}
if(weizhi == 3)
{
printx(0,1,"Tem down: ^ ");
}
}
void DispShake(unsigned char num)//震动灵敏度,输入数值0 ~ 9
{
/****************
( 0 - 9 ) 0
Shake: ^
****************/
printx(0,0,"( 0 - 9 ) ");
printx(0,1,"Shake: ^ ");
DispOneChar(13,0,table[num]);
}
void DispConnect(void)//正在传输中
{
/****************
Now Connecting..
Please Wait.....
****************/
printx(0,0,"Now Connecting..");
printx(0,1,"Please Wait.....");
}
void DispOver(void)//传输完毕
{
/****************
Deliver is over.
Please Wait.....
****************/
printx(0,0,"Deliver is over.");
printx(0,1,"Please Wait.....");
}
void DispStoping(void)//停止中
{
/****************
Now Stoping.....
Please Wait.....
****************/
printx(0,0,"Now Stoping.....");
printx(0,1,"Please Wait.....");
}
void DispSearch(void)//查看功能板的状态
{
/****************
Now Searching...
Please Wait.....
****************/
printx(0,0,"Now Searching...");
printx(0,1,"Please Wait.....");
}
void DispFindNow(unsigned char HH,HL,LH,LL,num,sign)//功能板的状态显示,输入小时十位,小时个位,分钟十位,分钟个位,报警状态,工作状态(1工作,0不工作)
{
/****************
ALARM time:00:00
working? YES/NO
****************/
printx(0,0," time: : ");
DispOneChar(11,0,table[HH]);
DispOneChar(12,0,table[HL]);
DispOneChar(14,0,table[LH]);
DispOneChar(15,0,table[LL]);
if(num == 0)//1不报警,0报警
{
DispOneChar(0,0,'A');
DispOneChar(1,0,'L');
DispOneChar(2,0,'A');
DispOneChar(3,0,'R');
DispOneChar(4,0,'M');
}
else
{
DispOneChar(0,0,'S');
DispOneChar(1,0,'A');
DispOneChar(2,0,'F');
DispOneChar(3,0,'T');
DispOneChar(4,0,'Y');
}
if(sign == 0xff)
{
printx(0,1,"working? YES ");
}
else
{
printx(0,1,"working? NO ");
}
}
void DispWelcome(void)//显示开机画面
{
/****************
System Work Now!
Designed By LYQ!
****************/
printx(0,0,"System Work Now!");
printx(0,1,"Designed By LYQ!");
}
void DispSetAddress(unsigned char *arrays,unsigned char sign)//输入被控板的地址,输入位置
{
/****************
Pass 00000000
word: ^
****************/
printx(0,0,"Pass ");
DispOneChar(8,0,table[arrays[0]]);
DispOneChar(9,0,table[arrays[1]]);
DispOneChar(10,0,table[arrays[2]]);
DispOneChar(11,0,table[arrays[3]]);
DispOneChar(12,0,table[arrays[4]]);
DispOneChar(13,0,table[arrays[5]]);
DispOneChar(14,0,table[arrays[6]]);
DispOneChar(15,0,table[arrays[7]]);
switch(sign)
{
case 1:
printx(0,1,"word: ^ ");
break;
case 2:
printx(0,1,"word: ^ ");
break;
case 3:
printx(0,1,"word: ^ ");
break;
case 4:
printx(0,1,"word: ^ ");
break;
case 5:
printx(0,1,"word: ^ ");
break;
case 6:
printx(0,1,"word: ^ ");
break;
case 7:
printx(0,1,"word: ^ ");
break;
case 8:
printx(0,1,"word: ^");
break;
default:
break;
}
}
unsigned char GetBaiwei(unsigned char temp)//从整数中取百位数
{
temp = temp/100;
return temp;
}
unsigned char GetShiwei(unsigned char temp)//从整数中取十位数
{
if(temp > 99)
{
temp = temp - GetBaiwei(temp)*100;
}
temp = temp/10;
return temp;
}
unsigned char GetGewei(unsigned char temp)//从整数中取个位数
{
temp = temp%10;
return temp;
}
void DispPassWord(unsigned char x1,x2,x3,y,num)//输入显示的x1,x2,x3,y,数值(5.6.7.1.DataBase[0])
{
DispOneChar(x1,y,table[GetBaiwei(num)]);
DispOneChar(x2,y,table[GetShiwei(num)]);
DispOneChar(x3,y,table[GetGewei(num)]);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////其他功能函数
void putchar(unsigned char a)//从串口发送一个字节
{
TI=0;
SBUF=a;
while(!TI);
TI=0;
}
unsigned char getchar(void)//从串口接收一个字节
{
unsigned char a;
RI = 0;
while(RI == 0);
a = SBUF;
RI = 0;
return a;
}
void PutAll(unsigned char * arrays)//从串口发送一个8数据数组
{
unsigned char i;
for(i=0;i<8;i++)//发8数据数组
{
putchar(arrays[i]);
}
}
void GetAll(unsigned char * arrays)//从串口接收一个4数据数组,参数是待接收的数组名,DataReceive[]或DataSbuffer[]
{
unsigned char i;
for(i=0;i<4;i++)//收4数据数组
{
arrays[i] = getchar();
}
}
void CalculatePassword(unsigned char * arrays,unsigned char ADDR)//把数组计算成设置
{
unsigned char temp,i;
temp = ADDR;
for(i=0;i<8;i++)
{
temp = ADDR<<i;
arrays[i] = temp>>7;
}
}
void ReCalculatePassword(unsigned char * arrays)//把设置还原成数组
{
DataBase[0] = arrays[0]*128+arrays[1]*64+arrays[2]*32+arrays[3]*16+arrays[4]*8+arrays[5]*4+arrays[6]*2+arrays[7];
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////中断函数
void Key(void) interrupt 0
{
unsigned char temp;
EA = 0;
Delay5Ms();
Delay5Ms();
/*读取按键*/
if(KeyA == 0)
{
KEYA = 0;
}
if(KeyB == 0)
{
KEYB = 0;
}
if(KeyC == 0)
{
KEYC = 0;
}
if(KeyD == 0)
{
KEYD = 0;
}
/*菜单判断*/
//停止流程
if((LiuCheng1 == 1)&&(LiuCheng1Enable == 1))
{
if(KEYA == 0)//按了“停止/返回”键
{
LiuCheng1 = 0;
LiuCheng1_1 = 0;
LiuCheng2Enable = 0;
LiuCheng3Enable = 0;
//读取下一个
CalculatePassword(LiuCheng1_password,DataBase[0]);
//显示
DispSetAddress(LiuCheng1_password,LiuCheng1_1_Sign);
DispPassWord(5,6,7,1,DataBase[0]);//输入显示的x1,x2,x3,y,数值(5.6.7.1.DataBase[0])
Delay400Ms();Delay400Ms();
}
}
else
{
if(LiuCheng1_1 == 0)
{
LiuCheng2Enable = 0;
LiuCheng3Enable = 0;
if(KEYC == 0)//按了“上翻/查询”键
{
//上翻
LiuCheng1_password[LiuCheng1_1_Sign -1] ++;
if(LiuCheng1_password[LiuCheng1_1_Sign-1] > 1)
{
LiuCheng1_password[LiuCheng1_1_Sign-1] -= 2;
}
//保存
ReCalculatePassword(LiuCheng1_password);//把结果统计进数组
DispSetAddress(LiuCheng1_password,LiuCheng1_1_Sign);
DispPassWord(5,6,7,1,DataBase[0]);//输入显示的x1,x2,x3,y,数值(5.6.7.1.DataBase[0])
Delay400Ms();
}
if(KEYB == 0)//按了“左翻”键
{
//左翻
LiuCheng1_1_Sign --;
if(LiuCheng1_1_Sign == 0)
{
LiuCheng1_1_Sign = 8;
}
//保存
ReCalculatePassword(LiuCheng1_password);//把结果统计进数组
DispSetAddress(LiuCheng1_password,LiuCheng1_1_Sign);
DispPassWord(5,6,7,1,DataBase[0]);//输入显示的x1,x2,x3,y,数值(5.6.7.1.DataBase[0])
Delay400Ms();
}
if(KEYA == 0)//按了“停止/返回”键
{
DispStoping(); //做下一个的显示
putchar(0xaa);//发开始码
putchar(DataSeclete[0]);//发功能号
putchar(DataBase[0]);//发密码
temp = getchar();//接收密码回馈
if(temp == Retry)//判断密码
{
DispPasswordError();
Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();
Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();
Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -