您好,欢迎来到宝玛科技网。
搜索
您的当前位置:首页AD例程序

AD例程序

来源:宝玛科技网


http://www.zidh.com/mcu/DLmcu/mcu51Pro/201206/9774.html

/******************************************************************** * 文件名 : PCF8591TAD实验.c

* 描述 : 该程序实现了用PCF8591T同时采集4路AD输入的功能。 在1602上会分别显示两个精密可调电阻分压的值。 和光敏电阻和热敏电阻的电压值。

大家可以调节精密可调电阻,或者挡住光敏电阻的光,或者手接触温敏电阻, 数码管上显示的AD采集值都会有相应的变化。 * 创建人 : 东流,2012年2月7日 * 程序类别: ATS52-单片机程序系列

* 发 布: 中国自动化资讯网 http://www.zidh.com * 网站邮箱: E-mail:zidh.com@163.com * 版本号 : 2.0

* 版权声明: 转载请注明 作者 和 出处

* 杜邦线接法:用8针排线把P0口和J12的1-8连接(P0.0接J12的1端)。

用8针排线把P2口和J13的1-8连接(P2.7接J13的1端)。 //注意这里是P2.7 P3.6接J26的6端,P3.7接J26的7端。 J26的1--4分别接J23的1--4端。

***********************************************************************************/

#include #include #include

#define uchar unsigned char #define uint unsigned int

#define ADDR 0x90 //PCF8591 地址

// 此表为 LED 的字模 // 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20) unsigned char code Disp_Tab[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x88,0x83,0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff, 0xf7 };

unsigned char TABLEW[8] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char AD_CHANNEL; unsigned char LedOut[8]; unsigned int D[32];

//这三个引脚参考资料

sbit E=P2^7; //1602使能引脚 sbit RW=P2^6; //1602读写引脚

sbit RS=P2^5; //1602数据/命令选择引脚

/******************************************************************** * 名称 : delay()

* 功能 : 延时,延时时间大概为5US。 * 输入 : 无 * 输出 : 无

***********************************************************************/ void delay() {

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }

void Delay(uint i) {

uint x,j;

for(j=0;jfor(x=0;x<=148;x++); }

/******************************************************************** * 名称 : bit Busy(void)

* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态 * 输入 : 输入的命令值 * 输出 : 无

***********************************************************************/ bit Busy(void) {

bit busy_flag = 0; RS = 0; RW = 1; E = 1; delay();

busy_flag = (bit)(P0 & 0x80); E = 0;

return busy_flag; }

/******************************************************************** * 名称 : wcmd(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无

***********************************************************************/ void wcmd(uchar del) {

while(Busy());

RS = 0; RW = 0; E = 0; delay(); P0 = del; delay(); E = 1; delay(); E = 0; }

/******************************************************************** * 名称 : wdata(uchar del) * 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据 * 输出 : 无

***********************************************************************/ void wdata(uchar del) {

while(Busy()); RS = 1; RW = 0; E = 0; delay(); P0 = del; delay(); E = 1; delay(); E = 0; }

/******************************************************************** * 名称 : L1602_init()

* 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无

***********************************************************************/ void L1602_init(void) {

wcmd(0x38); Delay(5); wcmd(0x38); Delay(5); wcmd(0x38); Delay(5); wcmd(0x38);

wcmd(0x08); wcmd(0x0c); wcmd(0x04); wcmd(0x01); }

/******************************************************************** * 名称 : L1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示\"b\" ,调用该函数如下 L1602_char(1,5,'b')

* 输入 : 行,列,需要输入1602的数据 * 输出 : 无

***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign) {

uchar a;

if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; wcmd(a); wdata(sign); }

/******************************************************************** * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示\"ab cd ef\" ,调用该函数如下

L1602_string(1,5,\"ab cd ef;\")

* 输入 : 行,列,需要输入1602的数据 * 输出 : 无

***********************************************************************/ void L1602_string(uchar hang,uchar lie,uchar *p) {

uchar a,b=0;

if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; while(1) {

wcmd(a++);

if((*p == '\\0')||(b==16)) break; b++;

wdata(*p); p++; } }

/******************************************************************** * 名称 : Delay_1ms()

* 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x (延时一毫秒的个数) * 输出 : 无

***********************************************************************/ void Delay_1ms(unsigned char i)//1ms延时 {

unsigned char x,j; for(j=0;jfor(x=0;x<=148;x++); }

/******************************************************************* DAC 变换, 转化函数

*******************************************************************/ bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val) {

Start_I2c(); //启动总线

SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(c); &n

文章来源:中国自动化资讯网|郴州机电网 www.ZIDH.com bsp; //发送控制字节 if(ack==0)return(0);

SendByte(Val); //发送DAC的数值 if(ack==0)return(0);

Stop_I2c(); //结束总线 return(1); }

/******************************************************************* ADC发送字节[命令]数据函数

*******************************************************************/ bit ISendByte(unsigned char sla,unsigned char c) {

Start_I2c(); //启动总线

SendByte(sla); //发送器件地址 if(ack==0)return(0);

SendByte(c); //发送数据 if(ack==0)return(0);

Stop_I2c(); //结束总线 return(1); }

/******************************************************************* ADC读字节数据函数

*******************************************************************/ unsigned char IRcvByte(unsigned char sla) { unsigned char c;

Start_I2c(); //启动总线

SendByte(sla+1); //发送器件地址 if(ack==0)return(0);

c=RcvByte(); //读取数据0 Ack_I2c(1); //发送非就答位 Stop_I2c(); //结束总线 return(c); }

//******************************************************************/ main() {

Delay(30); L1602_init(); while(1)

{/********以下AD-DA处理*************/ switch(AD_CHANNEL) {

case 0: ISendByte(ADDR,0x41);

D[0]=IRcvByte(ADDR)*2; //ADC0 模数转换1 break;

case 1: ISendByte(ADDR,0x42);

D[1]=IRcvByte(ADDR)*2; //ADC1 模数转换2 break;

case 2: ISendByte(ADDR,0x43);

D[2]=IRcvByte(ADDR)*2; //ADC2 模数转换3 break;

case 3: ISendByte(ADDR,0x40);

D[3]=IRcvByte(ADDR)*2; //ADC3 模数转换4 break;

case 4: DACconversion(ADDR,0x40, D[4]/4); //DAC 数模转换 break; }

if(++AD_CHANNEL>4) AD_CHANNEL=0; L1602_char(1,1,'1'); L1602_char(1,2,':');

L1602_char(1,3,D[0]%1000/100+48); L1602_char(1,4,'.');

L1602_char(1,5,D[0]%100/10+48); L1602_char(1,6,D[0]%10+48); L1602_char(1,9,'2');

L1602_char(1,10,':');

L1602_char(1,11,D[1]%1000/100+48); L1602_char(1,12,'.');

L1602_char(1,13,D[1]%100/10+48); L1602_char(1,14,D[1]%10+48); L1602_char(2,1,'3'); L1602_char(2,2,':');

L1602_char(2,3,D[2]%1000/100+48); L1602_char(2,4,'.');

L1602_char(2,5,D[2]%100/10+48); L1602_char(2,6,D[2]%10+48); L1602_char(2,9,'4'); L1602_char(2,10,':');

L1602_char(2,11,D[3]%1000/100+48); L1602_char(2,12,'.');

L1602_char(2,13,D[3]%100/10+48); L1602_char(2,14,D[3]%10+48); } }

/*************************此部分为74HC595的驱动程序使用SPI总线连接*************************************/ #include #include

#define NOP() _nop_() /* 定义空指令 */ #define _Nop() _nop_() /*定义空指令*/ //SPI IO

sbit MOSIO =P1^5; sbit R_CLK =P1^6; sbit S_CLK =P1^7; sbit OE =P3^6;

void HC595SendData(unsigned int SendVal);

/********************************************************************************************************* ** 函数名称: HC595SendData

** 功能描述: 向SPI总线发送数据

** 管脚描述:请参考相关的芯片资料(学习光盘中以配)

*********************************************************************************************************/

void HC595SendData(unsigned int SendVal)

{

unsigned char i;

for(i=0;i<16;i++) {

if((SendVal<S_CLK=0; NOP(); NOP(); S_CLK=1; }

R_CLK=0; //set dataline low NOP(); NOP();

R_CLK=1; //片选 OE=0; }

/*************************此部分为I2C总线的驱动*************************************/ #include #include #include

#define NOP() _nop_() /* 定义空指令 */ #define _Nop() _nop_() /*定义空指令*/

sbit SDA=P3^6; //I2C 数据 sbit SCL=P3^7; //I2C 时钟 bit ack; /*应答标志位*/

/******************************************************************* 起动总线函数 函数原型: void Start_I2c();

功能: 启动I2C总线,即发送I2C起始条件.

********************************************************************/ void Start_I2c() {

SDA=1; /*发送起始条件的数据信号*/

程序

_Nop(); SCL=1;

_Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop();

SDA=0; /*发送起始信号*/

_Nop(); /* 起始条件锁定时间大于4μs*/ _Nop(); _Nop(); _Nop();

_Nop();

SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop(); }

/******************************************************************* 结束总线函数 函数原型: void Stop_I2c();

功能: 结束I2C总线,即发送I2C结束条件.

********************************************************************/ void Stop_I2c() {

SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop();

SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); }

/******************************************************************* 字节数据发送函数 函数原型: void SendByte(UCHAR c);

功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0)

发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

********************************************************************/ void SendByte(unsigned char c) {

unsigned char BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ {

if((c<SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ _Nop();

_Nop(); /*保证时钟高电平周期大于4μs*/ _Nop(); _Nop();

_Nop(); SCL=0; }

_Nop(); _Nop();

SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop();

if(SDA==1)ack=0;

else ack=1; /*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop(); }

/******************************************************************* 字节数据接收函数 函数原型: UCHAR RcvByte();

功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。

********************************************************************/ unsigned char RcvByte() {

unsigned char retc; unsigned char BitCnt;

retc=0;

SDA=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt<8;BitCnt++) {

_Nop();

SCL=0; /*置时钟线为低,准备接收数据位*/ _Nop();

_Nop(); /*时钟低电平周期大于4.7μs*/ _Nop(); _Nop(); _Nop();

SCL=1; /*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop();

retc=retc<<1;

if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */ _Nop(); _Nop(); }

SCL=0; _Nop(); _Nop(); return(retc); }

/******************************************************************** 应答子函数 函数原型: void Ack_I2c(bit a);

功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/ void Ack_I2c(bit a) {

if(a==0)SDA=0; /*在此发出应答或非应答信号 */ else SDA=1; _Nop(); _Nop();

_Nop(); SCL=1; _Nop();

_Nop(); /*时钟低电平周期大于4μs*/ _Nop(); _Nop(); _Nop();

SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _Nop(); _Nop(); }

文章来源:中国自动化资讯网|郴州机电网 www.ZIDH.com

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baomayou.com 版权所有 赣ICP备2024042794号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务