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

📄 串口接收1602.lst

📁 一些51单片机基础模块的程序
💻 LST
字号:
C51 COMPILER V7.50   串口接收1602                                                          04/10/2009 19:11:40 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 串口接收1602
OBJECT MODULE PLACED IN 串口接收1602.OBJ
COMPILER INVOKED BY: E:\Program Files\Keil\C51\BIN\C51.EXE 串口接收1602.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /********************************************************************
   2          * 文件名  : 串口接收试验.c
   3          * 描述    :  该程序从串口接收数据,通过LCD显示数据。在LCD的第一行显示出来,
   4                                   当数据过多时(超过16个字符),LCD第一行将会被覆盖。
   5                                   该试验使用的晶振是11.0592,如果使用12M晶振,会出现串口接收
   6                                   不正常的情况。原因是用12M晶振,波特率9600时的误差率达 8%。                      
   7          * 创建人  : 东流,2009年4月8日
   8          * 版本号  : 2.0
   9          * 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
  10          * 感谢“中国自动化资讯网”对本工作室的大力支持。
  11          ***********************************************************************/
  12          #include<reg52.h>
  13          #include<intrins.h>
  14          
  15          #define uchar unsigned char
  16          #define uint  unsigned int 
  17          
  18          /*LED_Buffer[16]用来存储串口发送的数据,com_dat用来记录串口发送的个数*/
  19          uchar LED_Buffer[16], *q, com_dat;      //从串口接收的数据
  20          
  21          //这三个引脚参考资料
  22          sbit E=P2^7;            //1602使能引脚
  23          sbit RW=P2^6;           //1602读写引脚  
  24          sbit RS=P2^5;           //1602数据/命令选择引脚
  25          
  26          /********************************************************************
  27          * 名称 : Delay(uint del)
  28          * 功能 : 延时10ms * del
  29          * 输入 : 无
  30          * 输出 : 无
  31          ***********************************************************************/
  32          void Delay(uint del)
  33          {
  34   1              uint i,j;
  35   1              for(i=0; i<del; i++)
  36   1              for(j=0; j<1827; j++)    
  37   1              ;
  38   1      }
  39          
  40          /********************************************************************
  41          * 名称 : delay()
  42          * 功能 : 延时,延时时间大概为140US。
  43          * 输入 : 无
  44          * 输出 : 无
  45          ***********************************************************************/
  46          
  47          void delay()
  48          {
  49   1      int i,j;
  50   1      for(i=0;i<=10;i++)
  51   1      for(j=0;j<=2;j++)
  52   1      ;
  53   1      }
  54          
  55          /********************************************************************
C51 COMPILER V7.50   串口接收1602                                                          04/10/2009 19:11:40 PAGE 2   

  56          * 名称 : Convert(uchar In_Date)
  57          * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
  58          * 输入 : 1602资料上的值
  59          * 输出 : 送到1602的值
  60          ***********************************************************************/
  61          uchar Convert(uchar In_Date)
  62          {
  63   1          uchar i, Out_Date = 0, temp = 0;
  64   1          for(i=0; i<8; i++)
  65   1          {
  66   2              temp = (In_Date >> i) & 0x01;
  67   2              Out_Date |= (temp << (7 - i));
  68   2          }
  69   1          return Out_Date;
  70   1      }
  71          /********************************************************************
  72          * 名称 : enable(uchar del)
  73          * 功能 : 1602命令函数
  74          * 输入 : 输入的命令值
  75          * 输出 : 无
  76          ***********************************************************************/
  77          
  78          void enable(uchar del)
  79          {
  80   1      P0 = Convert(del);
  81   1      RS=0;
  82   1      RW=0;
  83   1      E=0;
  84   1      delay();
  85   1      E=1;
  86   1      delay();
  87   1      }
  88          
  89          /********************************************************************
  90          * 名称 : write(uchar del)
  91          * 功能 : 1602写数据函数
  92          * 输入 : 需要写入1602的数据
  93          * 输出 : 无
  94          ***********************************************************************/
  95          
  96          void write(uchar del)
  97          {
  98   1      P0 = Convert(del);
  99   1      RS=1;
 100   1      RW=0;
 101   1      E=0;
 102   1      delay();
 103   1      E=1;
 104   1      delay();
 105   1      }
 106          
 107          /********************************************************************
 108          * 名称 : L1602_init()
 109          * 功能 : 1602初始化,请参考1602的资料
 110          * 输入 : 无
 111          * 输出 : 无
 112          ***********************************************************************/
 113          void L1602_init(void)
 114          {
 115   1              enable(0x01);
 116   1              enable(0x38);
 117   1              enable(0x0c);
C51 COMPILER V7.50   串口接收1602                                                          04/10/2009 19:11:40 PAGE 3   

 118   1              enable(0x06);
 119   1              enable(0xd0);
 120   1      }
 121          
 122          /********************************************************************
 123          * 名称 : L1602_char(uchar hang,uchar lie,char sign)
 124          * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
 125                           L1602_char(1,5,'b')
 126          * 输入 : 行,列,需要输入1602的数据
 127          * 输出 : 无
 128          ***********************************************************************/
 129          void L1602_char(uchar hang,uchar lie,char sign)
 130          {
 131   1      uchar a;
 132   1      if(hang==1) a=0x80;
 133   1      if(hang==2) a=0xc0;
 134   1      a=a+lie-1;
 135   1      
 136   1      enable(a);
 137   1      
 138   1      write(sign);
 139   1      }
 140          
 141          /********************************************************************
 142          * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
 143          * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
 144                           L1602_string(1,5,"ab cd ef;")
 145          * 输入 : 行,列,需要输入1602的数据
 146          * 输出 : 无
 147          ***********************************************************************/
 148          void L1602_string(uchar hang,uchar lie,uchar *p)
 149          {
 150   1      uchar a;
 151   1      if(hang==1) a=0x80;
 152   1      if(hang==2) a=0xc0;
 153   1      a=a+lie-1;
 154   1      
 155   1      enable(a);
 156   1      while(1)
 157   1      {
 158   2      if(*p=='\0') break;
 159   2      write(*p);
 160   2      p++;
 161   2      }
 162   1      }
 163          
 164          /********************************************************************
 165          * 名称 : Main()
 166          * 功能 : 主函数
 167          * 输入 : 无
 168          * 输出 : 无
 169          ***********************************************************************/
 170          
 171          
 172          /********************************************************************
 173          * 名称 : Com_Int()
 174          * 功能 : 串口中断子函数
 175          * 输入 : 无
 176          * 输出 : 无
 177          ***********************************************************************/
 178          void Com_Int(void) interrupt 4
 179          {
C51 COMPILER V7.50   串口接收1602                                                          04/10/2009 19:11:40 PAGE 4   

 180   1              EA = 0;
 181   1              if(RI == 1)   //当硬件接收到一个数据时,RI会置位
 182   1              {
 183   2                      LED_Buffer[com_dat] = SBUF;             //把从串口读出的数存到数组
 184   2                      RI = 0; 
 185   2                      com_dat++;
 186   2                      if(com_dat == 16) com_dat = 0;          //当com_dat = 16时,清0,防止数组溢出
 187   2              } 
 188   1              EA = 1;
 189   1      }
 190          
 191          /********************************************************************
 192          * 名称 : Com_Init()
 193          * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
 194          * 输入 : 无
 195          * 输出 : 无
 196          ***********************************************************************/
 197          void Com_Init(void)
 198          {
 199   1           TMOD = 0x20;
 200   1           PCON = 0x00;
 201   1           SCON = 0x50;                       
 202   1           TH1 = 0xFd;    //设置波特率 9600
 203   1           TL1 = 0xFd;
 204   1           TR1 = 1;           //启动定时器1
 205   1               ES = 1;                //开串口中断
 206   1               EA = 1;                //开总中断              
 207   1      }
 208          
 209          /********************************************************************
 210          * 名称 : Main()
 211          * 功能 : 主函数
 212          * 输入 : 无
 213          * 输出 : 无
 214          ***********************************************************************/
 215          void Main()
 216          {
 217   1              uchar i = 0, com_dat = 0;       
 218   1              L1602_init();
 219   1              Delay(100);
 220   1              Com_Init();
 221   1              P2 = 0x00; 
 222   1              while(1)
 223   1              {
 224   2                      q = LED_Buffer; 
 225   2                      L1602_string(1,1,q);
 226   2                      com_dat = 0;    
 227   2                      Delay(100);
 228   2              }
 229   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    365    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     20       5
   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 + -