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

📄 uart.lst

📁 此代码实现功能为:在philips P89LPC935单片机上实现红外遥(对应红外发送芯片为:HT6222)控解码接收
💻 LST
字号:
C51 COMPILER V7.09   UART                                                                  11/29/2005 14:09:25 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN uart.OBJ
COMPILER INVOKED BY: c:\Keil\C51\BIN\C51.EXE uart.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /************************************************************************************************
   2          **文件名: uart.c
   3          **Copyright(c) 2005-2006中太视讯技术有限公司
   4          **创建人:金雨和
   5          **日      期:2005/09/21 16:10:20
   6          **描述:
   7          **      单片机(C51)红外接收程序
   8          **      对应红外发送芯片为:HT6222
   9          **              单片机芯片为philips P89LPC935
  10          **    
  11          **修改人:金雨和
  12          **修改记录:
  13          **  Revision 1.0  创建 2005/09/21 16:10:20  
  14          **
  15          *************************************************************************************************/
  16          #include <Reg935.h>
  17          #include "uart.h"
  18          #include "string.h"
  19          
  20          /**********************************************************************
  21          * 文件:     UART_IR_Master.C
  22          * 开发:     WWW.ZLGMCU.COM
  23          * 日期:     2004.03.04
  24          * 功能:     利用LPC900系列单片机的UART和CCU模块实现红外通信。
  25          *           此程序为主机程序,先发送16字节数据给从机,从机再把接收到的
  26          *           数据返回给主机,如果返回正确,则蜂鸣器短响一声,否则长响一声。       
  27          ************************************************************************/
  28          
  29          #define PLEEN   PLLEN
  30          
  31          // 变量定义 
  32          sbit  BEEP=P2^7;
  33          sbit  KEY1=P0^0;
  34          
  35          const uchar data BRGR1_DATA=9;      //波特率设为2400bit/s
  36          const uchar data BRGR0_DATA=0xb4;
  37          
  38          //主程序开始
  39          void main()
  40          {
  41   1              uchar sndBuf[16];
  42   1       //   uchar RcvBuf[16];               //接收数据用缓冲区
  43   1       //   P0M1=P0M2=0;
  44   1       //   P1M1=P1M2=0;                    //P0,P1口设置为准双向
  45   1              P1M1 &= 0xfc;
  46   1              P1M2 &= 0xfc;
  47   1       //P2M1=P2M2=0xc0;                 //P2.6,P2.7设置为开漏
  48   1      //    CCU_Init();                      //CCU模块初始化,用以产生38KHz调制信号
  49   1          UART_Init();
  50   1      //      IICInit();
  51   1              memset(sndBuf, 0, 16);
  52   1              memcpy(sndBuf, "1234567890abcdef",16);
  53   1      
  54   1          while(1)
  55   1          {   
C51 COMPILER V7.09   UART                                                                  11/29/2005 14:09:25 PAGE 2   

  56   2              //while(KEY1);
  57   2              //Delay(10);
  58   2      #if 0
                      RcvData(sndBuf);//RcvBuf);            //接收16字节数据
              
                              if(sndBuf[0] == 0x0D)
                                      SendData("\r\n",2);
                              else if(sndBuf[0] == 0x0A)
                                      SendData("\r\n",2);
                              else if(sndBuf[0] == 0x08)
                              {
                                      sndBuf[0]=0x08;
                                      sndBuf[1]=' ';
                                      sndBuf[2]=0x08;
                                      SendData(sndBuf,3);
                              }
                              else
                              SendData(sndBuf,1);//16);             //发送16字节数据
              #endif
  75   2                      Delay(10);
  76   2          }   
  77   1      }
  78          
  79          /*********************************************
  80          * 名称:     SendData()
  81          * 功能:     通过UART连续发送16字节数据(0~15)
  82          * 入口参数:无
  83          * 出口参数:无
  84          * 注意:     此程序采用查询方式发送。
  85          **********************************************/
  86          void SendData(uchar *pbuf, uchar len)
  87          {   
  88   1          uchar i;
  89   1          TI=0;
  90   1          for(i=0; i<len; i++)
  91   1          {   
  92   2              SBUF=pbuf[i];
  93   2              while(!TI);
  94   2              TI=0;
  95   2          }    
  96   1      }
  97          
  98          /********************************************************************
  99          * 名称:     RcvData()
 100          * 功能:     通过UART连续接收16字节数据
 101          * 入口参数: pbuf--用于接收数据的缓冲区首地址
 102          * 出口参数: 接收到的16字节数据位于接收缓冲区
 103          * 注意:     此程序采用查询方式进行接收。由于采取半双工通信,所以接收
 104          *           数据之前要打开接收允许,接收完毕之后要关闭接收允许。
 105          *********************************************************************/
 106          void RcvData(uchar *pbuf)
 107          {   
 108   1          uchar i=0;
 109   1          REN=1;
 110   1          FE=0;
 111   1          RI=0;
 112   1          //for(i=0;i<16;i++)
 113   1          {   
 114   2              while(!RI);
 115   2              RI=0;
 116   2              pbuf[i]=SBUF;
 117   2          }
C51 COMPILER V7.09   UART                                                                  11/29/2005 14:09:25 PAGE 3   

 118   1          REN=0;
 119   1      }
 120          
 121          
 122          /*********************************************************************
 123          * 名称:     CCU_Inti()
 124          * 功能:     CCU模块初始化,使OCA(P2.7)输出38KHz,50%占空比的PWM波,
 125          *           作为红外线的载波
 126          *           使用6MHz晶振时,CCU频率=((6000000/2)/6)*32=16MHz
 127          *           定时器重装值=CCU频率/红外线载频=16000000/38000=421=0x1a5
 128          **********************************************************************/
 129          void CCU_Init()
 130          {   
 131   1          //TOR2H=0x01;                     //定时器重装值
 132   1          //TOR2L=0xa5;
 133   1          //OCRAH=0x00;                     //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
 134   1          //OCRAL=0xd2;
 135   1      
 136   1          TOR2H=0x03;                     //定时器重装值
 137   1          TOR2L=0x4a;
 138   1          OCRAH=0x01;                     //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
 139   1          OCRAL=0xa5;
 140   1          TCR21=0x85;                     //PLL预分频为5+1
 141   1          CCCRA=1;                        //非反相的PWM,
 142   1      
 143   1          TCR20=0;
 144   1          PLEEN=1;
 145   1          while(!PLEEN);
 146   1          TCR20|=3;                       //启动定时器,非对称PWM模式
 147   1      }
 148          
 149          /***************************************
 150          * 名称:     UART_Init()
 151          * 功能:     UART初始化,波特率2400bit/s   
 152          ****************************************/
 153          void UART_Init()
 154          {   
 155   1          //PCON=0;
 156   1          //SSTAT=0;                        //双缓冲禁止,中断禁止,采用查询方式发送和接收  
 157   1              SSTAT=0xE0; //选择独立的Tx/Rx中断
 158   1          SCON=0x50;                      //串口模式1,接收禁止
 159   1          //PCON|=0x40;                     //SMOD0=1,SCON的位7作为FE
 160   1          BRGCON=0;
 161   1          BRGR1=0x02;//0x04;//BRGR1_DATA;
 162   1          BRGR0=0xf0;//0xd2;//BRGR0_DATA;     
 163   1          BRGCON=3;                       //启动UART的波特率发生器
 164   1      
 165   1              ESR=1; //ESR=Enable Serial Recieve 
 166   1      //      EST=1; //EST=Enable Serial Transmit 
 167   1              EA=1; //使能中断        
 168   1      }
 169          
 170          /*****************************************************
 171          * 名称:     Delay()
 172          * 功能:     延时0.1*k秒(振荡器为6MHz)
 173          * 入口参数:k--延时时间
 174          * 出口参数:无
 175          * 注意:    如果入口参数k等于0,则不延时而直接返回。
 176          ******************************************************/
 177          void Delay(uchar k)
 178          {       
 179   1          uchar i,j;
C51 COMPILER V7.09   UART                                                                  11/29/2005 14:09:25 PAGE 4   

 180   1          if(k==0)
 181   1          {   
 182   2              return;
 183   2          }
 184   1              for(;k;k--)
 185   1              {       
 186   2              for(j=200;j;j--)            //延时0.1S
 187   2                      {       
 188   3                  for(i=250;i;i--)
 189   3                              {       
 190   4                      //nop();
 191   4                                      //nop();
 192   4                                      //nop();
 193   4                                      ;//nop();
 194   4                              }
 195   3                      }
 196   2              }
 197   1      }
 198          
 199          
 200          //-------------------------------- 
 201          void Rcv_ISR() interrupt 4
 202          {
 203   1              uchar temp;
 204   1              uchar sndBuf[10];
 205   1              //;当接收完一个字节RI置1进入Recieve中断 
 206   1              EA=0; 
 207   1              // while(!RI) //等待接收完时RI置位 
 208   1              temp=SBUF; //保存所读取的数据 
 209   1              RI=0; //RI清0以等待下次发送 
 210   1      
 211   1              #if 0
                      SBUF=temp; //发送数据 
                      while(!TI); //当TI为1时发送完毕 
                      TI=0; //TI清0准备发送 
                      #endif
 216   1      
 217   1              #if 1
 218   1              if(temp == 0x0D)
 219   1                      SendData("\r\n",2);
 220   1              else if(temp == 0x0A)
 221   1                      SendData("\r\n",2);
 222   1              else if(temp == 0x08)
 223   1              {
 224   2                      sndBuf[0]=0x08;
 225   2                      sndBuf[1]=' ';
 226   2                      sndBuf[2]=0x08;
 227   2                      SendData(sndBuf,3);
 228   2              }
 229   1              else
 230   1              SendData(&temp,1);//16);             //发送16字节数据
 231   1      #endif
 232   1              EA=1; 
 233   1      }
 234          //-------------------------------- 
 235          //在有的时候会出现仅发送一次然后程序卡死这种现象但是如果把程序中
 236          //指令的流程稍微修改一下把TI=0移到 while(!TI)的后面程序可连续接收发送 SBUF=temp; 
 237          //发送数据 while(!TI); //当TI为1时发送完毕 TI=0; //TI清0准备下一次发送


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    297    ----
C51 COMPILER V7.09   UART                                                                  11/29/2005 14:09:25 PAGE 5   

   CONSTANT SIZE    =     20    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2      30
   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 + -