资源简介
用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 cygli
文件 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
- 上一篇:udp 泛洪攻击vc++源码
- 下一篇:数据结构(c语言版)代码实现
相关资源
- IIC-OLED显示屏新资料(SSD1306)
- 基于C51与1602液晶显示屏的万年历电子
- 基于80C51单片机的20多个仿真实验
- 单片机交通灯课程设计.zip
- keilC51和C语言入门教程(PDF版)
- 基于AT89C51的8*8点阵字符显示的实验报
- keil C51 v6.12完全解密版
- 单片机原理与应用及C51程序设计PPT谢
- PS2键盘、鼠标与at89c51单片机的通信设
- 单片机C51学习KEIL C的仿真
- 单片机C语言库 STC89C51/52 AT89C52/51
- HDC1080驱动 温湿度 STM32 IIC I2C
- Keil 4 C51V901
- C51单片机C语言400例.zip
- 单片机C语言400例
- ADS112C04 16位AD TM4模拟IIC驱动
- STM32上驱动基于IIC协议的OLED 128664 0.
- STM32与触摸芯片BS83B12A-3通过IIC通信读
- 智能多功能电子时钟闹钟设计-源代码
- Keil c51 v9.52破解版(附注册机)
- 单片机keil5汉化
- 毕业设计—基于STC89C51单片机的模拟电
- c51 跑马灯8路跑灯\\PMW亮度控制
- 基于SHT11和12864液晶的温湿度报警功能
- 基于C51的单片机温度控制系统设计
- 51单片机驱动ADC0808电路图C51及汇编程
- 89C51双机通信的Proteus仿真及C语言收发
- 基于C51的篮球比赛计时计分器
- 基于89C51的0-99秒表计8个成绩电路图和
- c51单片机24C01-24C16读写程序含PROTEUS仿
评论
共有 条评论