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

📄 ad_cy.lst

📁 一段源代码给大家看看
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   AD_CY                                                                 02/20/2009 10:36:17 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE AD_CY
OBJECT MODULE PLACED IN AD_CY.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE AD_CY.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          /* --- AD采样程序------------------------------------------------------------ */
   3          /* --- 史继前 设计 2009.02.20 V1.2 ------------------------------------------ */
   4          /* --- 程序代码版本:V1.2  -------------------------------------------------- */
   5          /* --- 演示 在AD采样电流值的精确性------------------------------------------- */
   6          /* --- Mobile: 15999617642 -------------------------------------------------- */
   7          /* --- 文档说明请查阅测试文档V1.2-------------------------------------------- */
   8          #include<reg52.h>
   9          #define RELOAD 0xf3 //此为串口1,串口波特率重装数值。晶振:24M,12T模式,SMOD=0,
  10                               //串口波特率基准采用4800bps.
  11          void AD_Iint(void);                                     //AD初始化
  12          void AD_Interrupt(void);                        //AD中断服务程序
  13          void Serial_Port_Initial(void);         //串口初始化原型
  14          void Send_UART(uint8);                          //发送数据原型
  15          void UART_Interrupt_Receive(void);      //中断接收
  16          void Timer0_Init(void);                         //定时器0初始化,定时1MS
  17          void Timer0_Interrupt(void);            //定时器中断服务程序
  18          bit  UTL_DelayTime(uint16 );            //延时程序
  19          uint8 Read_Data(uint16);                        //从EEPROM中读数据
  20          void Write_Data(uint8,uint16);          //向EEPROM中写数据
  21          void Erase_Data(uint16);            //将EEPROM中的数据擦除
  22          void IAP_Disable(void);                         //关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态
  23          void Delays(void);                                      //软件延时程序
  24          void Display_LED(void);                         //测试灯闪烁
  25          
  26          uint32  idata   AD_Data;                //AD结果变量
  27          uint8   idata   k=0;                    //AD采样次数计录
  28          uint32  idata   AD_Data1=0;             //AD结果变量1
  29          uint32  idata   AD_Data2=0;             //AD结果
  30          uint32  idata    __dwTemp;                      //此为时间计数变量
  31          uint16  idata     __wTemp;              //此为时间计数变量
  32          uint16  idata   Data=0;                         //AD结果变量
  33          uint32  data     __dwCountSystem=0;     //定时计数值
  34          
  35          uint8 IAP_BYTE_READ             =1;             //字节读
  36          uint8 IAP_BYTE_PROGRAM  =2;             //字节编程,可以将1 写成0,要将1 变成0,必须执行字节编程
  37          uint8 IAP_SECTOR_ERASE  =3;             //扇区擦除,可以将0 擦成1,要将0 变成1,必须擦除整个扇区
  38          uint8 ENABLE_IAP                =0x80;          //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值
  39          
  40          main()
  41          {
  42   1              AUXR |=0xC0;                                    //d=1,定时方式的分频系数改变,采用1T模式
  43   1              Delays();                                               //延时一小断时间有利于串口的初始化
  44   1              Display_LED();                                  //程序开始执行一小段的闪烁程序
  45   1              Serial_Port_Initial();                  //串口初始化
  46   1      
  47   1              Timer0_Init();                                  //定时器0初始化,定时1MS
  48   1              Erase_Data(0x3200);                             //擦除扇区
  49   1              Write_Data(0x00,0x3200);                //写数据
  50   1              Data=Read_Data(0x3200);                 //读取数据      
  51   1              IAP_Disable();                                  //关闭IAP功能
  52   1              AD_Iint();                                              //AD初始化
  53   1      
  54   1              while(1) 
  55   1              {
C51 COMPILER V7.06   AD_CY                                                                 02/20/2009 10:36:17 PAGE 2   

  56   2             
  57   2              Send_UART((uint8)(AD_Data2>>8));                                //发送AD数据,分两次发送
  58   2              Send_UART((uint8)(AD_Data2));
  59   2              Erase_Data(0x2600);                     //擦除扇区
  60   2              Write_Data((uint8)(AD_Data2>>8),0x2600);        //写数据
  61   2              Erase_Data(0x2800);                     //擦除扇区
  62   2              Write_Data((uint8)(AD_Data2),0x2800);   //写数据
  63   2          UTL_DelayTime(10);
  64   2         }    
  65   1              
  66   1      }
  67          void Display_LED(void)//LED灯闪烁
  68          {
  69   1              unsigned char i=0;
  70   1              for(i=0;i<5;i++)
  71   1              {
  72   2              P4_0=1;
  73   2              Delays();
  74   2              P4_0=0;
  75   2              Delays();
  76   2              }
  77   1      }
  78          /****************************************************************************** 
  79          函数:AD_Iint()
  80          功能:AD初始化
  81          说明:设置相应的AD参数,并且打开AD中断,可用中断方式,亦可用查询方式 
  82          ******************************************************************************/ 
  83          
  84          void AD_Iint(void)
  85          {
  86   1              P1ASF   = 0xFF;         //设置P1的所有I/0口都为AD输入口
  87   1              //A/D转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
  88   1              ADC_CONTR       = 0xE7; //   1       1      1       0        0        1    1    1 
  89   1              UTL_DelayTime(1);       //ADC_POWER =1.开ADC 电源, 第一次使用时要打开内部模拟电源
  90   1                                                      // 可适当加延时,1mS 以内就足够了
  91   1              AUXR1= 0x04;            // ADRJ=AUXR^4 设为1, 10 位A/D 转换结果的高2 位存放在ADC_RES 中低2位,
  92   1                                                      // 低8位存放在ADC_RESL 中
  93   1              ADC_CONTR = 0xEF;       //开始AD转换
  94   1              EADC = 1;               // 允许ADC中断
  95   1              EA   = 1;               // 打开总中断
  96   1      
  97   1      }
  98          /****************************************************************************** 
  99          函数:AD_Interrupt()
 100          功能:AD中断,对AD结果进行分析
 101          说明:AD中断,可用中断方式,亦可用查询方式 ,此采用中断方式
 102          ******************************************************************************/ 
 103          
 104          void AD_Interrupt(void) interrupt 5 
 105          {  
 106   1          k++;
 107   1              ADC_CONTR = 0xE7;                                       //AD关闭
 108   1          EADC = 0;                                                   //禁止AD中断
 109   1              //UTL_DelayTime(1);
 110   1              Data = ADC_RES*256+ADC_RESL;            //AD采样出来的数值
 111   1              AD_Data = Data;                                         //存入数据
 112   1          AD_Data1 = AD_Data1+AD_Data;                //相加采样值
 113   1              //AD_Data = (AD_Data*5000)>>10;
 114   1          if(k==64)                                                   //采样64次之后进行平均求值
 115   1          {
 116   2                      k=0;
 117   2                      AD_Data2 = (AD_Data1*4893)>>16; //根据参考电压得到最终的数据
C51 COMPILER V7.06   AD_CY                                                                 02/20/2009 10:36:17 PAGE 3   

 118   2              AD_Data1=0;
 119   2          }
 120   1              ADC_CONTR = 0xEF;                                       //重新开始AD转换
 121   1              EADC = 1;
 122   1      }
 123          /****************************************************************************** 
 124          函数:Delays()
 125          功能:软件延时
 126          说明:本函数采用软件延时一定的时间
 127          ******************************************************************************/ 
 128          
 129          void Delays(void)//延时
 130          {
 131   1              unsigned short j=0;
 132   1              unsigned short g=0;
 133   1              for(j=0;j<100;j++)
 134   1              {
 135   2                      for(g=0;g<5000;g++)
 136   2                      {
 137   3                      ;       
 138   3                      }
 139   2              }                       
 140   1      }
 141          /****************************************************************************** 
 142          函数:Read_Data()
 143          功能:从EEPROM中读数据
 144          说明:设置相应的IAP参数,最后连续送5A和A5到IAP_TRIG中开启IAP.读取数据,返回
 145          ******************************************************************************/ 
 146          
 147          uint8 Read_Data(uint16 Flash_Address)           //从EEPROM中读数据
 148          {
 149   1               uint8 Dat=0;
 150   1               IAP_CONTR      =ENABLE_IAP  ;  //打开 IAP 功能, 设置 Flash 操作等待时间
 151   1               IAP_CMD        =IAP_BYTE_READ ;//设置为IAP/ISP/EEPROM 字节读模式命令
 152   1               IAP_ADDRH      =(uint8)(Flash_Address>>8);     //设置目标单元地址的高8 位地址
 153   1               IAP_ADDRL  =(uint8)Flash_Address;              //设置目标单元地址的低8 位地址
 154   1               EA=0;
 155   1               IAP_TRIG       =0x5A ;                                         //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
 156   1               IAP_TRIG       =0xA5 ;                                         //送完A5h 后,ISP/IAP 命令立即被触发起动
 157   1               EA=1;
 158   1      ;
 159   1               Dat=IAP_DATA ;                                                 //读出的数据在IAP_DATA 单元中,送入累加器A
 160   1               return(Dat);
 161   1      }
 162          /****************************************************************************** 
 163          函数:Write_Data()
 164          功能:向EEPROM中写数据
 165          说明:设置相应的IAP参数,最后连续送5A和A5到IAP_TRIG中开启IAP,自动进行写数据操作.

⌨️ 快捷键说明

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