ATMEL公司推出的带有看门狗功能的单片机AT89C55WD带有20K的程序存储器,是8051系列中一款较为先进的产品,其看门狗功能可以大大提高产品的稳定性,大容量的内部程序存储器可以容纳功能丰富的软件。下面简要介绍以A51为开发工具,以AT89C55WD单片机为核心,开发流量积算控制仪的设计和实现方法。
一、流量积算控制仪总体布局
流量积算仪有5个输入通道:分别为流量L、压力补偿P、热电偶TC、热电阻Pt100、频率F。由通道开关控制。流量积算仪的基本工作原理是:通过输入信号电路把各种模拟信号经通道开关送入A/D转换器,转换成数字信号(频率信号直接由微处理器进行计数),微处理器根据采样的结果和数字设定内容进行计算比较后显示及控制输出。
(图1)原理方框图
(图2)总体功能图
二、系统电路构成
流量积算控制仪电路由单片机AT89C55WD、5+8位LED显示电路、通道开关TC4052电路、A/D采集电路、数据存储电路AT24C04、电源管理电路IMP708、变送输出电路TLC465、AD694、开关量输出电路、键盘和电源及馈电输出等电路组成,下面简要介绍各个组成部分。
1.单片机AT89C55WD及电路组成
单片机AT89C55WD通过P0.0~P0.3驱动3D1显示驱动芯片HD7279,再去驱动5位数橘樱码管,显示瞬时流量PV值;同时驱动5个按键和8个LED指示灯。通过P0.4~P0.7驱动3D2显示驱动芯片HD7279,再去驱动8位数码管,显示流量累积值SV。通过P1.0~P1.3控制CS5523 A/D转换器采集数据。将采集到的数据通过一系列的运算处理,如图3所示,并将运算结果通过显窗口分别将瞬时值和积算值显示出来,同时点亮相应的指示灯。由于突发事件停电,会造成数据丢失。为了避免数据丢失,我们采用了IMP708芯片进行掉电保护,当电压下降到708阀值(如4.6伏)时,将相关数据存入AT24C04中,电源恢复后,重新加载这些数据。另外键盘数据和流量积算值等也存储在AT24C04中。
2.显示和键盘电路
在积算仪中使用LED 数码管显示器,瞬时流量值的显示采用2只四联LG3641AG共阴数码管,积算流量值的显示采用1只四联LG5641AG和一只LG5611共阴数码管。其驱动芯片是2支HD7279,既解决了13位数码管的驱动,同时又解决了5个按键、8个指示灯的驱动。HD7279是一款LED数码管和键盘接口芯片: 可驱动8位LED数码管和64键键盘,SPI接口,外围元件非常少。与单片机接口采用SPI串行接口方式,方便实用。
3. A/D采集电路
A/D采集电路主要由16-bit的CS5523构成,该芯片是SPI串行接口,具有片选端。而4个通道的输入则选用了TC4052进行控制。
4.看门狗电路
AT89C55WD与MCS-51相兼容,可对内核进行1000次的电擦写,其电压、电流和功耗都比较小,带有20K的可重写快闪存储器和硬件看门狗定时器。
看门狗定时器是在系统软件崩溃后进行恢复的一种方法,WDT由13位计数器和看门狗复位特殊功能寄存器(WDTRST SFR)组成,在缺省设置下,系统复位时即关闭。要使WDT有效,用户必须向0A6H单元的WDTRST SFR顺序写入01EH和0E1H。当WDT有效,计数器每经过一个机器周期后加1,除了硬件或WDT溢出复位,没有任何方法可使WDT无效。当计数器溢出,WDT就在RST引脚产旅伍弯生一个复位的高脉冲。
要使WDT持续有效,就必须每隔一定时间往WDTRST写入01EH和0E1H来避免WDT溢出。当WDT的13位计数器计数至8191(1FFFH)时,计数器便溢出,引起设备的复位。这就意味着用户必须至少每8191个机器周期复位WDT一次。使WDT复位,必须向只写寄存器WDTRST写入01EH和0E1H。当WDT溢出时在RST引脚产生一个复位的高电平脉冲,持续时间为:98×TOSC ,TOSC=1/FOSC。为了充分利用WDT,在要求防止WDT溢出复位时,应每隔一定周期写WDTRST一次。拆闷
下面给出一个例程:
将看门狗定时器放在T1中,每中断一次,需50ms,当计数器,计满1秒给R19加1。当主程序或子程序在10秒之内还未对R19清0,说明程序可能“跑飞”,此时看门狗使能,将AT89C55WD复位,从地址0000H处开始执行。
R19 DATA 13H
R23 DATA 17Hms计数器
T1int: 定时(计时)器
MOV TH1, #4CH
MOV TL1, #00H计满重装初值(约50ms)
INC R23 (20次*50ms)=1000ms=1s
MOV A,R23
CJNE A,#20,T1int_01 计满1s向下
INC R19 用于看门狗定时
MOV A,R19
CLR C
SUBB A,#10
JC T1int_0110秒到向下,复位
CLR EA
MOV WDTRST,#01EH WDT使能,13bit
MOV WDTRST,#0E1H TOSC=1/FOSC.
JMP $
T1int_01: RETI
三、系统软件部分
系统软件采用A51汇编语言编程。
1.编程语言
本系统采用Keil公司V7.0的C51编译器。A51是一个有通用特性机用法的重定位宏汇编器,能很好地与INTEL公司的MASM51宏汇编兼容,支持模块化编程,可以方便地与高级语言接口。
2. 数学模型与程序设计
流量积算仪的数学模型很复杂,涉及到几十个公式,但基本公式为:
(1)质量流量 (2)标准体积流量
(3)密度运算公式
式中:ρ—工况密度,ρ20—标况密度,T0—为273.15℃,T—温度补偿输入信号(单位:℃),P—压力补偿输入信号,P0—设计压力(标况=0.10133MPa),PA—仪表工作点的大气压力。
(图3)基本数学模型与程序分支结构
3.工作过程
由于整个系统较复杂,几个流程图很难表述清楚整个软件的运算过程。这里给出一个粗略的流程图,来表述流量积算仪的简单的工作流程。详见图4所示。
(图4)程序流程图
四、程序
整个源程序(含注释)265KB,把占用空间较大的饱和蒸汽、过热蒸汽、Pt100、K分度、E分度热电偶表格也放在了程序存储器上。汇编后的HEX文件约16KB,仅用了20KB程序存储器的五分之四,剩下的4K可留给将来添加新功能。 结束语 在研制流量积算控制仪的过程中,我们采用A51编程进行软件开发,以AT24C04作为控制参数和积算值等存储器,同时设置了看门狗,程序“跑飞”的现象几乎不存在。加上有电源管理芯片IMP807,由于掉电而引起的数据丢失现象不存在。
我们研制的流量积算控制仪的智能化程度相当高,如:
温度T或压力P补偿出现异常时(无温压补偿除外),同时差压ΔP大于0,温度或压力指示灯闪烁,用以提示温度或压力补偿出现了异常。密度ρ取最近一次的值。断电后密度值不保持,重新上电密度值取ρ=1,有差压ΔP就有流量L,但此时流量值为近似值。待故障排除后,流量积算值恢复正常。
http://www.c51.cn/Article/mcuzh/200604/4105.html
AD0809的采集程序//---A/D转换---
//-----头文件引用------
#include <Reg51.h>
#include <absacc.h>
#include <intrins.h>
typedef unsigned char BYTE/*自定义字节类型*/
#define Set_Bit(BIT) (BIT = 1) /*定义置1函数*/
#define Clear_Bit(BIT) (BIT = 0) /*定义清0函数*/
/************************************************************************************/
void Write_Hd7279(BYTE,BYTE)/*定义HD7279写函数*/
BYTE Read_Hd7279(BYTE)/*定义HD7279读函数*/
void Send_Byte(BYTE)/*定义HD7279发送字节函数*/
BYTE Receive_Byte(void)/清冲*定义HD7279接收字节函数*/
void Short_Delay(void)/*定义短延时函数*/
void Long_Delay(void)/*定义长延时函数*/
void Mcu_Init(void)/*定义MCU初始化函数*/
void Delay_200_mS(void)/*定义200ms延时函数*/
sbit Hd7279_Clk=P1^6/*定义HD7279时钟硬件连接*/
sbit Hd7279_Data=P1^5/*定义HD7279数据硬件连接携则*/
sbit cs=P1^7
void Short_Delay(void) /*短延时函数*/
{
BYTE i
for(i=0i<0x08i++)
}
/************************************************************************************/辩正棚
void Long_Delay(void) /*长延时函数*/
{
BYTE i
for(i=0i<0x30i++)
}
/************************************************************************************/
void Write_Hd7279(BYTE Command,BYTE Data) /*HD7279写函数*/
{
Send_Byte(Command)
Send_Byte(Data)
}
/************************************************************************************/
void Send_Byte(BYTE Data_Out) /*HD7279发送字节函数*/
{
BYTE i
cs=0
Long_Delay()
for(i=0i<8i++)
{
if(Data_Out&0x80) Set_Bit(Hd7279_Data)
else Clear_Bit(Hd7279_Data)
Set_Bit(Hd7279_Clk)
Short_Delay()
Clear_Bit(Hd7279_Clk)
Short_Delay()
Data_Out=Data_Out<<1
}
Clear_Bit(Hd7279_Data)
}
//-----宏声明-----
#define A_DPORT XBYTE[0xFef3]//0809通道0地址
#define uchar unsigned char
//-----变量定义-----
bit bdata bz=0//定义标志
uchar val
//-----初始化-----
void first(void)
{
P1=0xff
P2=0xff
P3=0xff
P0=0xff
Send_Byte(0xa4)
IT1=1
EX1=1
EA=1//INT0 允许
}
//-----中断-----
void int_0(void) interrupt 2
{
val=A_DPORT//读 A_D 数据
bz=1//置读数标志
}
//-----主程序-----
main()
{
first()//初始化
while(1)
{
A_DPORT=val//启动 A_D
while(bz==0)//等待 A_D 转换结束
// val=~A_DPORT
//P1=val//数据输出
Write_Hd7279(0xc8,val&0x0f)
Write_Hd7279(0xc9,val>>4)
Write_Hd7279(0x92,0x00)
Write_Hd7279(0x93,0x00)
Write_Hd7279(0x94,0x00)
Write_Hd7279(0x95,0x00)
Write_Hd7279(0xce,0x0d)
Write_Hd7279(0xcf,0x0a)
bz=0//清读数标志
}
}
这就是C的程序
http://hi.baidu.com/dzkfw/blog/item/4a188216fd986b12c83d6d05.html
不平凡的单片机学习资料,很好的单片机教程,超好用,一个不占内存的教程,有案例。
1、最新版单片机编程宝典下载地址,学习单片机编程必备手册
2、单片机c语言运用例子
3、十天学会单片机c语言和单片机制作,最好的单片机资料
可以用这个替代Microchip Technology Inc.的 MCP1525/41 器件是高精度 2.5V 和 4.096V 参考电压源,它采用先进的 CMOS电路设计和 EPROM 存储方式,保证初始容差在 ±1%(最大值)范围内,温度稳定世桥携性控制在±50ppm/°C(最大值)范围内。除了在 25°C 下静态电流很低(最大不超过100μA)外,这些器件在时间和温度稳定性上也比传统的齐纳技术具有明显优势。MCP1525 的输出电压是2.5V,MCP1541是 4.096V。器件提供SOT-23-3 和TO-92两种封装形式,并且在工业级温度范围-40°C 至+85°C 范围内可正常消手工作。应用领域* 电池供电系统* 手持式仪表* 仪器和过程控制* 测试设备* 数据采集系统* 通搜伏信设备* 医疗器材* 高精度电源* 8 位、 10 位和12 位 A/D转换器(A/D Converter,ADC)* D/A 转换器(D/A Converter, DAC)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)