1. ATMEL89S8252与AD1674简介:
(1)ATMEL89S8252的性能特点:
ATMEL89系列单片机与8051系列单片机兼容,这个系统对于以8051系列为基础的系统来说,十分容易进行取代。同时,对那些熟悉8051的用户来说,用ATMEL公司的89系列单片机来取代8051进行系统的设计也是轻而易举的事。
本系统采用的ATMEL89系列单片机中的AT89S8252型号,AT89S8252 采用ATMEL的高密度非易失性存储器技术制造,与工业上标准的80C51的指令系统及引脚兼容,
片内可向下装载Flash,允许程序存储器在系统内通过SPI串行口改写或用通用的非易失性存储器编程器改写。通过把通用的8位CPU与可向下装载的Flash集成在一个芯片上,AT89S8252便成为一个高效的微型计算机。它的应用范围广,可用于解决复杂的控制问题,且成本较低。
AT89S8252型单片机除了具备一般的单片机性能之外还具备如下的特点:
● 8 KB Flash的存储器,可写/擦1000次
● 具有2 KB的EEPROM,可写/擦100000次,提高了存储容量
● 含有9个中断响应的能力
● 含有标准型和低档型所不具备的SPI接口
● 含有Watchdog定时器,它的存在可以大大提高单片机工作的可靠性
● 含有双数据指针
● 含有从电源下降的中断恢复
(2)AD1674数模转换芯片是美国模拟器件公司的新一代产品,它是逐次逼近型的12位精度中高端产品。AD1674有如下特点:(1)有参考电压基准和时钟电路,单/双极性输入;(2)全8位或16位微处理器接口;(3)250ns总线取数时间,能满足一般微处理器的时序要求;(4)高转换率,其采样时间控制在10us以内,速度极快,所以此系统设计时是采用查询的方式与单片机连接的;(5)片内集成了采样保持器,保持器使数据传送的准确性得到了保证,而且避免了另加元件使系统复杂化的麻烦。
模拟电压的输入:模拟电压从13脚或14脚输入。因为在芯片内部,13,14脚之间是一个内部分压电阻,所以用13脚作输入端而将14脚悬空不会有什么危害,反之亦然。在本课题中要求双极性输入,与单片机的接口:AD1674 可以进行12位转换,也可以进行8位转换,由于单片机是8位的,需要进行两次转换,这里需要注意的是必须将BIT11-BIT4接到数据总线的D7- D0,而将BIT3-BIT0采取向高位靠齐,接到接到D7-D4,分两次读取转换结果,切不可错接,如果错接的话,极易损坏芯片,也不能正确读取转换结果。
2. AD1674与ATMEL89S8252的接口:
模拟量经由八选一多路转换器ADG408 输入到 AD1674.AD1674可以进行12位转换,也可以进行8位转换,由于单片机是8位的,需要进行两次转换,这里需要注意的是必须将BIT11- BIT4接到数据总线的D7-D0,而将BIT3-BIT0采取向高位靠齐,接到接到D7-D4,分两次读取转换结果。
AD1674有 5根控制线,其中CE CS R/C 为一般控制线,完成器件的定时、寻址、启动和读出操作,12/8和A0决定芯片的转换周期和数据输出格式。CE CS R/C三者有效的次序可先可后,在本单片机系统中,12/8接地,CE与单片机的读写信号经过与或门连接。而CE R/C由74LS373控制, CS由74LS138经过译码来控制。在下图中可以看出AD1674的地址为0x5fff,74LS373的地址为0x3fff 。在启动转换或读取A/D 之前,必须将A0和R/C置成如上图所示的相应电平,然后再在CS端施加一负脉冲。AD1674的总线读取周期为250ns,可直接挂接在数据总线上。由于AD1674的转换速度极快,采用查询的方式来设计的。其中STS是转换结束标志,它可提供CPU查询A/D转换是否结束。
3.本系统软件采用C语言开发设计而成,增强了程序的可读性和易懂性。程序清单如下:
sbit p14=P1^4;
sbit P13=P1^3;
char xdata *ad74_ls=(char xdata *)0x3fff;//373地址
char xdata *ad_1674=(char xdata *)0x5fff;
void select_channel (unsigned char ch)
{
p14=1;选中408
if(ch==0)
{
*ad74_ls=0x00; 373高3位控制ADG408的通道信号
*ad_1674=0x00;//启动12位
while(P13==1);等待P13变低,转换结束
*ad74_ls=0x02; //置r/c为1,A0=0
h=*ad_1674; 读取高8位
*ad74_ls=0x03; //置r/c为1,A0=1
l=*ad_1674; }读取低4位
else if(ch==1)
{ *ad74_ls=0x20;
*ad_1674=0x00;//启动12位
while(P13==1);
*ad74_ls=0x22; //置r/c为1,A0=0
h=*ad_1674;
*ad74_ls=0x23; //置r/c为1,A0=1
l=*ad_1674;
}
else if(ch==2)
{ *ad74_ls=0x40;
*ad_1674=0x00;//启动12位
while(P13==1);
*ad74_ls=0x42; //置r/c为1,A0=0
h=*ad_1674;
*ad74_ls=0x43; //置r/c为1,A0=1
l=*ad_1674;
}
else if(ch==3)
{ *ad74_ls=0x60;
*ad_1674=0x00;//启动12位
while(P13==1);
*ad74_ls=0x62; //置r/c为1,A0=0
h=*ad_1674;
*ad74_ls=0x63; //置r/c为1,A0=1
l=*ad_1674;
}
else if(ch==4)
{ *ad74_ls=0x80;
*ad_1674=0x00;//启动12位
while(P13==1);
*ad74_ls=0x82; //置r/c为1,A0=0
h=*ad_1674;
*ad74_ls=0x83; //置r/c为1,A0=1
l=*ad_1674;
}
else if(ch==5)
{ *ad74_ls=0x0A0;
*ad_1674=0x00;//启动12位
while(P13==1);
*ad74_ls=0x0A2; //置r/c为1,A0=0
h=*ad_1674;
*ad74_ls=0x0A3; //置r/c为1,A0=1
l=*ad_1674;
}
else if(ch==6)
{ *ad74_ls=0x0C0;
*ad_1674=0x00;//启动12位
while(P13==1);
*ad74_ls=0x0C2; //置r/c为1,A0=0
h=*ad_1674;
*ad74_ls=0x0C3; //置r/c为1,A0=1
l=*ad_1674;
}
else
{ *ad74_ls=0x0E0;
*ad_1674=0x00;//启动12位
while(P13==1);
*ad74_ls=0x0E2; //置r/c为1,A0=0
h=*ad_1674;
*ad74_1s=0xE3;
l=*ad_1674;
}
}
void main(void)
{
unsigned char i;
unsigned int hi lo adresult;
while(1)主循环
{
for(i=0;i<6;i++)
{
select_channel(i);
hi=(unsigned int)(h<<4);高8位
lo=(unsigned int)(l>>4);低 4位
adresult=hi+lo;
}
}
}
4.结束语
本系统经实验运行后,取得良好的效果,基本上能准确的将模拟量转换为数字量,其误差在LSB内。