📄 zls_0001.c
字号:
#include <reg51.h>
#include<intrins.h>
bit free;
bit keydown;
sbit MAX =P1^0;
sbit MID =P0^1;
sbit MIN =P0^2;
sbit CS =P0^3;
sbit CLK =P0^4;
sbit DATA=P0^5;
sbit WARN=P0^6;
sbit ZERO=P0^7;//过零检测脚
/*键盘扫描端口*/
sbit D0 =P3^0;//行扫描线
sbit D1 =P3^1;
sbit D2 =P3^2;
sbit D3 =P3^3;
sbit D4 =P3^4;
sbit CS0=P3^5;//列扫描线
sbit CS1=P3^6;
sbit CS2=P3^7;
/*检测/控制端口*/
sbit REL_UPDW=P2^0;
sbit REL_C =P2^1;
sbit P_UPDW =P2^2;
sbit TRI_C =P2^3;
sbit WDI =P2^4;
sbit Q_DW =P2^5;
sbit Q_UP =P2^6;
sbit T_UPDW =P2^7;
sbit PD =P0^0;
sbit PC =P0^1;
sbit PB =P0^2;
sbit PA =P0^3;
sbit XXC =P0^4;
sbit SXC =P0^5;
sbit TT1 =P0^6;
sbit TT2 =P0^7;
unsigned char key;
unsigned char keynumber;
unsigned char x,y;
#define NOP() _nop_()
void process_knock(); //揉压敲击开关
void whith(); //宽度
void top(); //靠背起
void vertical_knock(); //捶击
void roll(); //滚压
void mode(); //模式
void fixed_position(); //定位
void bottom(); //靠背落
void strength(); //强度
void speed(); //速度
void power(); //总开关
void timer(); //定时
void fullautomatic(); //全自动
void rising(); //小腿起
void descent(); //小腿落
void(*pfunction)(); //------------函数指针
void(*code tab[])()={ process_knock, whith, top, vertical_knock, roll,
mode, fixed_position,bottom,strength, speed,
power,timer,fullautomatic, rising, descent
};//------函数数组
/*----------------------------WATCHDOG---------------------------------------*/
/* #pragma asm
CSEG AT 400h
LJMP main
#pragma endasm
-----------------------------------------------------------------------------*/
void watchdog()
{
WDI=0;
NOP();NOP();
WDI=1;
NOP();NOP();
WDI=0;
}
/*----------------------------delay()----------------------------------------*/
void delay(unsigned char m,unsigned char n)
{
unsigned char i,j;
watchdog();
for(i=0;i<m;i++)
{ for(j=0;j<n;j++);}
}
/*-------------------------Key Scan Procedure-------------------------------*/
char scan()
{ float o,q;
switch(keynumber)
{
case 0x21 :
return (key=0); //揉捏/敲打
break;
case 0x22 :
return(key=1); //宽度调节
break;
case 0x24 :
return(key=2); //上
break;
case 0x28 :
return(key=3); //捶击开关
break;
case 0x30 :
return(key=4); //滚压
break;
case 0x41 :
return(key=5); //模式
break;
case 0x42 :
return(key=6); //定位
break;
case 0x44 :
return(key=7); //下
break;
case 0x48 :
return(key=8); //强度
break;
case 0x50 :
return(key=9); //速度
break;
case 0x81 :
return(key=10); //总开关
break;
case 0x82 :
return(key=11); //定时
break;
case 0x84 :
return(key=12); //全自动
break;
case 0x88 :
return(key=13); //上升
break;
case 0x90:
return(key=14); //下降
break;
default:
return(key=16);
break;
}
}
/*----------------------------取函数--------------------------------*/
void takefunc()
{
pfunction=tab[key];
if(key!=16)
(*pfunction)();
return;
}
/*----------------------------串口中断接收初始化-------------------------------------*/
#define uchar unsigned char
#define SLAVE 0x00
#define BN 16
uchar idata tdata[16];
uchar idata rdata[16];
bit trdy;
bit rrdy;
void serial_init(void)
{
TMOD=0x20; //定时器T1为模式2
TL1=0xfd; //定时器初值
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xf0; //串行口方式3
ES=1;EA=1; //开串行口中断
trdy=1;rrdy=1; //准备好发送和接收
}
/*-----------------------------main---------------------------------*/
void main()
{
watchdog();
TMOD=0X01;
TH0=0XA5;
TL0=0X67;
TF0=0;
SP=0x55;
takefunc();
}
/*------------------------------------------------------------------*/
void rising()
{
REL_C=0;
delay(30,255);
REL_C=1;
delay(30,255);
if(keydown&&(key!=13))
takefunc();
//if(key==2|key==7)break;
}
/*-------------------------------------------------------------------*/
void descent()
{
TRI_C=0;
REL_C=0;
delay(65,255);
REL_C=1;
delay(65,255);
}
/*-----------------------------------------------------------------*/
void bottom()
{
Q_UP=1;
Q_DW=1;
REL_UPDW=0;
keyscan();
if(free&(!Q_DW))
{
T_UPDW=0;
return;
}
NOP();NOP();
REL_UPDW=1;
}
/*----------------------------------------------------------------*/
void top()
{
Q_UP=1;
Q_DW=1;
REL_UPDW=1;
keyscan();
if(free&(!Q_UP))
{
T_UPDW=0;
return;
}
NOP();
NOP();
REL_UPDW=0;
}
/*----------------------串口中断接收----------------------------------*/
void slave(void) interrupt 4 using 1
{
void str(void);
void sre(void);
uchar a;
RI=0; //关串行口中断
ES=0;
if(SBUF!=SLAVE){ES=1;goto reti;} //非本机地址,继续监听
SM2=0; //取笑监听状态
SBUF=SLAVE; //发回从机地址
while(TI!=1);TI=0;
while(RI!=1);RI=0;
if(RB8==1){SM2=1;ES=1;goto reti;} //确认地址不符,从机复位
a=SBUF; //接收命令
if(a==1){ //从机接收主机的数据
if(rrdy==1) SBUF=0x01; //接收准备好,发回0x01
else
SBUF=0x00;
while(TI!=1);TI=0;
while(RI!=1);RI=0;
if(RB8==1){SM2=1;ES=1;goto reti;}
sre(); //接收数据
}
else
{
if(a==0x02) //从机向主机发送数据
{
if(trdy==1) SBUF=0x02; //发送准备好
else
SBUF=0x00;
while(TI!=1);TI=0;
while(RI!=1);RI=0;
if(RB8==1){SM2=1;ES=1;goto reti;}
str( ); //发送数据
}
else
{
SBUF=0x80; //命令非法
while(TI!=1);TI=0;
SM2=1;ES=1; //恢复监听
}
}
reti:;
}
void str(void) //发送数据函数
{uchar p,i;
trdy=0;
do{p=0; //初始校验和为0
for(i=0;i<BN;i++)
{SBUF=tdata[i]; //发送数据
p+=tdata[i];
while(TI!=1);TI=0;
}
SBUF=p; //发送校验和
while(TI!=1);TI=0;
while(RI!=1);RI=0;
}while(SBUF!=0); //主机接收不正确,重新发送
SM2=1;ES=1;
}
void sre(void) //接收数据函数
{uchar p,i;
rrdy=0;
while(1)
{p=0; //初始化校验和为0
for(i=0;i<BN;i++)
{while(RI!=1);RI=0;
tdata[i]=SBUF; //接收数据
p+=rdata[i];
}
while(RI!=1);RI=0;
if(SBUF==p){SBUF=0x00;break;} //校验和相同,发00H
else{
SBUF=0xFF;while(TI!=1);TI=0; //校验和不同,发FFH,重新接收
}
}
SM2=1;ES=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -