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

📄 pcf8591.lst

📁 89S52单片机做的A/D,D/A的实验的源程序PCF8591 D/A CONVERTER */ /* */ /* LCD1602显示 */ /* 参考电压接至5V电源 */ /* 最小输出电
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.05a   PCF8591                                                              12/04/2006 11:20:24 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE PCF8591
OBJECT MODULE PLACED IN PCF8591.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PCF8591.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************/
   2          /*                                                                 */
   3          /* ME500单片机开发系统演示程序 - PCF8591四路电压                   */
   4          /*                                                                 */
   5          /* LCD1602显示                                                     */
   6          /* 参考电压接至5V电源                                              */
   7          /* 最小输出电压:0.00V  最大输出电压:5.00V  分辨率:0.02V         */
   8          /*                                                                 */
   9          /* 版本: V1.0 (2006/11/20)                                        */
  10          /* 作者: gguoqing (Email: gguoqing@willar.com)                    */
  11          /* 网站: www.willar.com(伟纳电子)   www.mcusj.com(伟纳单片机世界) */
  12          /* 时间: 2006/05/22                                               */
  13          /*                                                                 */                                     
             -                             
  14          /*【版权】Copyright(C)伟纳电子 www.willar.com  All Rights Reserved */
  15          /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       */
  16          /*                                                                 */
  17          /*******************************************************************/
  18          
  19          
  20          //-----------------------函数声明,变量定义------------------------
  21          #include <reg51.h>
  22          #include <intrins.h>
  23          sbit SDA=P1^3;                   // 将p1.1口模拟数据口
  24          sbit SCL=P1^0;                   // 将p1.0口模拟时钟口
  25          
  26          #define uchar unsigned char
  27          #define uint  unsigned int
  28          #define disdata  P0              //显示数据码输出口
  29          
  30          sbit LCD_RS = P2^0;             
  31          sbit LCD_RW = P2^1;
  32          sbit LCD_EN = P2^2;
  33          
  34          uint data dis[4]={0x00,0x00,0x00,0x00}; 
  35                                    //定义3个显示数据单元和1个数据存储单元
  36          
  37          uchar code dis4[] = {"1- .  V  2- .  V"};
  38          uchar code dis5[] = {"3- .  V  4- .  V"};
  39          
  40          
  41          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  42                                   
  43          bit   bdata SystemError;                //从机错误标志位
  44          
  45          /*********************** PCF8591专用变量定义 ***********************/
  46          
  47          #define PCF8591_WRITE   0x90
  48          #define PCF8591_READ    0x91
  49          #define  NUM  4                     //接收和发送缓存区的深度
  50          uchar idata receivebuf[NUM];    //数据接收缓冲区
  51          
  52          /*******************************************************************/
  53          /*                                                                 */
  54          /*  延时函数                                                       */
C51 COMPILER V8.05a   PCF8591                                                              12/04/2006 11:20:24 PAGE 2   

  55          /*                                                                 */
  56          /*******************************************************************/
  57          
  58          void delay(int ms)
  59          {
  60   1          while(ms--)
  61   1              {
  62   2            uchar i;
  63   2                for(i=0;i<250;i++)  
  64   2                 {
  65   3                  _nop_();                       
  66   3                      _nop_();
  67   3                      _nop_();
  68   3                      _nop_();
  69   3                 }
  70   2              }
  71   1      }               
  72          
  73          /*******************************************************************/
  74          /*                                                                 */
  75          /*检查LCD忙状态                                                    */
  76          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  77          /*                                                                 */
  78          /*******************************************************************/ 
  79          
  80          bit lcd_busy()
  81           {                          
  82   1          bit result;
  83   1          LCD_RS = 0;
  84   1          LCD_RW = 1;
  85   1          LCD_EN = 1;
  86   1          delayNOP();
  87   1          result = (bit)(P0&0x80);
  88   1          LCD_EN = 0;
  89   1          return(result); 
  90   1       }
  91          
  92          /*******************************************************************/
  93          /*                                                                 */
  94          /*写指令数据到LCD                                                  */
  95          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  96          /*                                                                 */
  97          /*******************************************************************/
  98          
  99          void lcd_wcmd(uchar cmd)
 100          
 101          {                          
 102   1         while(lcd_busy());
 103   1          LCD_RS = 0;
 104   1          LCD_RW = 0;
 105   1          LCD_EN = 0;
 106   1          _nop_();
 107   1          _nop_(); 
 108   1          P0 = cmd;
 109   1          delayNOP();
 110   1          LCD_EN = 1;
 111   1          delayNOP();
 112   1          LCD_EN = 0;  
 113   1      }
 114          
 115          /*******************************************************************/
 116          /*                                                                 */
C51 COMPILER V8.05a   PCF8591                                                              12/04/2006 11:20:24 PAGE 3   

 117          /*写显示数据到LCD                                                  */
 118          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
 119          /*                                                                 */
 120          /*******************************************************************/
 121          
 122          void lcd_wdat(uchar dat)
 123          {                          
 124   1         while(lcd_busy());
 125   1          LCD_RS = 1;
 126   1          LCD_RW = 0;
 127   1          LCD_EN = 0;
 128   1          P0 = dat;
 129   1          delayNOP();
 130   1          LCD_EN = 1;
 131   1          delayNOP();
 132   1          LCD_EN = 0; 
 133   1      }
 134          
 135          /*******************************************************************/
 136          /*                                                                 */
 137          /*  LCD初始化设定                                                  */
 138          /*                                                                 */
 139          /*******************************************************************/
 140          
 141          void lcd_init()
 142          { 
 143   1          delay(15);                   
 144   1          lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
 145   1          delay(5);
 146   1          lcd_wcmd(0x38);         
 147   1          delay(5);
 148   1          lcd_wcmd(0x38);         
 149   1          delay(5);
 150   1      
 151   1          lcd_wcmd(0x0c);      //显示开,关光标
 152   1          delay(5);
 153   1          lcd_wcmd(0x06);      //移动光标
 154   1          delay(5);
 155   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 156   1          delay(5);
 157   1      }
 158          
 159          /*******************************************************************/
 160          /*                                                                 */
 161          /*  设定显示位置                                                   */
 162          /*                                                                 */
 163          /*******************************************************************/
 164          
 165          void lcd_pos(uchar pos)
 166          {                          
 167   1        lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
 168   1      }
 169          
 170          /******************************************************************/
 171          /*                                                                */
 172          /* 数据处理与显示                                                 */
 173          /* 将采集到的数据进行16进制转换为ASCLL码。                        */
 174          /*                                                                */
 175          /******************************************************************/
 176          
 177          show_value(uchar ad_data)
 178          
C51 COMPILER V8.05a   PCF8591                                                              12/04/2006 11:20:24 PAGE 4   

 179          {   
 180   1          dis[2]=ad_data/51;   //AD值转换为3为BCD码,最大为5.00V。
 181   1          dis[2]=dis[2]+0x30;  //转换为ACSII码
 182   1          dis[3]=ad_data%51;   //余数暂存
 183   1          dis[3]=dis[3]*10;    //计算小数第一位
 184   1          dis[1]=dis[3]/51;
 185   1          dis[1]=dis[1]+0x30;  //转换为ACSII码
 186   1          dis[3]=dis[3]%51;
 187   1          dis[3]=dis[3]*10;    //计算小数第二位
 188   1          dis[0]=dis[3]/51;                                                                             //
 189   1          dis[0]=dis[0]+0x30;  //转换为ACSII码           
 190   1      } 
 191          //-------------------------------------------------------------------
 192          // 函数名称: iic_start()
 193          // 函数功能: 启动I2C总线子程序
 194          //-------------------------------------------------------------------
 195          void iic_start(void)
 196          { //时钟保持高,数据线从高到低一次跳变,I2C通信开始
 197   1              SDA = 1;     
 198   1              SCL = 1;
 199   1              delayNOP();      // 延时5us 
 200   1              SDA = 0;
 201   1              delayNOP();
 202   1          SCL = 0;
 203   1      }
 204          //-------------------------------------------------------------------
 205          // 函数名称: iic_stop()
 206          // 函数功能: 停止I2C总线数据传送子程序
 207          //-------------------------------------------------------------------
 208          void iic_stop(void)
 209          {       
 210   1              SDA = 0;           //时钟保持高,数据线从低到高一次跳变,I2C通信停止
 211   1              SCL = 1;
 212   1              delayNOP();
 213   1              SDA = 1;
 214   1              delayNOP();
 215   1          SCL = 0;
 216   1      }
 217          //------------------------------------------------------------------
 218          // 函数名称: iicInit_()
 219          // 函数功能: 初始化I2C总线子程序
 220          //------------------------------------------------------------------
 221           void iicInit(void)
 222             {
 223   1         SCL = 0;
 224   1         iic_stop();  
 225   1         }  
 226          //-------------------------------------------------------------------
 227          // 函数名称: slave_ACK
 228          // 函数功能: 从机发送应答位子程序
 229          //-------------------------------------------------------------------
 230          void slave_ACK(void)
 231          {
 232   1              SDA = 0;  
 233   1              SCL = 1;
 234   1              delayNOP();     
 235   1              SCL = 0;
 236   1      }
 237          //-------------------------------------------------------------------
 238          // 函数名称: slave_NOACK
 239          // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
 240          //-------------------------------------------------------------------
C51 COMPILER V8.05a   PCF8591                                                              12/04/2006 11:20:24 PAGE 5   

 241          void slave_NOACK(void)
 242          { 
 243   1              SDA = 1;
 244   1              SCL = 1;
 245   1              delayNOP();
 246   1              SDA = 0;

⌨️ 快捷键说明

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