DA或AD转换及在51单片机的应用
ADC(模数转换):
AD简介
模拟信号转化数字信号,模拟信号是表示变化的连续信号,而数字信号是一种零散的信号用正零或正负电压表示1.0来传输数据,如果要使两者转换,需要把模拟信号采样->量化——>编码;
- 先说量化将模拟信号在一个周期经行采样,这样就得到了在不同时间变化的模拟信号的数值。
- 要对这信号经行量化用比较器测量出每一时刻的电压值这样就把连续的模拟信号量用数字型号表示出来了此时转化出的电压图是趋近模拟信号的阶梯型,只要提高测量精度和测量周期就能模拟出无限接近与原信号的数值
- 但现在计算机还不知道具体数值就需要进一步把量化的数值经行编码让计算机认识这一信号。
在51单片机的运用
- 在现在的51单片机的开发板上已经集成了adc模块(市面上也用很多ad转换的模块)只要学会运用即可:我买的开发板是一块用在电阻屏的XPT2046芯片可以读出x-x+y-y+四个接口的电阻值
代码部分
- XPT2046.c
#include <REGX52.H>
#define uchar unsigned char //宏定义uchar
#define uint unsigned int //宏定义uint
//引脚定义具体根据实际情况而定
sbit CS=P3^5;
sbit DCLK=P3^6;
sbit DIN=P3^4;
sbit DOUT=P3^7;
/**
* @brief 读取XPT转换的数字信号
* @param 需要读取的引脚的指令
* @retval 转化的数字信号
*/
uint XPT2046_ReadAD(uchar command)
{
uchar i;
//用于存储转化数据
uint ADVAlue=0;
DCLK=0;
CS=0;
//将指令发送给XTP2046
for(i=0;i<8;i++){
DIN=command&(0x80>>i);
DCLK=1;
DCLK=0;
}
//接受数据并将数据储存在ADVAlue
for(i=0;i<16;i++){
DCLK=1;
DCLK=0;
if(DOUT){ADVAlue|=(0x8000>>i);}
}
CS=1;
//将读取数据经行去杂,XPT2046传输12位数据后用零补位这里希望用一个char类型接受就直接向右进了8位。
return ADVAlue>>8;
}
- XPT2046.h
#ifndef __XPT2046_H__
#define __XPT2046_H__
#define uchar unsigned char
#define uint unsigned int
//指令的宏定义用的时候直接用变量名即可
#define XPT2046_XP 0x9c //可调电阻(x+引脚的值)
#define XPT2046_YP 0xdc //热敏电阻(Y+)
#define XPT2046_VBAT 0xac //光敏电阻(VBAT)
#define XPT2046_AUX 0xec //AUX
//以上电阻是我使用的51开发板定义,实际使用按情况使用
uint XPT2046_ReadAD(uchar command);
#endif
DAC(数模转换)
DA简介
- 用于数字信号向模拟信号的转换,是不是很熟悉,PWM就是一种数模转化方法,变化空占比来达到模拟信号的输出;而且简单易用我的板子上就是这种方法来实现
代码部分
pwm代码
#include <REGX52.H>
sbit DA=P2^1;
unsigned char Counter,Compare; //计数值和比较值,用于输出PWM
unsigned char i;
void Delay(unsigned int Num){
unsigned char l=110,k=220;
while(Num--){
while(l--){
while(k--);
}
}
}
void main(){
//定时器设置
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x9C;
TH0 = 0xFF;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
PT0=0;
while(1){
//用for两个循环不断改变占空比
for(i=0;i<100;i++){
Compare=i;
Delay(10);
}
for(i=100;i>0;i--){
Compare=i;
Delay(10);
}
}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0x9C;
TH0 = 0xFF;
Counter++;
Counter%=100;
if(Counter<Compare){
DA=1;
}
else{
DA=0;
}
}