AD转换程序(ADC0808 TLC2543)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
名称:read2543
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/
//TI TLC2543 12位AD驱动程序,51晶振是11.0592MHz的。
/*------------------------------------------------------------------------------
{
uchar i;
for(i=0;i<n;i++)
{
_nop_();
}
}
/**************************************
名称:read2543
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/
D_CLOCK=0;
//参数设定开始
//注意:参数的设定只对下一周期的测量有效,对本次取样没有作用
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<7;
D_CLOCK=0; //选择12位的数据长度
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
E=1;
mdelay(5);
while((P0&0x80)==0x80)
0x6f};//共阴极段码
uchar b[4];//存放4位显示的数
sbit START=P2^4;
sbit OE=P2^6;
sbit EOC=P2^5;
void mdelay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void show(void)
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<1;
D_CLOCK=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp;
D_CLOCK=0;
D_CS=1;
return (uint)(mRetADHi*256+mRetADLo);
show();
}
}
Lesson6-4:TLC2543数字电压表,2路模拟输入,一路测量范围0~5V,一路量程0~10V,采用1602液晶显示,仿真通过。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
}
void show(void)//数码管显示子程序
{
uint i;
uchar c=0x01;
for(i=0;i<4;i++)
{
P1=(c<<i);
P3=b[i];
if(i==2)//显示小数点
P3=P3|0x80;
mdelay(1);
}
}
void main(void)
{
uint ad=0;
while(1)
uint read2543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
{
uchar mRetADHi,mRetADLo; //返回的测量值的高位、8低位
uchar mTemp;
D_CLOCK=0;
D_CS=0;
mRetADHi=0;
mRetADLo=0;
//把通道号(4位)打入2543 **代码虽然麻烦,但编译后的执行速度很快**
D_IN=(bit)(port&0x08);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<3;
D_CLOCK=0;
D_IN=(bit)(port&0x04);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<2;
sbit CLOCK=P2^7; /*2543时钟*/
sbit D_IN=P2^6; /*2543输入*/
sbit D_OUT=P2^4; /*2543输出*/
sbit _CS=P2^5; /*2543片选*/
sbit E=P3^4;
sbit RS=P3^5;
sbit RW=P3^6;
const uchar NoDisp=0;
sbit D_IN=P2^6;
sbit D_OUT=P2^4;
sbit D_CS=P2^5;
void mdelay(uint z)//1ms延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**************************************
const uchar NoCur=1;
const uchar CurNoFlash=2;
const uchar CurFlash=3;
void mdelay(uint z)//1ms延时子程序
{
ห้องสมุดไป่ตู้uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay(uchar n)//2543中的延时子程序
mRetADLo|=mTemp<<6;
D_CLOCK=0;
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<5;
D_CLOCK=0; //高位在前输出
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<4;
D_CLOCK=0;
D_IN=(bit)(port&0x02);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<1;
D_CLOCK=0;
D_IN=(bit)(port&0x01);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp;
for(i=0;i<n;i++)
{
_nop_();
}
}
/**************************************
名称:read2543
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/
Lesson6-4:ADC0808数字电压表,测量范围0~5V,仿真通过
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
b[3]=a[shuju/1000];//最高位始终为0
show();
}
}
Lesson6-4:TLC2543数字电压表,测量范围0~5V,1路模拟输入,采用4位数码管显示,仿真通过。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
D_IN=(bit)(port&0x80);//通道值高位先送出
CLOCK=1;
delay(3);
CLOCK=0;
delay(3);
port<<=1;
ad<<=1;
}
_CS=1;
ad>>=1;//循环中多左移了一位
return ad;
}
void show(void)//数码管显示子程序
{
uint i;
D_CLOCK=0; //单极性输出
//参数设定结束
D_CLOCK=1; //填充4个任意位
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<3;
D_CLOCK=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<2;
D_CLOCK=0;
uint read2543(uchar port)
{
uint ad=0,i;
CLOCK=0;
_CS=0;
port<<=4;//通道号左移4位
for(i=0;i<12;i++)//没有设置控制字,默认输出数据为12位,高位先送出,输出数据的格式为2进制
{
if(D_OUT) ad|=0x01;//转换后的值高位先送出
#define uint unsigned int
uchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};//共阴极段码
uchar b[4];//存放4位要显示的数
sbit CLOCK=P2^7; /*2543时钟*/
sbit D_IN=P2^6; /*2543输入*/
while(EOC==0)//判断是否转换结束,EOC=0正在进行转换
{
OE=1;
}
shuju=P0;
shuju=shuju*1.0/255*500;//放大100倍
OE=0;
b[0]=a[shuju%10];//个位
b[1]=a[shuju%100/10];//十位
b[2]=a[shuju/100];//百位
{
ad=read2543(0);//从通道0输入
ad=ad*1.0/4096*500;//注意这一步不能写成ad=ad*500/4096
b[0]=a[ad%10];//个位
b[1]=a[ad%100/10];//十位
b[2]=a[ad/100];//百位
b[3]=a[ad/1000];//最高位始终为0
uchar c=0x01;
for(i=0;i<4;i++)
{
P1=(c<<i);
P3=b[i];
if(i==2)//显示小数点
P3=P3|0x80;
mdelay(1);
}
}
void main(void)
{
uint ad=0;
while(1)
{
ad=read2543(0);
ad=ad*1.0/4096*500;//
{
uint i;
uchar c=0x01;
for(i=0;i<4;i++)
{
P1=(c<<i);
P3=b[i];
if(i==2)//显示小数点
P3=P3|0x80;
mdelay(1);
}
}
void main(void)
{
uint shuju=0;
while(1)
{
START=1;
START=0;//下降沿启动转换信号
D_IN=(bit)(port&0x80);//通道值高位先送出
CLOCK=1;
delay(3);
CLOCK=0;
delay(3);
port<<=1;
ad<<=1;
}
_CS=1;
ad>>=1;//循环中多左移了一位
return ad;
}
void WaitIdle()
{
RS=0;
RW=1;
//_nop_();也可以不要
#define uchar unsigned char
#define uint unsigned int
uchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};//共阴极段码
uchar b[4];//存放4位要显示的数
sbit D_CLOCK=P2^7;
sbit D_OUT=P2^4; /*2543输出*/
sbit _CS=P2^5; /*2543片选*/
void mdelay(uint z)//1ms延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay(uchar n)
{
uchar i;
--
调用方式:uint Read2543(uchar port)
函数说明:port是采样的通道号0-----10
--------------------------------------------------------------------------------
-*/
//当前返回的测量值是上一次输入的结果。
uint read2543(uchar port)
{
uint ad=0,i;
CLOCK=0;
_CS=0;
port<<=4;//通道号左移4位
for(i=0;i<12;i++)//没有设置控制字,默认输出数据为12位,高位先送出,输出数据的格式为2进制
{
if(D_OUT) ad|=0x01;//转换后的值高位先送出
b[0]=a[ad%10];//个位
b[1]=a[ad%100/10];//十位
b[2]=a[ad/100];//百位
b[3]=a[ad/1000];//最高位始终为0
show();
}
}
附:功能与前例相同,但是读2543的函数不同
#include <reg51.h>
#include <intrins.h>
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/
//TI TLC2543 12位AD驱动程序,51晶振是11.0592MHz的。
/*------------------------------------------------------------------------------
{
uchar i;
for(i=0;i<n;i++)
{
_nop_();
}
}
/**************************************
名称:read2543
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/
D_CLOCK=0;
//参数设定开始
//注意:参数的设定只对下一周期的测量有效,对本次取样没有作用
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<7;
D_CLOCK=0; //选择12位的数据长度
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
E=1;
mdelay(5);
while((P0&0x80)==0x80)
0x6f};//共阴极段码
uchar b[4];//存放4位显示的数
sbit START=P2^4;
sbit OE=P2^6;
sbit EOC=P2^5;
void mdelay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void show(void)
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<1;
D_CLOCK=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp;
D_CLOCK=0;
D_CS=1;
return (uint)(mRetADHi*256+mRetADLo);
show();
}
}
Lesson6-4:TLC2543数字电压表,2路模拟输入,一路测量范围0~5V,一路量程0~10V,采用1602液晶显示,仿真通过。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
}
void show(void)//数码管显示子程序
{
uint i;
uchar c=0x01;
for(i=0;i<4;i++)
{
P1=(c<<i);
P3=b[i];
if(i==2)//显示小数点
P3=P3|0x80;
mdelay(1);
}
}
void main(void)
{
uint ad=0;
while(1)
uint read2543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
{
uchar mRetADHi,mRetADLo; //返回的测量值的高位、8低位
uchar mTemp;
D_CLOCK=0;
D_CS=0;
mRetADHi=0;
mRetADLo=0;
//把通道号(4位)打入2543 **代码虽然麻烦,但编译后的执行速度很快**
D_IN=(bit)(port&0x08);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<3;
D_CLOCK=0;
D_IN=(bit)(port&0x04);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<2;
sbit CLOCK=P2^7; /*2543时钟*/
sbit D_IN=P2^6; /*2543输入*/
sbit D_OUT=P2^4; /*2543输出*/
sbit _CS=P2^5; /*2543片选*/
sbit E=P3^4;
sbit RS=P3^5;
sbit RW=P3^6;
const uchar NoDisp=0;
sbit D_IN=P2^6;
sbit D_OUT=P2^4;
sbit D_CS=P2^5;
void mdelay(uint z)//1ms延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**************************************
const uchar NoCur=1;
const uchar CurNoFlash=2;
const uchar CurFlash=3;
void mdelay(uint z)//1ms延时子程序
{
ห้องสมุดไป่ตู้uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay(uchar n)//2543中的延时子程序
mRetADLo|=mTemp<<6;
D_CLOCK=0;
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<5;
D_CLOCK=0; //高位在前输出
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<4;
D_CLOCK=0;
D_IN=(bit)(port&0x02);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<1;
D_CLOCK=0;
D_IN=(bit)(port&0x01);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp;
for(i=0;i<n;i++)
{
_nop_();
}
}
/**************************************
名称:read2543
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/
Lesson6-4:ADC0808数字电压表,测量范围0~5V,仿真通过
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
b[3]=a[shuju/1000];//最高位始终为0
show();
}
}
Lesson6-4:TLC2543数字电压表,测量范围0~5V,1路模拟输入,采用4位数码管显示,仿真通过。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
D_IN=(bit)(port&0x80);//通道值高位先送出
CLOCK=1;
delay(3);
CLOCK=0;
delay(3);
port<<=1;
ad<<=1;
}
_CS=1;
ad>>=1;//循环中多左移了一位
return ad;
}
void show(void)//数码管显示子程序
{
uint i;
D_CLOCK=0; //单极性输出
//参数设定结束
D_CLOCK=1; //填充4个任意位
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<3;
D_CLOCK=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<2;
D_CLOCK=0;
uint read2543(uchar port)
{
uint ad=0,i;
CLOCK=0;
_CS=0;
port<<=4;//通道号左移4位
for(i=0;i<12;i++)//没有设置控制字,默认输出数据为12位,高位先送出,输出数据的格式为2进制
{
if(D_OUT) ad|=0x01;//转换后的值高位先送出
#define uint unsigned int
uchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};//共阴极段码
uchar b[4];//存放4位要显示的数
sbit CLOCK=P2^7; /*2543时钟*/
sbit D_IN=P2^6; /*2543输入*/
while(EOC==0)//判断是否转换结束,EOC=0正在进行转换
{
OE=1;
}
shuju=P0;
shuju=shuju*1.0/255*500;//放大100倍
OE=0;
b[0]=a[shuju%10];//个位
b[1]=a[shuju%100/10];//十位
b[2]=a[shuju/100];//百位
{
ad=read2543(0);//从通道0输入
ad=ad*1.0/4096*500;//注意这一步不能写成ad=ad*500/4096
b[0]=a[ad%10];//个位
b[1]=a[ad%100/10];//十位
b[2]=a[ad/100];//百位
b[3]=a[ad/1000];//最高位始终为0
uchar c=0x01;
for(i=0;i<4;i++)
{
P1=(c<<i);
P3=b[i];
if(i==2)//显示小数点
P3=P3|0x80;
mdelay(1);
}
}
void main(void)
{
uint ad=0;
while(1)
{
ad=read2543(0);
ad=ad*1.0/4096*500;//
{
uint i;
uchar c=0x01;
for(i=0;i<4;i++)
{
P1=(c<<i);
P3=b[i];
if(i==2)//显示小数点
P3=P3|0x80;
mdelay(1);
}
}
void main(void)
{
uint shuju=0;
while(1)
{
START=1;
START=0;//下降沿启动转换信号
D_IN=(bit)(port&0x80);//通道值高位先送出
CLOCK=1;
delay(3);
CLOCK=0;
delay(3);
port<<=1;
ad<<=1;
}
_CS=1;
ad>>=1;//循环中多左移了一位
return ad;
}
void WaitIdle()
{
RS=0;
RW=1;
//_nop_();也可以不要
#define uchar unsigned char
#define uint unsigned int
uchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};//共阴极段码
uchar b[4];//存放4位要显示的数
sbit D_CLOCK=P2^7;
sbit D_OUT=P2^4; /*2543输出*/
sbit _CS=P2^5; /*2543片选*/
void mdelay(uint z)//1ms延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay(uchar n)
{
uchar i;
--
调用方式:uint Read2543(uchar port)
函数说明:port是采样的通道号0-----10
--------------------------------------------------------------------------------
-*/
//当前返回的测量值是上一次输入的结果。
uint read2543(uchar port)
{
uint ad=0,i;
CLOCK=0;
_CS=0;
port<<=4;//通道号左移4位
for(i=0;i<12;i++)//没有设置控制字,默认输出数据为12位,高位先送出,输出数据的格式为2进制
{
if(D_OUT) ad|=0x01;//转换后的值高位先送出
b[0]=a[ad%10];//个位
b[1]=a[ad%100/10];//十位
b[2]=a[ad/100];//百位
b[3]=a[ad/1000];//最高位始终为0
show();
}
}
附:功能与前例相同,但是读2543的函数不同
#include <reg51.h>
#include <intrins.h>