⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 board.c

📁 单片机控制面板程序
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -