1 实物与模型
(1)为什么DO和DI引脚连在一个引脚上?
由于ADC0832在通信时并不是会同时使用DO和DI端口,并且DO和DI端口与单片机的接口是双向的,所以在设计电路中可以用一根线将DO端和DI端连接到一起。
(2)ADC0832的外部连接采用SPI总线结构,这样便把它的连接方式与其他设备统一起来了。ADC0832采用同步串行传输,同步是通过时钟线进行数据同步;串行传输通过DO 数据口一位一位传输数据。
2 实验原理
3 系统设计
传统的51单片机没有配置SPI,但是可以利用其并行接口线模拟SPI串行总线时序,以实现与SPI的器件连接。
4 软件设计
1 ADC0832模数转换函数(结合ADC时序图)
#ifndef __ADC0832_H__
#define __ADC0832_H__
#include #include sbit ADC0832_CS_N = P1^0; sbit ADC0832_CLK = P1^1; sbit ADC0832_DI = P1^2; sbit ADC0832_DO = P1^2; void ADC0832_Init(void); unsigned char ADC0832_Conv(void); #endif #include 'ADC0832.h' //ADC0832初始化 void ADC0832_Init(void) { ADC0832_CS_N = 1; ADC0832_CLK = 0; ADC0832_DI = 1; } unsigned char ADC0832_Conv(void) { unsigned char adc_result1 = 0; //用来接收第一组数据 unsigned char adc_result2 = 0; //用来接收第二组数据 unsigned char i; //时序1,先将CS使能端置于低电平并且保持低电平直到转换完全结束 ADC0832_CS_N = 0; ADC0832_CLK = 0; //时序2,由MCU向ADC0832时钟输入端CLK输入时钟脉冲,DO/DI端使用DI端输入通道功能选择的数据信号 //在第1个时钟脉冲的下降沿之前DI端必须是高电平,表示启动信号 ADC0832_DI = 1; //START BIT,启动信号 _nop_(); ADC0832_CLK = 1; //第一个脉冲 _nop_(); ADC0832_CLK = 0; //在第2、3个脉冲下降沿之前DI应输入2位数据用于选择通道功能 ADC0832_DI = 1; //单通道输入 _nop_(); ADC0832_CLK = 1; //第二个脉冲 _nop_(); ADC0832_CLK = 0; ADC0832_DI = 0; //选择CH0作为模拟信号输入端 _nop_(); ADC0832_CLK = 1; //第三个脉冲 _nop_(); ADC0832_CLK = 0; /*时序3,从第4个脉冲开始由DO输出转换数据最高位, 随后每个脉冲下降沿DO输出下一位数据, 直到第11个脉冲时发出最低位数据,一个字节的数据输出完成*/ ADC0832_DI = 1; //数据线拉高,主机准备读数据,高位在前 for(i=0;i<8;i++) { ADC0832_CLK = 1; _nop_(); ADC0832_CLK = 0; //CLK下降沿 adc_result1 = adc_result1 << 1; //左移,0000_0001 if(ADC0832_DO==1) adc_result1 = adc_result1 | 0x01; } /*时序4,随后输出8个位数,与前面数据顺序相反, 同时第11个脉冲的下降沿输出DATA0,到第19个脉冲时输出完成DATA7*/ for(i=0;i<8;i++) { adc_result2 = adc_result2 >> 1; //右移,1000_000 if(ADC0832_DO==1) adc_result2 = adc_result2 | 0x80; ADC0832_CLK = 1; _nop_(); ADC0832_CLK = 0; } //时序5 一次AD转换结束 ADC0832_CS_N = 1; ADC0832_CLK = 1; ADC0832_DI = 0; return (adc_result1 == adc_result2)? adc_result1:0; } 2 数码管动态显示函数 #ifndef __DisplaySmg_H__ #define __DisplaySmg_H__ #include #define GPIO_SEG P0 //段选端 #define GPIO_SEL P2 //位选端 extern unsigned char LedBuf[]; //外部变量声明 extern unsigned char DotDig0,DotDig1,DotDig2,DotDig3; void DisplaySmg(void); #endif #include 'DisplaySmg.h' unsigned char code LedData[]={ //共阴型数码管的段码表,字符,序号 0x3F, //'0',0 0x06, //'1',1 0x5B, //'2',2 0x4F, //'3',3 0x66, //'4',4 0x6D, //'5',5 0x7D, //'6',6 0x07, //'7',7 0x7F, //'8',8 0x6F, //'9',9 0x77, //'A',10 0x7C, //'B',11 0x39, //'C',12 0x5E, //'D',13 0x79, //'E',14 0x71, //'F',15 0x76, //'H',16 0x38, //'L',17 0x37, //'n',18 0x3E, //'u',19 0x73, //'P',20 0x5C, //'o',21 0x40, //'-',22 0x00, //熄灭 23 }; unsigned char DotDig0=0,DotDig1=0,DotDig2=0,DotDig3=0; //小数点控制位 unsigned char code LedAddr[]={0xfe,0xfd,0xfb,0xf7}; //数码管位选 unsigned char LedBuf[]={22,22,22,22}; //显示缓存区 void DisplaySmg() //四位数码管,考虑小数点 { unsigned char i; //等价于 'static unsigned char i = 0;' unsigned char temp; switch(i) { case 0: { GPIO_SEG = 0x00; //消影 if(DotDig0==1) //小数点 { temp = LedData[LedBuf[0]] | 0x80; //点亮小数点 } else { temp = LedData[LedBuf[0]]; } GPIO_SEG = temp; //段码 GPIO_SEL = LedAddr[0]; //位选 i++; break; } case 1: GPIO_SEG = 0x00; if(DotDig1==1) //小数点 { temp = LedData[LedBuf[1]] | 0x80; } else { temp = LedData[LedBuf[1]]; } GPIO_SEG = temp; GPIO_SEL = LedAddr[1]; i++; break; case 2: GPIO_SEG = 0x00; if(DotDig2==1) //小数点 { temp = LedData[LedBuf[2]] | 0x80; } else { temp = LedData[LedBuf[2]]; } GPIO_SEG = temp; GPIO_SEL = LedAddr[2]; i++; break; case 3: GPIO_SEG = 0x00; if(DotDig3==1) //小数点 { temp = LedData[LedBuf[3]] | 0x80; } else { temp = LedData[LedBuf[3]]; } GPIO_SEG = temp; GPIO_SEL = LedAddr[3];
上一篇:【51单片机】I/O口
下一篇:简易数字电压表+ADC0809+程序查询方式实现8路数据转换
推荐阅读最新更新时间:2024-11-03 10:55
设计资源 培训 开发板 精华推荐
- LTM4624 的典型应用 - 14VIN、4A 降压型 DC/DC 模块稳压器
- LT1372CS8 低纹波 5V 至 -3V Cuk 转换器的典型应用
- EVAL-ADF7021-NDB9Z,基于 ADF7021-N 169 MHz ISM 频段收发器的子板
- BM1P061FJ PWM AC/DC转换器应用电路
- 2相单极步进电机驱动IC —— TB67S142NG
- STM32f411 system
- DC710A,使用 LTC5531ES6、300MHz 至 7000MHz 射频功率检测器的演示板
- LTC1876 的典型应用 - 高效率、两相、双通道同步降压型开关控制器和升压型稳压器
- 使用 LT3045IMSE 超低 1/f 噪声基准缓冲器的典型应用
- UC3844B 7W 离线反激式稳压器的典型应用