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

📄 key10_10.c

📁 自已编写的一个用于调试单片机串口的一个下位机程序。很实用的。
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

#define SLAVEKEY_Addr  0x01

#define WaitTI      while(TI==0);TI=0
#define WaitRI      while(RI==0);RI=0

#define EndInputKey    0xa4
#define EnterKey       0x21
#define ShiftKey       0x04
#define PYStatusKey    0x05		/*拼音*/

#define dotkey        0x19 
#define NoKeyPress    0x0   /* 没有键按下 */
#define KeyNoUp       0xff  /* 键没有松开 */
#define NUMB          0x28

#define Tab1          1
#define Tab2          2
#define Tab3          3
#define Tab4          4

#define Yes           1
#define No            0

#define Off           0
#define On            1

#define Down          0 
#define Up            1

#define Start         0
#define End           1

#define Low           0
#define High          1
/**************************************
 -------------芯片管脚定义--------------
 ***************************************/
sbit   PowerLed=P1^4;
sbit   SHIFTLED=P1^5;
sbit   Beep=P1^7;
sbit   TestLED=P1^6;
/**********************************************
  -------------与主机通信命令名柄定义----------
  **********************************************/
#define GetKey          0x90  /*  有键直接返回键值ASCIID码或功能码 无键返回0X00,有键但没松开返回0XFF   */
#define OpenBeep        0X91  /*  打开蜂鸣器,嘟... 嘟....,无返回值  */
#define RestWDOG        0x93  /*  复位看门狗    无返回值     */
//#define TestKey         0x94  /*  检测主板与键盘板IC的通信,回送主板Finish命令句柄  */

/**********************************************
 ---------define communication answer----------
 **********************************************/
#define   OK            0x00
#define   Error         0xff
#define   Finish        0x70
/***********************************************
 ------------------通信变量---------------------
 ***********************************************/
uchar  data   handle,Slen,uc0,key,RetKey; 
uint   data   counter;
uint   CounterNub1=0,CounterNub2=0;
uint   SbufKey;

bit    idata  tf0=0;
bit    bdata  fini;
bit    bdata  KeyStatus;
bit    bdata  ShiftStatus;   /*  上下档键切换:=0上,=1下档键. */
bit    bdata  PYStatusLED;
bit    bdata  PYStatus1;
bit    bdata  DotKeyStatus;
bit	   bdata  KeyInt;		/*判断有无键按下,以便产生中断信号*/
/***********************************************
 -----------通信联合体结构---------------
 ***********************************************/

typedef union {
        uchar           ComBuf[10];
        uint            tempint;
        ulong           templong;
} un1;
data   un1    Un;
/***********************************************
 ------------------   键盘上档编码  ------------
 ***********************************************/
uchar  code  KeyCodeNewTabUp[40]={

   0xa6,0x39,0x38,0x37,0xae,0xaf,0xa0,0xd1,
   0xad,0x36,0x35,0x34,0xb7,0xa7,0xb4,0xd2,
   0xa4,0x33,0x32,0x31,0xbc,0xa5,0xb8,0xd3,
   0xa4,0x2e,0xa2,0x30,0xbe,0xba,0xb6,0xd4,
   0xa4,0xa1,0xc9,0xbb,0xca,0xcb,0xcc,0xd5
};

/***********************************************
 --------------------   键盘下档编码  ----------
 ***********************************************/
uchar  code  KeyCodeNewTabDown[40]={

  0xa6,0x39,0x38,0x37,0xae,0xaf,0xa0,0xd1,
  0xad,0x36,0x35,0x34,0xbd,0xa7,0xb3,0xd2,
  0xa4,0x33,0x32,0x31,0xbc,0xa5,0xb2,0xd3,
  0xa4,0x2e,0xa2,0x30,0xbe,0xab,0xb9,0xd4,
  0xa4,0xa1,0xc9,0xbb,0xa9,0xac,0xaa,0xd5
};

uchar  code  KeyCodeNewTabOne[40]={

  0xa6,0x47,0x44,0x41,0xae,0xaf,0xa0,0xd1,
  0xad,0x50,0x4d,0x4a,0xb7,0xa7,0xb4,0xd2,
  0xa4,0x58,0x56,0x53,0xbc,0xa5,0xb8,0xd3,
  0xa4,0x28,0x2c,0x26,0xbe,0xba,0xb6,0xd4,
  0xa4,0xa1,0xc9,0xbb,0xca,0xcb,0xcc,0xd5
};

uchar  code  KeyCodeNewTabTwo[40]={

   0xa6,0x48,0x45,0x42,0xae,0xaf,0xa0,0xd1,
   0xad,0x51,0x4e,0x4b,0xb7,0xa7,0xb4,0xd2,
   0xa4,0x59,0x57,0x54,0xbc,0xa5,0xb8,0xd3,
   0xa4,0x29,0x2e,0x24,0xbe,0xba,0xb6,0xd4,
   0xa4,0xa1,0xc9,0xbb,0xca,0xcb,0xcc,0xd5

};

uchar  code  KeyCodeNewTabThree[40]={

   0xa6,0x49,0x46,0x43,0xae,0xaf,0xa0,0xd1,
   0xad,0x52,0x4f,0x4c,0xb7,0xa7,0xb4,0xd2,
   0xa4,0x5a,0x00,0x55,0xbc,0xa5,0xb8,0xd3,
   0xa4,0x00,0x00,0x00,0xbe,0xba,0xb6,0xd4,
   0xa4,0xa1,0xc9,0xbb,0xca,0xcb,0xcc,0xd5

};

uchar  code  KeyCodeNewTabFour[40]={

   0xa6,0x39,0x38,0x37,0xae,0xaf,0xa0,0xd1,
   0xad,0x36,0x35,0x34,0xb7,0xa7,0xb4,0xd2,
   0xa4,0x33,0x32,0x31,0xbc,0xa5,0xb8,0xd3,
   0xa4,0x2e,0xa2,0x30,0xbe,0xba,0xb6,0xd4,
   0xa4,0xa1,0xc9,0xbb,0xca,0xcb,0xcc,0xd5
};


void   RcvDataBy232(void);
void   TranDataBy232(void);
void   RecvToBuf(void);
void   SendBuf(uchar order,uchar len);
void   OpeningBeep(uchar OBN);
uchar  Key_Press(void);
void   InitSBUF(void);
void   DELAY(uint z);
void   RestWatchdog(void);
uchar  ScanKey(void);
uchar  StartPYKey(void);
void   CheckPYTab(void);
void   delayms(uchar t1,uchar t2);
void   CheckLED(void);
/*****************************
 ----- 定时器1中断服务程序 ---
 *****************************/
void TimeCount1(void) interrupt 3 using 0
{
  _nop_();
}                      

/*****************************
 ---- 定时器0中断服务程序 ----
 *****************************/
void TimeCount0(void)  interrupt 1 using 0
{
   _nop_();
	
}

/*****************************
 ----- 外部中断0  -----
/****************************/
void External0(void) interrupt 0 using 2
{
	TestLED=0;
	delayms(90,90);
	TestLED=1;
	_nop_();
	KeyInt=Low;
}

/*****************************
 ------  外部中断1  -------
 *****************************/

void External1(void) interrupt 2 using 3
{
   _nop_();
}

/*****************************************************
 -------从串行端口接收一字节数据,并存入UC0变量中------
 *****************************************************/

void   RcvDataBy232(void)
{
    counter=0;
    do{
        counter++;
        RestWatchdog();
        if(counter>0x6ff)
        { uc0=Error;goto rete1;}   /* 1fff */
          RestWatchdog();
      }   while(RI==0);
    uc0=SBUF;
rete1:  RI=0;
}

/*****************************************************
 -------从串行端口发送一字节数据,数据已存入SBUF中------
 *****************************************************/
void TranDataBy232(void)
{
   while(TI==0) RestWatchdog();
   TI=0;
}
/*********************************************************************
 ------------        主从多机串行中断服务程序     ------------------
 -- 主机先发送地址帧,从机接收到地址帧后,先判断是否为键盘地址:是则接收 
 -- 主机发送过来的所有数据信息,否则返回.
 *********************************************************************/
void SerialCom(void) interrupt 4 using 1
{
//    uchar data i;
    EA=0;
    ES=0;                      /* 关串行中断 */
	SBUF=RetKey;
	TranDataBy232();
    RcvDataBy232();
    if(uc0!=SLAVEKEY_Addr){    /* 非本机地址,继续监听 */
	  goto reti;
    }
    SBUF=SLAVEKEY_Addr;
    TranDataBy232();
    RecvToBuf();
reti:
    ES=1;
    RI=0;  TI=0; EA=1;
}

/***********************************************************************
 -- 从机接收主机按如下命令格式发送来的信息,数据保存至UN.COMBUF缓冲区中:
 -- 包头(1,0xAA) + 键盘地址(1) + 命令(1) + 长度(1) + 数据 + Checksum(1)
 -- 接收完成标志:fini=1;命令:handle;
 ***********************************************************************/
void RecvToBuf(void)
{
    uchar data i;
    uint  data pp,tempint;
    RcvDataBy232();
    if(uc0!=0xaa){
        uc0=0xff;  goto ret1;         /* 不是包头 */
    }
    pp=0xaa;                          /* 清校验和 */
    RcvDataBy232();
    pp=pp+uc0;
    if(uc0!=SLAVEKEY_Addr){
        uc0=0xff;  goto ret1;         /* 不是本机地址 */
    }
    RcvDataBy232(); pp=pp+uc0;
    handle=uc0;
    RcvDataBy232(); pp=pp+uc0;
    Slen=uc0;
    for(i=0;(i<Slen) && (i<10);i++){
           RcvDataBy232();
           Un.ComBuf[i]=uc0;
	   pp+=uc0;                   /*  接收一数据 */
    }
    RcvDataBy232();               /*  接收校验和 */
    tempint=0;
    tempint=(uint)(uc0*256);
    RcvDataBy232();
    tempint=tempint+uc0;

    if(tempint==pp){              /*  效验和相同 */
        SBUF=OK;
        TranDataBy232();
        fini=1;
    }
    else{               /*  如果接收效验和不相同,则回送失败信息给主机  */
        SBUF=Error;
        TranDataBy232();
        fini=0;
    }
ret1: _nop_();
}
/***********************************************************************
 -- 从机向主机发送数据,数据已存在UN.COMBUF缓冲区中:
 -- 包头(1,0xAA) + 命令(1) + 长度(1) + 数据 + Checksum(1)
 ***********************************************************************/
void SendBuf(uchar order,uchar len) 
{
  uchar data i;
  uint  data CheSum;
  ulong l=0;
  do{
        do{
            SBUF=0xaa;
            TranDataBy232();
            RcvDataBy232();
        } while(uc0!=0xbb);     /*  等待主机回送准备好 0XBB  */
        SBUF=order;             /*  发送命令句柄  */
        TranDataBy232();
        CheSum=order;           /*  初始化校验和  */
        SBUF=len;               /*  发送数据长度  */
        TranDataBy232();
        CheSum+=len;
        for(i=0;i<len;i++)
			{     /*  发送数据  */
            	SBUF=Un.ComBuf[i];
            	TranDataBy232();
            	CheSum+=Un.ComBuf[i];
        	}
        SBUF=CheSum/256;
        TranDataBy232();        /*  送校验和  */
        SBUF=CheSum%256;
        TranDataBy232();
        RcvDataBy232();
     }while(uc0!=OK);           /*  如果主机返回成功信号则退出,否则重新发新 */
}
/*******************************************
 ---------- 初始化串行口来多机通信 ---------
 *******************************************/
void InitSBUF(void)     
{
   TMOD=0x21;           /* T/C1定义为方式2 */
   TL1=0xfd;            /* 9600时TH1,TL1=0xfd,1200时TH1,TL1=0XE8 */
   TH1=0xfd; 
   PCON=0x0;
   SCON=0x50;           /* 串行口为方式3,SM2=1,TB8=0,RB8=0 */
  /* SM0=0;*/
   TR1=1;   ES=0;  IT0=0;  EX0=0;  /*ET0=1; ES=1; TR0=1;*/
  /* SM2=1;   PS=1;*/
   RI=0;    TI=0; EA=1;
}

/*****************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -