51单片机入门学习 第十天

提示:今天是学习51单片机的第十天,以下就是今天的笔记(我买的是普中的开发板,学习笔记是根据普中的视频进行学习)今天学习的内容是ADC DAC。


目录

ADC 模数转换实验 

 1.ADC 介绍

1.1 ADC简介

1.2 ADC转换原理

2.XPT2046芯片介绍

3.硬件设计

4.软件设计

DAC 数模转换实验

1.DAC 介绍

1.1 DAC简介

1.2 DAC工作原理

 2.PWM介绍

 3.硬件设计

 4.软件设计


ADC 模数转换实验 

在前面了解都是对数字信号的操作也就是 0 和 1 操作,下面来学习如何检测外部模拟信号,因为我们使用的 STC89C5x 单片机内部不含 ADC 接口,所以需要外接一个 ADC 转换芯片将模拟信号转换成数字信号供单片机 处理。我们开发板上集成了一个 ADC 模数转换电路,选用的 ADC 芯片是 12 位的 AD 芯片-XPT2046。 内容如下:

  • 1.ADC 介绍
  • 2.XPT2046 芯片介绍
  • 3.硬件设计
  • 4.软件设计

 1.ADC 介绍

1.1 ADC简介

ADC(analog to digital converter)也称为模数转换器,是指一个将模拟 信号转变为数字信号。

(1)分辨率

(2)转换误差

(3)转换速率

1.2 ADC转换原理

AD 转换器(ADC)将模拟量转换为数字量通常要经过 4 个步骤:采样、保持、量化和编码

将采样电平(模拟值)转换为数字值时,主要有两类方法:直接比较型与间接比较型。

(1)逐次逼近型ADC

 (2)双积分型ADC

2.XPT2046芯片介绍

XPT2046 是一款 4 线制电阻式触摸屏控制器,内含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器。

主要特性

①工作电压范围为 1.5V~5.25V

②支持 1.5V~5.25V 的数字 I/O 口

③内建 2.5V 参考电压源

④电源电压测量( 0V~6V)

⑤内建结温测量功能

⑥触摸压力测量

⑦采用 3 线制 SPI 通信接口

⑧具有自动省电功能

 3.硬件设计

4.软件设计

实现的功能是:数码管上显示 AD 模块采集电位器的电压值。 

#include "xpt2046.h"
#include "intrins.h"
/********************************************************************
***********
* 函 数 名 : xpt2046_wirte_data
* 函数功能 : XPT2046 写数据
* 输 入 : dat:写入的数据
* 输 出 : 无
*********************************************************************
**********/
void xpt2046_wirte_data(u8 dat)
{
u8 i;
CLK = 0;
_nop_();
for(i=0;i<8;i++)//循环 8 次,每次传输一位,共一个字节
{
DIN = dat >> 7;//先传高位再传低位
dat <<= 1;//将低位移到高位
CLK = 1;//CLK 由低到高产生一个上升沿,从而写入数据
_nop_();
CLK = 0;
_nop_();
}
}
/********************************************************************
***********
* 函 数 名 : xpt2046_read_data
* 函数功能 : XPT2046 读数据
* 输 入 : 无
* 输 出 : XPT2046 返回 12 位数据
*********************************************************************
**********/
u16 xpt2046_read_data(void)
{
u8 i;
u16 dat=0;
CLK = 0;
_nop_();
for(i=0;i<12;i++)//循环 12 次,每次读取一位,大于一个字节数,所以返回值类型是 u16
{
dat <<= 1;
CLK = 1;
_nop_();
CLK = 0; //CLK 由高到低产生一个下降沿,从而读取数据
_nop_();
dat |= DOUT;//先读取高位,再读取低位。
}
return dat;
}
/********************************************************************
***********
* 函 数 名 : xpt2046_read_adc_value
* 函数功能 : XPT2046 读 AD 数据
* 输 入 : cmd:指令
* 输 出 : XPT2046 返回 AD 值
*********************************************************************
**********/
u16 xpt2046_read_adc_value(u8 cmd)
{
u8 i;
u16 adc_value=0;
CLK = 0;//先拉低时钟
CS = 0;//使能 XPT2046
xpt2046_wirte_data(cmd);//发送命令字
for(i=6; i>0; i--);//延时等待转换结果
CLK = 0;
_nop_();
CLK = 1;//发送一个时钟,清除 BUSY
_nop_();
adc_value=xpt2046_read_data();
CS = 1;//关闭 XPT2046
return adc_value;
}

 

DAC 数模转换实验

51 单片机输出模拟信号,要让 51 单片机输出模拟信号,同样 需要相应的转换器,这种转换器我们称之为 DAC 数模转换器,但 DAC 专用芯片价格是比较高的,在实际应用中通常使用 PWM 技术来模拟 DAC 输出。我们开发板上集成了一个 DAC(PWM)模块电路,通过单片机 IO 口生成 PWM 波来模拟 DAC 输出。内容如下:

  • 1.DAC 介绍
  • 2.PWM 介绍
  • 3.硬件设计
  • 4.软件设计
  • 1.DAC 介绍

1.1 DAC简介

DAC(Digital to analog converter)即数字模拟转换器,它可以将数字信号转换为模拟信号。

(1)分辨率

(2)线性度

(3)绝对精度和相对精度

(4)建立时间

1.2 DAC工作原理

DAC 输出电压计算公式:V0=Vref*z/256

  2.PWM介绍

 3.硬件设计

 

 4.软件设计

实现的功能是:DAC(PWM)模块上的指示灯 DA1 呈呼吸灯效果,由暗 变亮再由亮变暗。

#include "pwm.h"
//全局变量定义
u8 gtim_h=0;//保存定时器初值高 8 位
u8 gtim_l=0;//保存定时器初值低 8 位
u8 gduty=0;//保存 PWM 占空比
u8 gtim_scale=0;//保存 PWM 周期=定时器初值*tim_scale
/********************************************************************
***********
* 函 数 名 : pwm_init
* 函数功能 : PWM 初始化函数
* 输 入 : tim_h:定时器高 8 位
tim_l:定时器低 8 位
tim_scale:PWM 周期倍数:定时器初值*tim_scale
duty:PWM 占空比(要小于等于 tim_scale)
* 输 出 : 无
*********************************************************************
**********/
void pwm_init(u8 tim_h,u8 tim_l,u16 tim_scale,u8 duty)
{
gtim_h=tim_h;//将传入的初值保存在全局变量中,方便中断函数继续调用
gtim_l=tim_l;
gduty=duty;
gtim_scale=tim_scale;
TMOD|=0X01; //选择为定时器 0 模式,工作方式 1
TH0 = gtim_h; //定时初值设置
TL0 = gtim_l;
ET0=1;//打开定时器 0 中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/********************************************************************
***********
* 函 数 名 : pwm_set_duty_cycle
* 函数功能 : PWM 设置占空比
* 输 入 : duty:PWM 占空比(要小于等于 tim_scale)
* 输 出 : 无
*********************************************************************
**********/
void pwm_set_duty_cycle(u8 duty)
{
gduty=duty;
}
void pwm(void) interrupt 1 //定时器 0 中断函数
{
static u16 time=0;
TH0 = gtim_h; //定时初值设置
TL0 = gtim_l;
time++;
if(time>=gtim_scale)//PWM 周期=定时器初值*gtim_scale,重新开始计数
time=0;
if(time<=gduty)//占空比
PWM=1;
else
PWM=0;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值