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

📄

📁 这是用89C2051制作的一个串口键盘
💻
字号:
C51 COMPILER V7.08   確口键臺                                                              03/11/2008 13:50:23 PAGE 1   


C51 COMPILER V7.08, COMPILATION OF MODULE 確口键臺
OBJECT MODULE PLACED IN 串口键盘.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 串口键盘.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*-----------------------------------------------------
   2           使用说明:      该程序是实现两个单片机之间传送按键值,利用的是串行通讯模式1
   3                      A、这个是从函数的程序,可以直接下载到2051里;
   4                      B、这个函数可以以字符串的方式发送;调用SendChar(uchar ch)
   5                      C、还可以使用数据方式进行发送; 调用SendStrlen(unsigned char *str,unsigned int strl)
   6                      D、在使用时可以使用校验的方式防止数据发送错误;
   7                      E、此函数加了软件看狗;
   8          设 计 人:         KG            
   9          修改时间:       2007-11-3   
  10          //---------------------------------------------------*/
  11          #include "reg51.h" 
  12          #include <intrins.h>
  13          #include <string.h>
  14          
  15          #define uchar unsigned char 
  16          #define uint  unsigned int
  17          sbit P1_0=P1^0;
  18          sbit P1_1=P1^1;
  19          sbit P1_2=P1^2;
  20          sbit P1_3=P1^3;
  21          sbit P1_4=P1^4;
  22          sbit P1_5=P1^5;
  23          sbit P1_6=P1^6;
  24          sbit P1_7=P1^7;
  25          sbit led=P3^7;
  26          //---------------------------------------------------*/
  27          //全局变量定义
  28          unsigned char SendEnable;       //软件看门狗设置        
  29          unsigned char B_key_value;  //串口校验使用
  30          /*-----------------------------------------------------------------------------------
  31          函 数 名:   Delay()
  32          功    能:       延时
  33          说    明:       延时时间0.5ms*i                 最大延时127.5ms     12M
  34                                  延时时间0.25ms*i                最大延时63.75ms         24M
  35          入口参数:       unsigned char i
  36          返 回 值:       无
  37          /*---------------------------------------------------------------------------------*/
  38          void Delay(unsigned char i)
  39          {
  40   1              unsigned char j;
  41   1      do{
  42   2      //-------------------
  43   2              j=250;                          //延时0.5ms
  44   2              do{
  45   3                      j--;
  46   3              }while(j);
  47   2      //-------------------
  48   2              i--;
  49   2              }while(i);
  50   1      }
  51          /*-----------------------------------------------------------------------------------
  52          函 数 名:
  53          功    能:       延时
  54          说    明:       
  55          入口参数:       unsigned char i
C51 COMPILER V7.08   確口键臺                                                              03/11/2008 13:50:23 PAGE 2   

  56          返 回 值:       无
  57          设 计 人: 2007 11 3    KG
  58          /*---------------------------------------------------------------------------------*/
  59          void Delay500ms(unsigned char i)
  60          {
  61   1              do{
  62   2                      Delay(200);                     //延时500ms
  63   2                      i--;
  64   2                      }while(i);
  65   1      }
  66          /*-----------------------------------------------------
  67          函 数 名:
  68          功    能:       打开及初始化串口
  69          说    明:
  70          入口参数:
  71          返 回 值:
  72          设 计 人: 2007 11 3    KG
  73          //---------------------------------------------------*/
  74          void OpenSerialCom(void)
  75          {
  76   1              SCON  =  0x50;                  //设置串口工作模式1并打开串口
  77   1              TMOD  =  0x20;                  //波特率
  78   1              PCON |=  0x80;
  79   1              TH1   =  0xfa;                  //9600
  80   1              TL1       =     0xfa;
  81   1              IE   |= 0x90;                   //打开串行中断及总中断
  82   1              TR1   = 1;                              //启动内部定时
  83   1      }
  84          /*-----------------------------------------------------
  85          函 数 名:
  86          功    能:       数据(字符串)串行发送
  87          说    明:
  88          入口参数:
  89          返 回 值:
  90          设 计 人: 2007 11 3    KG
  91          //---------------------------------------------------*/
  92          void SendChar(uchar ch)
  93          {
  94   1              ES=0;
  95   1              SBUF=ch;
  96   1              while(TI==0);
  97   1              TI=0;
  98   1              led=0;
  99   1              Delay500ms(1);          //1s
 100   1              led=1;
 101   1              ES=1;
 102   1      }
 103          /*-----------------------------------------------------
 104          函 数 名:   SendStrlen()
 105          功    能:       字符串串行发送
 106          说    明:
 107          入口参数:   *str: 所要发送字符串;
 108                      str1: 发送字符串的个数。
 109          返 回 值:   无
 110          设 计 人: 2007 11 3    KG
 111          //---------------------------------------------------*/
 112          void SendStrlen(unsigned char *str,unsigned int strl)
 113          {
 114   1              unsigned int k=0;
 115   1              if(strl==0)
 116   1                      strl=strlen(str);
 117   1              do{
C51 COMPILER V7.08   確口键臺                                                              03/11/2008 13:50:23 PAGE 3   

 118   2                      SendChar(*(str + k));
 119   2                      k++;
 120   2                      }while(k<strl);
 121   1      
 122   1              }
 123          /*-----------------------------------------------------
 124          函 数 名:
 125          功    能:       接收主CPU返回的按键值并进行校验,错误则重发。
 126          说    明:       从CPU的串行中断,接收到主CPU返回的数据,如果正确则把RXD置低.
 127                       主CPU检测到该信号后确认键值。
 128          入口参数:
 129          返 回 值:       
 130          设 计 人: 2007 11 3    KG
 131          //---------------------------------------------------*/ 
 132          void B_Serial() interrupt 4
 133          {
 134   1              unsigned char ch;
 135   1              if(RI)
 136   1              {       RI=0;
 137   2                      IE &= 0x0f;
 138   2                      ch=SBUF;
 139   2                      if(ch!=B_key_value)                     //校验
 140   2                      {       SendChar(B_key_value);
 141   3                              SendEnable+=1;                  //允许发送
 142   3                      }
 143   2                      else
 144   2                      {       led=0;
 145   3                              REN=0;                                  //关闭串口
 146   3                              RXD = 0;                                //将检测位置0
 147   3                              ch = 50;                                //延时100us
 148   3                              do{
 149   4                                      ch--;
 150   4                              }while(ch);
 151   3                              RXD = 1;
 152   3                              REN = 1;                                //打开串口
 153   3                              Delay500ms(1);
 154   3                              led=1;
 155   3                              SendEnable=0;
 156   3                      }
 157   2              }
 158   1      }
 159          /*-----------------------------------------------------
 160          函 数 名:
 161          功    能:       按键扫描
 162          说    明:
 163          入口参数:   无
 164          返 回 值:   键值
 165          设 计 人: 2007 11 3    KG
 166          //---------------------------------------------------*/
 167          uint KeyScan()
 168          {      
 169   1         uchar   a=16;  
 170   1            P1=0xF0;
 171   1            
 172   1         if((P1&0xF0)!=0xF0)
 173   1          {
 174   2           //Delay(120);//延时消抖
 175   2           if((P1&0xF0)!=0xF0)
 176   2            {
 177   3                if(P1_4==0)
 178   3                  { //while(P1_4==0);
 179   4                    P1=0X0F;
C51 COMPILER V7.08   確口键臺                                                              03/11/2008 13:50:23 PAGE 4   

 180   4                   while(P1_0==0){a=0;}//key();}
 181   4                   while(P1_1==0){a=1;}//key();}
 182   4                   while(P1_2==0){a=2;}//key();}
 183   4                   while(P1_3==0){a=3;}//key();}
 184   4                  }
 185   3                 else if(P1_5==0)
 186   3                  
 187   3                   {// while(P1_5==0);
 188   4                    P1=0X0F;
 189   4                   while(P1_0==0){a=4;}     //key();}
 190   4                   while(P1_1==0){a=5;}//key();}
 191   4                   while(P1_2==0){a=6;}//key();}
 192   4                   while(P1_3==0){a=7;}//key();}
 193   4                  }
 194   3              else if(P1_6==0)
 195   3                  
 196   3                   {//while(P1_6==0);
 197   4                      P1=0X0F;
 198   4                   while(P1_0==0){a=8;}//key();}
 199   4                   while(P1_1==0){a=9;}//key();}
 200   4                   while(P1_2==0){a=10;}//key();}
 201   4                   while(P1_3==0){a=11;}//key();}
 202   4                   }
 203   3               else if(P1_7==0)
 204   3                  
 205   3                   {//while(P1_7==0);
 206   4                      P1=0X0F;
 207   4                   while(P1_0==0){a=12;}//key();}
 208   4                   while(P1_1==0){a=13;}//key();}
 209   4                   while(P1_2==0){a=14;}//key();}
 210   4                   while(P1_3==0){a=15;}//key();}
 211   4                   }    
 212   3             }
 213   2             //else return(20);  
 214   2            }
 215   1             B_key_value=a;
 216   1         return(a);
 217   1      }
 218          /*-----------------------------------------------------
 219          函 数 名:
 220          功    能:    IO口函数初始化, 指示灯闪烁两次
 221          说    明:
 222          入口参数:    无
 223          返 回 值:    无
 224          设 计 人: 2007 11 3    KG
 225          //---------------------------------------------------*/
 226          void SystemInti()
 227          {
 228   1         uint  i=0;
 229   1          SendEnable=0;    //初始化变量
 230   1            for(i; i<2; i++)
 231   1             {
 232   2                led=0;//系统开始,红灯闪烁两次 
 233   2                     Delay500ms(1); //0.5s
 234   2                     led=1;
 235   2                 Delay500ms(1); //0.5s 
 236   2             }
 237   1          P1 &=0x00;
 238   1      }
 239          /*-----------------------------------------------------
 240          函 数 名:   main()主函数
 241          功    能:
C51 COMPILER V7.08   確口键臺                                                              03/11/2008 13:50:23 PAGE 5   

 242          说    明:
 243          入口参数:
 244          返 回 值:
 245          设 计 人: 2007 11 3    KG
 246          //---------------------------------------------------*/
 247          void main()
 248          {
 249   1                 
 250   1             uint k;
 251   1                  //P0=0Xff;
 252   1                  //P2=0X00;
 253   1                  //Delay500ms(20);
 254   1       start:
 255   1          SystemInti();         //系统初始化
 256   1              OpenSerialCom();    //串口初始化为模式1
 257   1              Delay(100);
 258   1              while(1)
 259   1              {//k=10;
 260   2                      k=KeyScan();       //这个按键取值非常稳定
 261   2      //k=10;
 262   2                if(k!=16)
 263   2                { P0=0Xff;
 264   3                  P2=0X00;
 265   3                  Delay500ms(20);
 266   3                 SendChar(k);          //正常键值发送
 267   3                 }
 268   2                      if(SendEnable>=20) //软件看门狗,系统跑飞,重新开始
 269   2                              goto start;
 270   2              }
 271   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    447    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2       7
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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