基于RTOS和ISP功能的数字仪表系统设计与实现
时间:09-15
来源:互联网
点击:
3.1 数模转换子程序
数据采集与A/D转换子程序主要对配电箱传来的模拟信号进行采样、量化及返回值处理。软件编程时的电气时序及相关技术要求如图4所示。
在时序图中,上升沿清空量化结果寄存器内的值,下降沿启动,A/D转换;采样启动脉冲的高电平状态至少应维持100μs;EOC变为低电平表示转换过程正在进行,且启动信号的硬件迟滞效应时间至少应为10μs;MSB对应AT89S52并口的:P0.7,LSB对应P0.0。
关键部分的程序源代码及注释如下:
unsigned int AI)C0809(void)
{
unsigned int wait="3";
ChannelChooseA=1;
ChannelChooseB=0;
ChannelChooseC=0;
ADStartPulse=0;
ADStartPulse=1;//产生A/D转换的启动脉冲
(上升沿部分)
delay();//保证启动脉冲的高电平宽度
至少大于100μs
ADStartPulse=0;//产生A/D转换的启动脉冲
(下降沿部分)
wait--;
wait--; //指令延时以保证达到:EOC
变为低电平所需的硬件迟滞要求。
‘whilefADConvertEOC==0):
return(Result);/将A/[)转换后的量化值返
回到主函数中。
}
3.2 液晶显示模块
MSl2232B型图形点阵液晶显示(LCM)模块左右分为Master和Slave控制器,上下共分4页,左边列地址为0-61,右边列地址为0-61,对该器件的操作关键是按时序图正确配置好主、辅控制器的工作状态。利用AT89S52访问LCM时有二种常用的方法,即存储器映射寄存器寻址和模拟接口时序,本系统采用后一种方法。主要函数模块源代码分析:
void MasterWriteD(unsigned char Ramdata)
//向Master控制器写数据
{
ReadOrWrite=0;
InstructionOrData=1;
MasterEl=1;
P0=Ramdata;
MasterEl:0;
}
void MasterWriteI(unsigned char Ramdata)
//向Master控制器写指令
{
ReadOrWrite=0;
InstructionOrData=0;
MasterEl=1;
P0=Ramdata;
MasterE1=O;
}
void ReadState(void) //检测主、辅控制器工作状态
{
ReadOrWrite=1;
InstructionOrData=0;
MasterEl=1:
SlaveE2=1;
PO=0xff;
while(BusStateBusy==1);
}
void SetPage(unsigned char page0,unsigned char pagel)
{
MasterWriteI(0xb8 | pagel);
SlaveWriteI(0xb8 | page0);
}
void SetColumn(unsigned char address0,unsigned char addressl)
{
MasterWriteI(0x3f & addressl);
SlaveWfiteI(0x3f & address0);
}
//在主控制器操作的左边LCM屏上显示一列信息(由8个像素点构成)
void MasterPutChar(unsigned char masterchar)
{
ReadState();
MasterWriteD(masterchar);
}
一般说来。AT89S52的RAM存储空间是有限的,而图形或字符的点阵代码(可以下载相关的应用插件,由.bmp文件或字符自动生成)如果太大,放置到RAM区会出现内存不足的告警提示,为此可按如下方式处理:
unsigned char code Dotn[]=lOxOO,Ox00,0x30,
0x00,0x30,Ox00,Ox00,0x00};
即将点阵代码通过code关键字限定后放于ROM区域内。
3.3 DS18820的1-Wire子程序
DS18820的突出优点是将现场采集的环境温度直接以数字形式输出,这样可以省去后续的信号放大及模/数转换部分,构建外围电路的元件少且相对简单,系统成本低廉;1-Wire接口与AT89S52通信,其结构便于多点测量且易于扩展;测温范围宽(-550℃~1250℃)且精度高。
对l-Wire的操作关键是软件时序的处理,对于不同的晶体振荡器其延时参数是不同的,本系统以12MHz为例给出如下主要程序代码:
bit DallassReset(void)
{
unsigned char presence="0";
DallassDataout=1; //发出复位脉冲前先释
放总线
delay(10);
DallassDataout=0;
delay(240);//保证延时在4801μs~9601μs之间
DaUassDataout=1;
delay(35);
Dresence=DallassDataout;
delay(60);
return(presence);
}
//写时序从主控制器把总线拉低时开始
void writeCommand(unsigned char command)
{
unsigned char count;
for(count=O;count<8;count++)
{
DallassDataout=0;
if(command&0x01==1)
{
DallassDataout=1;
//写“1”时序在将总线拉低后,AT89S52主控制器必须在15μs内释放总线,所以此语句之前不能有较长时间的延时语句
}
delay(35);//无论写“1”还是写“0”时序都必须有至少601as的低电平 DallassDataout="1";//总线恢复的过程
command=command>>1;
}
}
//读时序从主控制器将总线拉低至少1μs后释放总线的时刻开始
unsigned char readdata(void)
{
unsigned char value;
unsigned char midtemp="0";
for(value=0;value<8;Value++)
{
I DallassDataout="0";
midtemp=midtemp>>1;
-nop_O;
_nop_O;
DallassDataout=1;
//读时序时,控制器必须在15μs内释放总线,然后采样总线状态,所以此语句之前不能延时太长的时间的延时语句
if(DallassDataout==1)
{
midtemp=midtemp | 0x80;
//因为midtemp初始被赋值为0,所以如果采样总线状态为0则不必处理,0会自动被返回
}
delay(35);
//延时70μs完成此次Bit
位读时序过程,为下一次读作准备
}
return(midtemp);
}
void delay(unsigned char out)
{
unsigned char in;
for(in=out;in>O;in--);
}
数据采集与A/D转换子程序主要对配电箱传来的模拟信号进行采样、量化及返回值处理。软件编程时的电气时序及相关技术要求如图4所示。
在时序图中,上升沿清空量化结果寄存器内的值,下降沿启动,A/D转换;采样启动脉冲的高电平状态至少应维持100μs;EOC变为低电平表示转换过程正在进行,且启动信号的硬件迟滞效应时间至少应为10μs;MSB对应AT89S52并口的:P0.7,LSB对应P0.0。
关键部分的程序源代码及注释如下:
unsigned int AI)C0809(void)
{
unsigned int wait="3";
ChannelChooseA=1;
ChannelChooseB=0;
ChannelChooseC=0;
ADStartPulse=0;
ADStartPulse=1;//产生A/D转换的启动脉冲
(上升沿部分)
delay();//保证启动脉冲的高电平宽度
至少大于100μs
ADStartPulse=0;//产生A/D转换的启动脉冲
(下降沿部分)
wait--;
wait--; //指令延时以保证达到:EOC
变为低电平所需的硬件迟滞要求。
‘whilefADConvertEOC==0):
return(Result);/将A/[)转换后的量化值返
回到主函数中。
}
3.2 液晶显示模块
MSl2232B型图形点阵液晶显示(LCM)模块左右分为Master和Slave控制器,上下共分4页,左边列地址为0-61,右边列地址为0-61,对该器件的操作关键是按时序图正确配置好主、辅控制器的工作状态。利用AT89S52访问LCM时有二种常用的方法,即存储器映射寄存器寻址和模拟接口时序,本系统采用后一种方法。主要函数模块源代码分析:
void MasterWriteD(unsigned char Ramdata)
//向Master控制器写数据
{
ReadOrWrite=0;
InstructionOrData=1;
MasterEl=1;
P0=Ramdata;
MasterEl:0;
}
void MasterWriteI(unsigned char Ramdata)
//向Master控制器写指令
{
ReadOrWrite=0;
InstructionOrData=0;
MasterEl=1;
P0=Ramdata;
MasterE1=O;
}
void ReadState(void) //检测主、辅控制器工作状态
{
ReadOrWrite=1;
InstructionOrData=0;
MasterEl=1:
SlaveE2=1;
PO=0xff;
while(BusStateBusy==1);
}
void SetPage(unsigned char page0,unsigned char pagel)
{
MasterWriteI(0xb8 | pagel);
SlaveWriteI(0xb8 | page0);
}
void SetColumn(unsigned char address0,unsigned char addressl)
{
MasterWriteI(0x3f & addressl);
SlaveWfiteI(0x3f & address0);
}
//在主控制器操作的左边LCM屏上显示一列信息(由8个像素点构成)
void MasterPutChar(unsigned char masterchar)
{
ReadState();
MasterWriteD(masterchar);
}
一般说来。AT89S52的RAM存储空间是有限的,而图形或字符的点阵代码(可以下载相关的应用插件,由.bmp文件或字符自动生成)如果太大,放置到RAM区会出现内存不足的告警提示,为此可按如下方式处理:
unsigned char code Dotn[]=lOxOO,Ox00,0x30,
0x00,0x30,Ox00,Ox00,0x00};
即将点阵代码通过code关键字限定后放于ROM区域内。
3.3 DS18820的1-Wire子程序
DS18820的突出优点是将现场采集的环境温度直接以数字形式输出,这样可以省去后续的信号放大及模/数转换部分,构建外围电路的元件少且相对简单,系统成本低廉;1-Wire接口与AT89S52通信,其结构便于多点测量且易于扩展;测温范围宽(-550℃~1250℃)且精度高。
对l-Wire的操作关键是软件时序的处理,对于不同的晶体振荡器其延时参数是不同的,本系统以12MHz为例给出如下主要程序代码:
bit DallassReset(void)
{
unsigned char presence="0";
DallassDataout=1; //发出复位脉冲前先释
放总线
delay(10);
DallassDataout=0;
delay(240);//保证延时在4801μs~9601μs之间
DaUassDataout=1;
delay(35);
Dresence=DallassDataout;
delay(60);
return(presence);
}
//写时序从主控制器把总线拉低时开始
void writeCommand(unsigned char command)
{
unsigned char count;
for(count=O;count<8;count++)
{
DallassDataout=0;
if(command&0x01==1)
{
DallassDataout=1;
//写“1”时序在将总线拉低后,AT89S52主控制器必须在15μs内释放总线,所以此语句之前不能有较长时间的延时语句
}
delay(35);//无论写“1”还是写“0”时序都必须有至少601as的低电平 DallassDataout="1";//总线恢复的过程
command=command>>1;
}
}
//读时序从主控制器将总线拉低至少1μs后释放总线的时刻开始
unsigned char readdata(void)
{
unsigned char value;
unsigned char midtemp="0";
for(value=0;value<8;Value++)
{
I DallassDataout="0";
midtemp=midtemp>>1;
-nop_O;
_nop_O;
DallassDataout=1;
//读时序时,控制器必须在15μs内释放总线,然后采样总线状态,所以此语句之前不能延时太长的时间的延时语句
if(DallassDataout==1)
{
midtemp=midtemp | 0x80;
//因为midtemp初始被赋值为0,所以如果采样总线状态为0则不必处理,0会自动被返回
}
delay(35);
//延时70μs完成此次Bit
位读时序过程,为下一次读作准备
}
return(midtemp);
}
void delay(unsigned char out)
{
unsigned char in;
for(in=out;in>O;in--);
}
Atmel 电压 C语言 嵌入式 Keil 电路 ADC 显示器 传感器 LCD 放大器 温度传感器 振荡器 总线 PCB 相关文章:
- 一种高性价比等精度数字频率计方案设计(03-16)
- 基于单片机的数字电容表设计(08-16)
- 一种2Gsps数字示波器数据采集系统的设计(08-18)
- ARM7-VxWorKs的网络化实时彩色分析虚拟仪器(09-19)
- 测量多种生理参数的无线集散医疗监护系统(01-12)
- 基于单片机的自动量程切换电压测量系统设计(10-27)