📄 board.c
字号:
#include<reg51.h>
#include<absacc.h>
#include<math.h>
//============================================
//程序作者:胡庆波
//程序版本号:LB80G-PAN Ver 1.0
//创作时间:2008.08
//单位:宁波欣达集团有限公司
//============================================
//EEPROM/IAP寄存器申明
//============================================
sfr ISP_DATA=0xE2;//数据专用寄存器
sfr ISP_ADDRH=0xE3;//地址专用高位寄存器
sfr ISP_ADDRL=0xE4;//地址专用低位寄存器
sfr ISP_CMD=0xE5;//寄存器命令专用寄存器
sfr ISP_TRIG=0xE6;//开始触发专用寄存器
sfr ISP_CONTR=0xE7;//等待专用寄存器
//============================================
//eeprom编程定义值
//============================================
#define ISP_IAP_BYTE_READ 0x1//表示是字节读操作
#define ISP_IAP_BYTE_PROGRAM 0x2//表示是字节编程操作
#define ISP_IAP_SECTOR_ERASE 0x3//表示是扇区擦除操作
#define ENABLE_ISP 0x83//使能EEPROM,以及设置等待时间操作
//============================================
//单片机应用程序,电路图设计功能申明
//============================================
sfr AUXR=0x8e;//单片机内部专用寄存器,用于调节12拍还是单拍控制
sbit DI = P1^5;//控制595芯片的数据线,数据进行口
sbit CLK= P1^7;//595芯片、166芯片复用时钟线
sbit RCK= P2^0;//595芯片的锁存输出使能线,高电平将锁存器内的值输出
sbit QH= P2^2;//166芯片按键读取数据线
sbit SL= P2^1;//166芯片锁存和移位控制线,高电平移位,低电平锁存
//===================================
//数码管显示相关的自定义寄存器
//===================================
char led_show_value[4];//数码管最终的显示字符
char led_show_byte_number=0;//数码管当前显示位码
char led_show_number=0;//数码管显示当前位的硬件序号(9012的使能端)
//===================================
//485通讯中发送相关自定义寄存器
//===================================
int send_show_count=0;//显示参数发送计时器
int send_hand_count=0;//通讯握手时间间隔
int send_heart_count=0;//通讯心跳时间间隔
int send_fault_count=0;//通讯故障请求时间间隔
int send_heart_last_count=0;//心跳故障时间间隔
char send_kind=0;//发送数据类型标志,根据发送优先级高低进行发送处理
char send_on_kind=0;//一类数据正在发送类标志
bit send_on_flag=0;//正在发送标志位,每个8位发送标志,在发送程序中设置,在发送完中断中清除
char send_over_kind=0;//当前已经发送完的一类数据类型,该值在发送程序中设置,在接收程序中清除
bit send_over_flag=0;//一类数据发送完标志,用于开启20ms计时
char send_inter_count=0;//一类数据发送完计时器,20ms计时器
bit send_success_flag=0;//通讯正常标志位
char send_point=0;//一类数据发送指针
char send_or_number=0;//异或校验寄存器
bit send_ask_set_flag=0;//发送设置参数请求命令
bit send_ask_fault_flag=0;//发送故障堆栈请求命令
//=====================================
//485通讯中接收相关自定义寄存器
//=====================================
unsigned char rx_buffer[5]=0;//接收缓冲器
char rx_point=0;//接收指针
//======================================
//8个按键采样相关自定义寄存器
//======================================
int key_sample_count_l=0;//按键采样计时器低位,用于200ms间隔按键的采样
char key_sample_count_h=0;//按键采样计时器二(用做功能键的采样,长按1s以上才有效)
char key_sample_code=0;//按键采样值
//========================================
//EEPROM相关寄存器
//========================================
char eeprom_addh=0x28;//eeprom地址高位
char eeprom_addl=0x0;//eeprom地址低位
char eeprom_data=0;//eeprom数据高位
//========================================
//参数读取和写入功能相关寄存器
//========================================
char function_key_kind=0;
//========================================
//指示灯显示相关自定义寄存器
//========================================
bit light_power_flag=0;//灯-上电指示
bit light_set_flag=0;//灯-参数设置指示
bit light_fault_flag=0;//灯-故障显示指示
bit light_work_flag=0;//灯-反馈工作指示
bit light_copy_paste_flag=0;//灯-参数复制粘帖指示
bit light_fault_flash_flag=0;//故障灯闪烁标志位
int light_fault_flash_count=0;//故障灯闪烁计数器
bit light_work_flash_flag=0;//运行灯闪烁标志位
int light_work_flash_count=0;//运行灯闪烁计数器
bit light_work_flash=0;//运行灯需要闪烁标志位
//=================================
//通讯协议相关自定义常量,发送类型有8种,具有优先级
//=================================
#define SEND_HAND 0x1//握手协议
#define SEND_SET 0x4//参数设置
#define SEND_SHOW 0x40//数值显示
#define SEND_HEART 0x80//心跳数据
#define SEND_FAULT 0x10//故障命令
#define SEND_KEY 0x2//复位按钮命令
#define SEND_FU 0x8//请求参数设置命令
#define SEND_FAULT_STACK 0x20//故障堆栈显示命令
//=================================
//通讯协议自定义内容
//=================================
#define HAND_CMD 0x10//收到握手命令
#define SET_CMD 0x20//收到参数设置命令
#define SET_FU_CMD 0x21//收到参数请求命令
#define SHOW_CMD 0x30//收到参数显示命令
#define HEART_CMD 0x40//收到心跳数据命令
#define FAULT_CMD 0x50//收到故障命令
#define FAULT_STACK_CMD 0x51//收到故障堆栈命令
#define RESET_KEY_CMD 0x60//收到复位按键命令
//================================
//通讯协议中自定义的时间
//================================
#define SEND_SHOW_TIME 200 //200ms
#define SEND_HAND_TIME 500 //500ms
#define SEND_HEART_TIME 500 //500ms
#define SEND_FAULT_TIME 100 //100ms
#define SEND_COMM_ERROR 20 //20ms
#define SEND_HEART_LAST_TIME 2000 //2s
//=================================
//按键采样,由硬件电路决定
//=================================
#define MODE_KEY 0x80//模式按键
#define ENTER_KEY 0x40//确定按键
#define ADD_KEY 0x20//加一按键
#define SHIFT_ADD_KEY 0x10//左移按键
#define COPY_KEY 0x28//参数复制键,加键和功能键组合而成
#define PASTE_KEY 0x0c//参数粘帖键,减键和功能键组合而成
#define SUB_KEY 0x04//减一按键
#define SHIFT_SUB_KEY 0x02//后移按键
#define RESET_KEY 0x01//系统重启按键
//=================================
//人机界面程序相关自定义寄存器
//=================================
int code *p;//查表指针
int show_num=0;//显示刷新计时器
char confirm=0;//模式选择寄存器
char point_flag=0;//小数点显示寄存器
char led_pos=0;//数码管位置
char led01=0;//数码管字符
char led02=0;
char led03=0;
char led04=0;
char ledcode01=0;//数码管显示字符
char ledcode02=0;
char ledcode03=0;
char ledcode04=0;
char ledcode01flash=0;//数码管闪烁字符
char ledcode02flash=0;
char ledcode03flash=0;
char ledcode04flash=0;
char led_data=0;//参数设置或显示序号
int buffer=0;//缓冲寄存器
bit neg_flag=0;//负值标志位
bit flash_code=0;//是否闪烁标志位
bit set_rev_flag=0;//上位机设置的数据已经接收到并显示标志位,为了防止enter键按的太快而造成的误设置参数
char high_led_number=4;//显示最高位处于那个LED位上
//=========================================
//接收上位机数据自定义寄存器
//=========================================
int show_data;//显示数据寄存器
int set_data;//设置数据寄存器
int fault_data=0;//主机故障显示寄存器
int error_data=0;//用于接收故障堆栈数据
char sys_state=0;//从机获得主机的状态
//=========================================
//故障闪烁程序自定义寄存器
//=========================================
int fault_temp=0x1;//故障检测中用
char time_i=1;//故障检测中用(当前检查到故障16位的那个位)
char fault_number=0;//故障类别(需要显示的故障内容)
bit fault_flash_flag=0;//故障闪烁标志位
bit fault_first_flag=0;//通讯正常后,在没有模式键按下的时循环闪烁故障内容,有模式键按下后不现实故障代码
bit start_only_once_flag=0;//保证开机现实故障后,通讯正常界面只进入一次
char fault_enter_flag=0;//为了让多个故障循环闪烁而设置的标志位
//=========================================
const int code led_table[29]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd,0x13,0xc5,0x31,0x85,0xff,
// 0 1 2 3 4 5 6 7 8 9 - n o P d none
0xfe,0x63,0x61,0x70,0x91,0xe3,0x03,0x31,0x11,0x49,0x83,0xf4,0x71};//数据管显示字符库
// . C E F. H L O P R S U r. F
//=============================================================================================================
//程序说明:该程序完成一个8位数码管的显示功能
//=============================================================================================================
void led_show_byte()
{
char led_show_data;
bit led_show_bit;
char j;
led_show_data=led_show_value[led_show_byte_number];//读取需要显示的代码
for(j=0;j<8;j++)
{
if(led_show_data&0x1==1)//按位值设置输出电平值
led_show_bit=1;
else
led_show_bit=0;
CLK=0;
DI=led_show_bit;
CLK=1;//人工模拟时钟,在上升沿锁存
led_show_data=led_show_data>>1;//将显示代码进行移位处理,以便8个位都进行输出
}
RCK=0;
RCK=1;//人工模拟锁存输出信号,在上升沿将锁存器的值输出
led_show_data=P2|0xf8;//将5根共阳控制线状态重新读取回来
led_show_data=led_show_data&led_show_number;//将要点亮的那位数码管的共阳极选通(即通电)
P2=led_show_data;//输出5根共阳控制线,给需要点亮的那位数码管进行通电
}
//=================================================================
//程序说明:通讯发送子程序,其中需要保证每次发送时没有数据正在发送;
//并且发送按照优先级高低进行;一类数据发送不能中断;下一类数据的发送
//必须在前一类数据已收到应答或20ms没有收到应答后自动重发
//=================================================================
void send() //发送子程序
{
char temp_kind=0;
char send_temp=0;
if(send_on_flag==0)//一个8位还未发送完成,不进行下一个8位的发送
{
if(send_success_flag==0)//还未连接上,需要先发送握手协议
{
if(send_kind==SEND_HAND)
{
send_kind=send_kind&0xfe;//握手协议会定时发送,因此可以在这里清除发送标志
send_on_flag=1;
SBUF=HAND_CMD;
send_over_kind=0;
}
}
else //已经连接上,根据优先集高低发送应用类数据
{
if(send_over_kind==0)//发送前,需要验证上次一类数据是否主机已经接收到
{
if(send_on_kind==0)//判断一类数据是否发完,非0表示还未发完
{
if((send_kind&0x2)==0x2)
{
temp_kind=SEND_KEY;
}
else
{
if((send_kind&0x4)==0x4)
{
temp_kind=SEND_SET;
}
else
{
if((send_kind&0x8)==0x8)
{
temp_kind=SEND_FU;
}
else
{
if((send_kind&0x10)==0x10)
{
temp_kind=SEND_FAULT;
}
else
{
if((send_kind&0x20)==0x20)
{
temp_kind=SEND_FAULT_STACK;
}
else
{
if((send_kind&0x40)==0x40)
{
temp_kind=SEND_SHOW;
}
else
{
if((send_kind&0x80)==0x80)
{
temp_kind=SEND_HEART;
}
}//else
}//else
} //else
}//else
}//else
}//else
}//if
else//有类数据在连续发送时,需要先发送该类数据
{
switch(send_on_kind)
{
case SET_CMD:
{
temp_kind=SEND_SET;
break;
}
case SHOW_CMD:
{
temp_kind=SEND_SHOW;
break;
}
case SET_FU_CMD:
{
temp_kind=SEND_FU;
break;
}
case FAULT_STACK_CMD:
{
temp_kind=SEND_FAULT_STACK;
break;
}
default:break;
}
}
switch(temp_kind)//根据上面的优先集排序,进行相关类数据的发送,每次发送时保证同类数据发送完成
{
case SEND_SET:
{
send_on_flag=1; //正在发送标志位
switch(send_point)
{
case 0:
{
SBUF=SET_CMD;
send_point++;
send_on_kind=SET_CMD;
break;
}
case 1:
{
SBUF=led_data;
send_point++;
send_on_kind=SET_CMD;
break;
}
case 2:
{
SBUF=set_data>>8;
send_point++;
send_on_kind=SET_CMD;
break;
}
case 3:
{
SBUF=set_data&0xff;
send_point++;
send_on_kind=SET_CMD;
break;
}
case 4:
{
send_temp=set_data>>8;
send_or_number=SET_CMD^led_data^send_temp;
send_temp=set_data&0xff;
send_or_number=send_or_number^send_temp;
SBUF=send_or_number;
send_point=0;
send_over_kind=SET_CMD;//提示该类数据已经发送完,需要等待接收,或延时10s还未收到时,继续发送
send_over_flag=1;//一类数据已经发送完成标志位
send_on_kind=0;
break;
}
default:break;
}
break;
}
case SEND_SHOW:
{
send_on_flag=1;//正在发送标志位
switch(send_point)
{
case 0:
{
SBUF=SHOW_CMD;
send_point++;
send_on_kind=SHOW_CMD;
break;
}
case 1:
{
SBUF=led_data;
send_point++;
send_or_number=SHOW_CMD^led_data;
send_on_kind=SHOW_CMD;
break;
}
case 2:
{
SBUF=send_or_number;
send_point=0;
send_over_kind=SHOW_CMD;//同上
send_over_flag=1;//同上
send_on_kind=0;
break;
}
default:break;
}
break;
}
case SEND_FU:
{
send_on_flag=1;
switch(send_point)
{
case 0:
{
SBUF=SET_FU_CMD;
send_point++;
send_on_kind=SET_FU_CMD;
break;
}
case 1:
{
SBUF=led_data;
send_point++;
send_or_number=SET_FU_CMD^led_data;
send_on_kind=SET_FU_CMD;
break;
}
case 2:
{
SBUF=send_or_number;
send_point=0;
send_over_kind=SET_FU_CMD;// 同上
send_over_flag=1;//同上
send_on_kind=0;
break;
}
default:break;
}
break;
}
case SEND_FAULT_STACK:
{
send_on_flag=1;
switch(send_point)
{
case 0:
{
SBUF=FAULT_STACK_CMD;
send_point++;
send_on_kind=FAULT_STACK_CMD;
break;
}
case 1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -