• 大小: 72KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-06-16
  • 语言: C/C++
  • 标签: C51  gprs  iic  485  

资源简介

用C51实现51单片机的gprs通信。代码详细包含了AD采集程序、iic串口编程、485通信的软件实现等功能

资源截图

代码片段和文件信息

#include “c8051F410.h“
#include “public.h“
#include 

#define YC1         11
#define YC2         12

bit isAdFinished;
bit isFirst;
unsigned char xdata TimerAdCount;
unsigned char xdata TimerAd;
unsigned int xdata SamplingInterval; // 历史数据的保存周期,单位:分钟

// 外部函数声明
void SaveHisData(void);
void RTC_GetTime(void);
//--------------------------------------------------

void ADC_Enable()
{
    ADC0CN = 0xC0;
REF0CN = Vref_Voltage | 0x07;
}

void ADC_Disable()
{
    ADC0CN = 0x40;
REF0CN = Vref_Voltage;
}

void ADC_Init()
{
    ADC0MX = 0x18;    // 选择AD转换的通道号(0..232425other_Value 对应通道P1.0-P2.7,TempVDDGnd)
ADC0CF = 0xFE;      // 采用16次连续采样,返回值是16次的和
ADC0TK = 0xF7;      // 工作在低功耗跟踪保持方式
    ADC0CN = 0x40; // D7:AD Enable  D6:Burst Mode Enable
EIE1 |= 0x08;  // 允许AD转换结束中断AD阀值比较器中断未开放

    REF0CN = Vref_Voltage;  // 0x11:2.2V,0x01:1.5V。参见芯片资料中该特殊寄存器的详细描述
REG0CN = Vdd_Voltage;   // 默认值为0x10:即CPU的工作电压为2.5V,现设置0x00为2.1V

    isFirst = 1;
    isAdFinished = 0;
    TimerAd = 0;
    AD_RTC_BIT = 0;
    SamplingInterval = 4;   // 设置采集周期为5分钟,RTC始终将按1分钟发生定时中断
}

void ProcessAD(void)   // 每5分钟才进行1次AD转换
{
float xdata fTmp;
    unsigned long xdata tmpLong;
unsigned char xdata tmpChar;
    static unsigned long xdata tmpLast;
    static bit isConverting;

    if (!AD_RTC_BIT) return;
    tmpLong = (CurAlmTime / 60) - 1;    // 结果是当前时间,以分钟为计数单位
    if (tmpLast>tmpLong) tmpLast=tmpLong;
    if ((tmpLong - tmpLast)>4) {
        tmpLast = tmpLong-(tmpLong % 5);
        isConverting = 1;
        TimerAdCount = 0;
    }
    if (isConverting == 0) {
        AD_RTC_BIT = 0;
        return;
    }

if (!AD_10MS_BIT) return;             // 10ms计数
AD_10MS_BIT = 0;

TimerAdCount++;
if (TimerAdCount == 1) {  
ADC0MX = YC1; // 指向遥测1: P1.3
ADC_Enable();   // 启动Vref电压电路
return;
}
if (TimerAdCount < 10) return;  // 等待参考电压稳定,0.1秒延时

if (TimerAdCount == 10) {
isAdFinished = 0;
AD0BUSY = 1; // 启动AD转换
return;
}
if(isAdFinished){   // 查询ADC0转换是否完成
isAdFinished = 0;
fTmp = (float)ADC0H * 256 + ADC0L;            //  采集结果是16次采集的和
        #if ( (Vref_Voltage == Vref_22) && (Vdd_Voltage == VDD_25) ) // 当CPU电压为2.1V时,Vref只输出为1.5V
    fTmp = fTmp * 2.175 / 65536.0;
        #else  
    fTmp = fTmp * 1.48 / 65536.0;
        #endif
// 采用8051F3X的温度曲线,好像相对正确 mV=3.35T + 897  => 真实温度 = (fTmp -0.897) / 0.00335;
tmpChar = ADC0MX & 0x1f;  // 获取当前的采集位置

if (tmpChar == YC1) {
YcVal[0] = fTmp; 
ADC0MX = YC2;  // 指向遥测2:P1.4
AD0BUSY = 1;  // 启动AD转换
return;
}
if (tmpChar == YC2) {
YcVal[1] = fTmp; 
}
ADC_Disable();
        AD_RTC_BIT = 0;
        isConverting = 0;
        if (isFirst) {
            isFirst = 0;
            return;
        }
        SaveHisData();
}
}

void ADC0_ISR (void) interrupt 10 
{
AD0INT = 0;
isAdFinished = 1;
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        410  2008-06-23 18:03  cyglink.txt

     文件       7862  2008-06-18 09:12  IIC.c

     文件       5280  2008-04-15 13:54  InitDevice.c

     文件      12933  2008-06-23 17:54  Main.c

     文件     139299  2008-06-23 18:03  MAIN.M51

     文件      42845  2008-06-23 18:03  MAIN.OMF

     文件       5313  2008-06-23 17:57  public.h

     文件      39491  2008-06-23 18:06  Q24PL002.c

     文件       7868  2008-06-19 08:27  RTC.c

     文件       1373  2008-06-23 17:36  STARTUP.A51

     文件      12282  2008-06-19 16:51  SW485.c

     文件        621  2008-06-23 18:03  tmp.out

     文件       3177  2008-06-09 15:48  AdConvert.c

     文件      16320  2007-11-29 15:07  c8051F410.h

     文件       2172  2012-02-14 08:02  CS0602.Opt

     文件       2395  2008-06-09 15:48  CS0602.Uv2

     文件      47734  2008-06-23 18:01  CS0602.wsp

----------- ---------  ---------- -----  ----

               347375                    17


评论

共有 条评论