STC89C52RC的AD7705读写实验(软件SPI)
本代码段基于AD7705/TM7705 中文参考手册编写,采用软件SPI方式读写,其中引脚连接为:
AD7705->单片机
GND------->GND
VCC------->VCC
RST不接
CS------->P1^4
SCK----->P1^0
DN------->P1^1
DOUT--->P1^2
DRDY--->P1^3
主函数代码:
#include <REGX52.H>
#include "my_spi.h"
#include "my_7705.h"
//#include "my_iic.h"
#include "my_uart.h"
#include "stdio.h"#define uint16_t unsigned short int
#define uint8_t unsigned charvoid Delay_ms(int time)
{int i=0;for (;time>0;time--){for (;i<11000;i++);}
}void main()
{uint8_t Data[10]={0x01,0x02,0x03,0x04,0x05};float ad7705_data=0;My_UART_Init();printf("Serial Init Complete\n");ad7705_init();printf("AD7705 Init Complete\n");while (1){ad7705_data=get_7705_data()*5.0/0xffff;printf("%f\n",ad7705_data);}
}
串口部分代码:(my_uart.h),包含重定向printf();
#include "regx52.h"#define uint8_t unsigned charvoid My_UART_Init(void);
void Serial_Send_1Byte(unsigned char Str);
void Serial_Print(unsigned char *Data);
void Serial_Print_Float(float Num);
串口部分代码:接收部分还未测试,仅供参考(my_uart.c)
#include "my_uart.h"
#include "string.h"
#include "stdio.h"uint8_t RxBuf[10]={0};
uint8_t Rx_Cnt=0;
uint8_t TEST_Num=66;void My_UART_Init(void)
{SCON=0X50; //设置为工作方式1 ,既然是方式一,自然要确定波特率,设置定时器1TMOD=0X20; //8位重装载PCON=0X00;TH1=0xfd; //波特率9600TL1=0Xfd;ES=1; //打开通信中断EA=1; //打开总中断TR1=1; //打开计数器
}void Serial_Send_1Byte(unsigned char str)
{ES=0;SBUF=str;while(!TI);//TI等于1,表示数据发送完成TI=0;ES=1;
}void Serial_Print(unsigned char *Data)
{while (*Data!='\0'){Serial_Send_1Byte(*Data++);}
}char putchar (unsigned char Data)
{Serial_Send_1Byte(Data);return Data;
}void Serial_Print_Float(float Num)
{char String_temp[21]={0};sprintf(String_temp,"%f",Num);printf("%s",String_temp);
}void Serial_INT(void) interrupt 4
{if (TI){TI=0;}else if (RI){*RxBuf=SBUF;printf("Rx is %s\t",RxBuf);printf("Rx_Cnt is %c\n",TEST_Num);if (Rx_Cnt==10){Rx_Cnt=0;memset(RxBuf,0,10);}RI=0;}
}
软件SPI驱动:(my_spi.h)
#include <REGX52.H>#define uint16_t unsigned short int
#define uint8_t unsigned charsbit SCLK=P1^0;
sbit MOSI=P1^1;
sbit MISO=P1^2;#define DATA_0 (MOSI=0)
#define DATA_1 (MOSI=1)#define SCLK_0 (SCLK=0)
#define SCLK_1 (SCLK=1)//#define uint8_t unsigned charvoid SPI_Write_Byte(uint8_t Data);
void SPI_Write(uint8_t *Data,uint8_t length);uint8_t SPI_ReadWrite_Byte(uint8_t Data);
软件SPI驱动:(my_spi.c)
#include <REGX52.H>#include "my_spi.h"void SPI_Delay(void)
{int i,j;for (i=0;i<1;i++){for (j=0;j<24;j++);}
}
static SPI_Send(uint8_t Data)
{int i=0;#ifdef SPI_DEBUGMISO=0;#endiffor (i=8;i>0;i--){SCLK_0;if (Data&0x80)DATA_1;elseDATA_0;SCLK_1;Data=Data<<1;}DATA_1;
}/*软件SPI*/
void SPI_Write_Byte(uint8_t Data)
{SPI_Send(Data);
}void SPI_Write(uint8_t *Data,uint8_t length)
{while (length--){SPI_Send(*Data++);}
}uint8_t SPI_ReadWrite_Byte(uint8_t Data)
{uint8_t i=0;uint8_t Data_Temp=0;for (i=0;i<8;i++){SCLK_0;if (Data&0x80)DATA_1;elseDATA_0;if (MISO==1)Data_Temp|=1;SCLK_1;Data_Temp=Data_Temp<<1;Data=Data<<1;}DATA_1;return Data_Temp;
}
AD7705驱动:(my_7705.h)
#include "REGX52.h"sbit DRDY=P1^3;
sbit AD_CS=P1^4;#define AD_ON (AD_CS=0)
#define AD_OFF (AD_CS=1)#define uint16_t unsigned short int
#define uint8_t unsigned charvoid ad7705_init(void);uint16_t get_7705_data(void);
AD7705驱动:(my_7705.c)
#include "my_7705.h"
#include "my_spi.h"
#include "REGx52.h"void ad7705_init(void)
{AD_ON;SPI_Write_Byte(0x20);SPI_Write_Byte(0x0c);SPI_Write_Byte(0x10);SPI_Write_Byte(0x40);AD_OFF;
}uint16_t get_7705_data(void)
{uint8_t Data_L=0,Data_H=0;uint16_t Sum=0;AD_ON;while (DRDY==1);SPI_Write_Byte(0x38);Data_H=SPI_ReadWrite_Byte(0xff);Data_L=SPI_ReadWrite_Byte(0xff);Sum=Data_H<<8|Data_L;AD_OFF;return Sum;
}
测试部分:
通道1 0V电压 测试:
通道1 5V电压测试:
转换公式:(16BitAD 满量程输出为0xFFFF(2^16))
VCC为5V
串口输出:
Arduino 串口绘图输出:
STC89C52RC的AD7705读写实验(软件SPI)相关推荐
- SD卡读写实验(SPI模式)
对于 SD 卡的 SPI 模式而言,采用的 SPI 的通信模式为模式 3,即 CPOL=1,CPHA=1,在 SD 卡 2.0 版 本协议中,SPI_CLK 时钟频率可达 50Mhz. SD 卡的 S ...
- PCM开发板模块实验指导--SPI读写PSRAM64实验
模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762 32---SPI读写PSRAM64实验实验: ...
- [学习笔记]STM32F1软件SPI读写W25Qx(寄存器、标准库、HAL库)
目录 9. 软件SPI读写W25Qx 0. 博主调侃: 1. 实验内容及步骤: 2. 硬件说明 3. 步骤详细讲解 3.1 配置GPIO 3.2 软件SPI读写Byte(模式0或模式3) 3.3 读取 ...
- STM-32:SPI通信协议/W25Q64简介—软件SPI读写W25Q64
目录 一.SPI简介 1.1电路模式 1.2通信原理 1.3SPI时序基本单元 1.3.1起始和终止 1.3.2交换字节 二.W25Q64 2.1W25Q64简介 2.2W25Q64硬件电路 2.3W ...
- stm32Cubemx实用篇(四):SD卡读写实验
stm32Cubemx实用篇(四):SD卡读写实验 本章将介绍使用stm32Cubemx软件配置SD卡读写.并通过串口打印出相应信息. 硬件平台:Stm32H743IIT6 +16GB TF卡 软件: ...
- GD32F303调试小记(二)之SPI(软件SPI、硬件SPI、硬件SPI+DMA)
前言 目前有一个项目中用到了TFT-LCD,其驱动芯片为ILI9341.为更好的达到显示效果,在最终的代码中我们会使用单片机自带的硬件SPI+DMA模块(由于调试过程中SPI+DMA输出的波形没能驱屏 ...
- 软件SPI ADS8684/ADS8688驱动程序
使用 利用ADS8688采集互感器电压信号,使用软件SPI. 硬件电路 模拟信号输入 ADS8688外围电路 变量及宏定义 //位带操作#define BITBAND(addr, bitnum) (( ...
- 联盛德 HLK-W806 (九): 软件SPI和硬件SPI驱动ST7789V液晶LCD
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- 【51单片机快速入门指南】5:软件SPI
目录 硬知识 SPI协议简介 SPI接口介绍 SPI接口连接图 SPI数据传输方向 SPI传输模式 软件SPI程序源码 Soft_SPI.c Soft_SPI.h 普中51-单核-A2 STC89C5 ...
- 基于matlab的传热学虚拟实验开发,基于MATLAB的传热学课程虚拟实验软件的开发
215教育现代化·2018 年 12 月第 49 期 教育信息技术 基于 MATLAB 的传热学课程虚拟实验软件的开发 周永利,李友荣,石万元,张力元,杨晨,卞煜,王国强,李俊,包键 ( 重庆大学 低 ...
最新文章
- BZOJ 2592 随机化(伪)
- linux运维实战练习
- 敏捷开发回顾:使团队更强大pdf
- java课堂作业(一)
- 前端自适应----单位rem
- SpringMVC_Controller注解与RequestMapping
- RHEL6基础之一系统内核Kernel与GNU计划及Linux发行版本
- PHP的静态变量和引用函数
- MAC 电脑里面的“其他”文件是什么占用了
- 某大型银行某系统性能调优过程跟踪记录
- 分解质因数(包括证明的详解)
- paip.c语言gtk开发环境CodeBlocks /QT建立最佳实践
- matlab三边定位算法,利用matlab分别对三边测量定位算法和改进算法进行仿真和验证...
- 进程杀手 (prockiller)V2.82绿色版
- 戴尔笔记本win10系统迁移到新固态硬盘
- Linux下U盘变成只读
- python学习之 利用蒙特卡洛方法计算PI值
- 老破旧ThinkPad机器装Win7
- 个性化推荐十大挑战精选
- cocos2dx系列--颜色混合BlendFunc