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总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。