第五次硬件培训

1.ADC转换

概念

ADC是一个将模拟量(连续的,可用一条线表示的,如水泵的出水量,电压值)转化为数字量(离散的,非连续的,如高电平,低电平)
假定需要把0-1V的模拟电压信号转换成三位二进制代码,这时便可以取△=(1/8)V,并规定凡数值在0-(1/8)V之间的模拟电压都当做0X△看待,用二进制的000表示:凡数值在((1/8)~(2/8)V之间的模拟电压都当做1X△看待,用二进制的001表示,最大的量化误差可达△,即(1/8)V。

XPT2046

在这里插入图片描述

在C51单片机中使用XPT2046作为ADC转换模块,其最高可达12位转换分辨率,即当转换1V的电压位数字量时,误差不会超过1/2^12V
在C51中可以将电位器,热敏电阻的阻值,光敏电阻的阻值,或自己外接的模拟量转换为数字量,并使用SPI协议通信与其通信
在这里插入图片描述
使用XPT2046的单端输入方式和12位ADC寄存器对其进行配置,其中我们使用AIN0通道

int Read_AD_Data(uchar cmd)
{
	char i;
	int AD_Value;
	CLK = 0;
	CS  = 0;
	SPI_Write(0xB4);
	for(i=6; i>0; i--); 	//延时等待转换结果
	CLK = 1;	  //发送一个时钟周期,清除BUSY
	_nop_();	  //空语句,为一个机器周期=12个时钟周期,确保被检测到:1us	
	_nop_();    //
	CLK = 0;
	_nop_();
	_nop_();
	AD_Value=SPI_Read();
	CS = 1;
	return AD_Value;	
}

SPI通信

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议
我们通常使用这种通信协议来配置芯片的各种模式,如之前的XPT2046就给其传输0XB4来对其的模式进行配置

SPI时序

在这里插入图片描述

CS:片选位:开始时拉低,停止时拉高
CLK:空闲时为低,上升沿采集数据(第一个跳变沿)
与iic不同的是,它没有应答位,这个是它的一个缺点

因为C51没有硬件接口,故我们使用软件模拟SPI和XPT2046通信,为了移植方便,我们也通常使用软件模拟来对其进行模拟,在一些其他有硬件接口的单片机上,我们可以通过改变极性来配置SPI

void SPI_Write(char dat)
{
	uchar i;
	CLK = 0;
	for(i=0; i<8; i++)//2个字节,占8位
	{
		DIN = dat >> 7;  	//放置最高位
		dat <<= 1;
		CLK = 0;		//上升沿发送数据
				//不会产生应答              
		CLK = 1;

	}
}//先放置再发送,注意顺序
int SPI_Read(void)
{
	uint i, dat=0;
	CLK = 0;
	for(i=0; i<12; i++)//接收12位数据
	{
		dat <<= 1;//接收最低位
		CLK = 1;
		CLK = 0;
		dat |= DOUT;

	}
	return dat;	
}

通过上述代码可以实现通过SPI协议进行发送和接收。

2.DAC转换

在这里插入图片描述

Vref为参考电压,通常我们是接在系统电源上,即5V,8个开关表示DAC精度为8位每流过一个R,电流少一半
V0=I01*Rfb
通过读取D0-D7和基准电压VREF来完成从数字量到模拟量的转变

因为硬件电路较为复杂,处于成本考虑,我们通常使用PWM来模拟DAC输出
例如在51单片机中,高电平为5v,低电平为0v,若我想输出一个1.5V的电压,我可在10ms中进行占空比的调节,前3ms为高,后7ms为低,这一个周期的有效值即为1.5v
在这里插入图片描述


```c
void main()
{	
	char DIR;
	Timer1Init();  //定时器1初始化
	while(1)
	{
		if(count>100)							
		{  
			count=0;
			if(DIR==1)					   //DIR控制增加或减小
			{
			  value++;
			}			
			if(DIR==0)
			{
			  value--;
			}
				
		}

		if(value==1000)//周期为1000
		{
		  DIR=0;
		}
		if(value==0)
		{
		  DIR=1;
		}	
				
		if(timer1>1000)  
		{
			timer1=0;
		}
		if(timer1 <value)	
		{
			PWM=1;
		}
		else
		{
			PWM=0;
		}		
	}		
}

通过对定时器的初始化而完成PWM波的输出

3.串口通信复习

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置流程
1.配置串口模式
2.配置定时器1来设置波特率
3.开启串口中断、定时器中断、总中断
在这里插入图片描述

4.IIC总线通信

一.什么是IIC
IIC是集成电路总线,IIC总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。
在这里插入图片描述
每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值