51单片机AD,DA模块寄存器及原理介绍
第10章 51单片机的AD和DA通道

10.2 8位并行8通道A/D芯片 ADC0809
10.2.1 ADC0809基础 10.2.2 ADC0809的电路 10.2.3 ADC0809的操作步骤和驱动函数
前一页
首页
10.2.1 ADC0809基础
如下图所示是ADC0809芯片的逻辑结构,其由一个8路模拟开关、一个地址锁存与译码器、一个 A/D转换器和一个三态输出锁存器组成,各个模块的功能说明如下。
1. 采样 (具体内容详见教材) 2. 量化和编码 (具体内容详见教材)
前一页
10.1.2A/D变换的应用电路构成
一个完整的51单片机的A/D转换通道如下图所示,其由传感器、电压调理模块、A/D转换通道 芯片所组成。
前一页
10.1.3A/D变换的保持电路
当模拟信号变化较快时,其取样值vs在脉冲变化器件会有明显的变化,如图10.3(c)中所示, vs的顶部不平,这样就不能得到一个固定的取样值进行量化,因此要利用下图的保持电路对vi进 行保持。
前一页
10.351单片机的D/A输出通道基础
10.3.1D/A转换的过程 10.3.2D/A模块的分类 10.3.3D/A芯片的选择 10.3.4A/D芯片对电源的需求
前一页
首页
10.3.1D/A转换的过程
数字系统内部的数字量是采用0或者1这两个代码按照数位组合起来表示的。对于有权码,D/A转 换就是把每一位的代码都按照其相应权的大小转换为相应的模拟量,然后把转换后的模拟量相加, 即可以得到与数字量成正比的总模拟量,这就是数模转换的思路。 D/A转换的原理如下左图所示,其中 为输入的n为二进制数,是与输入二进制数成正比的输出电 压。
前一页
10.1 51单片机的A/D采集通道基础
51系列单片机寄存器详解

AUXR:辅助寄存器字节地址=8EH,不可位寻址- - - WDIDLE DISRTO - - DISALEWDIDLE:WTD在空闲模式下的禁止/允许位当WDIDLE=0时,WDT在空闲模式下继续计数当WDIDLE=1时,WDT在空闲模式下暂停计数DISRTO:禁止/允许WDT溢出时的复位输出当DISRTO=0时,WDT定时器溢出时,在RST引脚输出一个高电平脉冲当DISRT0=1时,RST引脚为输入脚DISALE :ALE禁止/允许位当DISALE=0时,ALE有效,发出恒定频率脉冲当DISALE=1时,ALE仅在CPU执行MOVC和MOVX类指令时有效,不访问外寄存器时,ALE不输出脉冲信号AUXR1:辅助寄存器1字节地址A2,不可位寻- - - -- - - DPSDPS:数据指针寄存器选择位当DPS=0时,选择数据指针寄存器DPRT0DPRT1时,选择数据指针寄存器DPS 当=PSW:程序状态字CY——进位标记AC——半进位标记F0——用户设定标记RS1、RS0——4个工作寄存器区的选择位。
VO——溢出标记P——奇偶校验标记PCON:电源控制器及波特率选择寄存器字节地址=87H,不可位寻址SMOD - - POF GF1 GF0 PD IDLSMOD——波特率倍增位GF1、GF0——用户通用标记PD——掉电方式控制位,PD=1时进入掉电模式IDL——空闲方式控制位,IDL=1时进入空闲方式在AT89S51中PCON.4是电源断电标记位POF,上电是为1IE:中断允许控制寄存器EA:中断允许总控制位当EA=0时,中断总禁止。
当EA=1时,中断总允许后中断的禁止与允许由各中断源的中断允许控制位进行设置。
EX0( EX1):外部中断允许控制位当EX0( EX1)=0 禁止外中断当EX0( EX1)=1 允许外中断ET0(EX1):定时/计数中断允许控制位当ET0(ET1)=0 禁止定时(或计数)中断当ET0(ET1)=1 允许定时(或计数)中断ET2:定时器2中断允许控制位,在AT89S52、AT89C52中ES:串行中断允许控制位当ES=0 禁止串行中断当ES=1 允许串行中断IP:中断优先级控制寄存器PX0——外部中断0优先级设定位PT0——定时中断0优先级设定位PX1——外部中断1优先级设定位PT1——定时中断1优先级设定位PS——串口中断优先级设定位优先级设定位2PT2——定时器SCON:串行口控制寄存器SM0、SM1:串行口工作方式选择位SM2:多机通信控制位REN:允许/禁止串行口接收的控制位TB8:在方式2和方式3中,是被发送的第9位数据,可根据需要由软件置1或清零,也可以作为奇偶校验位,在方式1中是停止位。
基于51单片机的AD和DA

基于51单片机的AD和DA本讲内容:介绍AD/DA芯片PCF8591,通过例程讲解AD和DA过程。
AD和DA的概念:AD转换的功能是把模拟量电压转换为数字量电压。
DA转换的功能正好相反,就是讲数字量转换位模拟量。
分辨率的概念:一位数字量所表示的电压值。
对于5V的满量程,采用8位的DAC 时,分辨率为5V/256=19.5mV。
PCF8591简介:PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个模拟输出和一个串行IIC总线接口。
3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至IIC总线而不需要额外硬件。
PCF8591管脚图:PCF8591接口电路图:PCF8591的控制寄存器:例程:AD程序/**********************AD转换**********************单片机型号:STC89C52RC*开发环境:KEIL*功能:IIC协议 PCF8591 AD转换**************************************************/#include<reg52.h>#include <intrins.h>#define LCD_Data P0#define Busy 0x80#define uchar unsigned char#define delay0;_nop_();#define AddWr 0x90#define AddRd 0x91sbit RST=P2^4;sbit Sda=P2^0;sbit Scl=P2^1;sbit LCD_RS=P1^0;sbit LCD_RW=P1^1;sbit LCD_E =P2^5;bit ADFlag;uchar code table0[]={" SL-51A "};uchar code table1[]={" AD CONVERT "};uchar code table2[]={"CH1: . V"};uchar code table3[]={"CH2: . V"};uchar code table4[]={"CH3: . V"};uchar code table5[]={"CH4: . V"};uchar TempData[8];void Delay5Ms(void);void delay(int In,int Out); void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);uchar ReadDataLCD(void);uchar ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData);void Init_Timer1(void);void Start(void);void Stop(void);void Ack(void);void NoAck(void);void Send(unsigned char Data);uchar Read(void);void DAC(unsigned char Data);uchar ReadADC(unsigned char Chl);void info_disp(void);/**********5ms延时函数***************************/void Delay5Ms(void){unsigned int TempCyc=3552;while(TempCyc--);}/********************延迟函数********************/void delay(int In,int Out) {int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}/*------------------------------------------------初始化定时器1------------------------------------------------*/void Init_Timer1(void){TMOD|=0x10;TH1=0xff;TL1=0x00;EA=1;ET1=1;TR1=1;}/*------------------------------------------------启动IIC总线------------------------------------------------*/void Start(void){Sda=1;delay0;Scl=1;delay0;Sda=0;delay0;Scl=0;}/*------------------------------------------------停止IIC总线------------------------------------------------*/void Stop(void){Sda=0;delay0;Scl=1;delay0;Sda=1;delay0;Scl=0;}/*------------------------------------------------应答IIC总线------------------------------------------------*/void Ack(void){Sda=0;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------非应答IIC总线------------------------------------------------*/void NoAck(void){Sda=1;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------发送一个字节------------------------------------------------*/ void Send(unsigned char Data){uchar BitCounter=8;uchar temp;do{temp=Data;Scl=0;delay0;if((temp&0x80)==0x80){Sda=1;}else{Sda=0;}Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回------------------------------------------------*/ uchar Read(void){uchar temp=0;uchar temp1=0;uchar BitCounter=8;Sda=1;do{Scl=0;delay0;Scl=1;delay0;if(Sda){temp=temp|0x01;}else{temp=temp&0xfe;}if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}/*------------------------------------------------写入DA数模转换值------------------------------------------------*/ void DAC(unsigned char Data){Start();Send(AddWr);Ack();Send(0x40);Ack();Send(Data);Ack();Stop();}/*------------------------------------------------读取AD模数转换的值,有返回值------------------------------------------------*/ uchar ReadADC(unsigned char Chl){uchar Data;Start();Send(AddWr);Ack();Send(0x40|Chl);Ack();Start();Send(AddRd);Ack();Data=Read();Scl=0;NoAck();Stop();return Data;}/*******************写数据函数*******************/ void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD();LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/*******************写指令函数*******************/ void WriteCommandLCD(unsigned char WCLCD,BuysC) {if(BuysC)ReadStatusLCD();LCD_Data=WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/*******************读数据函数*******************/unsigned char ReadDataLCD(void){LCD_RS=1;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;return(LCD_Data);}/*******************读状态函数*******************/unsigned char ReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;while (LCD_Data&Busy);return(LCD_Data);}/********************LCD初始化*******************/void LCDInit(void){LCD_Data=0;WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1);WriteCommandLCD(0x08,1);WriteCommandLCD(0x01,1);WriteCommandLCD(0x06,1);WriteCommandLCD(0x0C,1);}/********************清屏函数********************/void LCD_Clear(void){WriteCommandLCD(0x01,1);Delay5Ms();}/**************按指定位置显示一个字符*************/void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData) {Y&=0x1;X&=0xF;if(Y)X|=0x40;X|=0x80;WriteCommandLCD(X, 0);WriteDataLCD(DData);}/**************按指定位置显示一串字符*************/void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData) {unsigned char ListLength;ListLength=0;Y&=0x1;X&=0xF;while(DData[ListLength]>=0x20){if(X<=0xF){DisplayOneChar(X, Y, DData[ListLength]);ListLength++;X++;}}}/********************系统初始化*******************/void sys_init(void){LCDInit();delay(5,100);Init_Timer1();DisplayListChar(0,0,table0);DisplayListChar(0,1,table1);}/*------------------------------------------------显示------------------------------------------------*/void info_disp(void){DisplayListChar(0,0,table2);DisplayOneChar(4,0,(0x30+TempData[0]));DisplayOneChar(6,0,(0x30+TempData[1]));DisplayListChar(8,0,table3);DisplayOneChar(12,0,(0x30+TempData[2]));DisplayOneChar(14,0,(0x30+TempData[3]));DisplayListChar(0,1,table4);DisplayOneChar(4,1,(0x30+TempData[4]));DisplayOneChar(6,1,(0x30+TempData[5]));DisplayListChar(8,1,table5);DisplayOneChar(12,1,(0x30+TempData[6]));DisplayOneChar(14,1,(0x30+TempData[7]));}/*------------------------------------------------主程序------------------------------------------------*/void main(){uchar num;uchar ADtemp;sys_init();delay(100,1000);LCD_Clear();while(1){DAC(num);num++;delay(5,100);if(ADFlag){ADFlag=0;ADtemp=ReadADC(0);TempData[0]=(ReadADC(0))/50;TempData[1]=((ReadADC(0))%50)/10; ADtemp=ReadADC(1);TempData[2]=(ReadADC(1))/50;TempData[3]=((ReadADC(1))%50)/10; ADtemp=ReadADC(2);TempData[4]=(ReadADC(2))/50;TempData[5]=((ReadADC(2))%50)/10; ADtemp=ReadADC(3);TempData[6]=(ReadADC(3))/50;TempData[7]=((ReadADC(4))%50)/10; info_disp();}}}/*------------------------------------------------定时器中断程序------------------------------------------------*/void Timer1_isr(void) interrupt 3 using 1{static unsigned int j;TH1=0xfb;TL1=0x00;j++;if(j==200){j=0;ADFlag=1;}}DA程序/******************DA转换LED输出*******************单片机型号:STC89C52RC*开发环境:KEIL*功能:此程序通过IIC协议对DAAD芯片操作, 并输出模拟量,用LED亮度渐变指示***************************************************/#include<reg52.h>#include <intrins.h>#define delay0; _nop_();#define uchar unsigned char#define AddWr 0x90#define AddRd 0x91sbit RST=P2^4;sbit Sda=P2^0;sbit Scl=P2^1;sbit Fm=P2^3;sbit LE1=P2^6;sbit LE2=P2^7;bit ADFlag;uchar code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; data uchar Display[8];/*------------------------------------------------延时程序------------------------------------------------*/void mDelay(uchar j){unsigned int i;for(;j>0;j--){for(i=0;i<125;i++){;}}}/*------------------------------------------------初始化定时器1------------------------------------------------*/void Init_Timer1(void){TMOD|=0x10;TH1=0xff;TL1=0x00;EA=1;ET1=1;TR1=1;}/*------------------------------------------------启动IIC总线------------------------------------------------*/void Start(void){Sda=1;delay0;Scl=1;delay0;Sda=0;delay0;Scl=0;}/*------------------------------------------------停止IIC总线------------------------------------------------*/ void Stop(void){Sda=0;delay0;Scl=1;delay0;Sda=1;delay0;Scl=0;}/*------------------------------------------------应答IIC总线------------------------------------------------*/ void Ack(void){Sda=0;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------非应答IIC总线------------------------------------------------*/ void NoAck(void){Sda=1;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------发送一个字节------------------------------------------------*/ void Send(uchar Data){uchar BitCounter=8;uchar buffer;do{buffer=Data;Scl=0;delay0;if((buffer&0x80)==0x80)Sda=1;else Sda=0;Scl=1;buffer=Data<<1;Data=buffer;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回------------------------------------------------*/ uchar Read(void){uchar buffer=0;uchar buffer1=0;uchar BitCounter=8;Sda=1;do{Scl=0;delay0;Scl=1;delay0;if(Sda)buffer=buffer|0x01;else buffer=buffer&0xfe;if(BitCounter-1){buffer1=buffer<<1;buffer=buffer1;}BitCounter--;}while(BitCounter);return(buffer);}/*------------------------------------------------写入DA数模转换值------------------------------------------------*/ void DAC(uchar Data){Start();Send(AddWr);Ack();Send(0x40);Ack();Send(Data);Ack();Stop();}/*------------------------------------------------读取AD模数转换的值,有返回值------------------------------------------------*/ uchar ReadADC(uchar Chl){uchar Data;Start();Send(AddWr);Ack();Send(0x40|Chl);Ack();Start();Send(AddRd);Ack();Data=Read();Scl=0;NoAck();Stop();return Data;}void fmg(void){Fm=1;}void cmg(void){LE1=1;P0=0x00;LE1=0;LE2=1;P0=0x00;LE2=0;RST=0;}/*------------------------------------------------主程序------------------------------------------------*/ void main(){uchar num;uchar ADbuffer;Init_Timer1();cmg();fmg();while(1){DAC(num);num++;mDelay(20);if(ADFlag){ADFlag=0;ADbuffer=ReadADC(0);Display[0]=Datatab[(ReadADC(0))/50]|0x80;Display[1]=Datatab[((ReadADC(0))%50)/10];ADbuffer=ReadADC(1);Display[2]=Datatab[((ReadADC(1))/50)]|0x80;Display[3]=Datatab[((ReadADC(1))%50)/10];ADbuffer=ReadADC(2);Display[4]=Datatab[((ReadADC(2))/50)]|0x80;Display[5]=Datatab[((ReadADC(2))%50)/10];ADbuffer=ReadADC(3);Display[6]=Datatab[((ReadADC(3))/50)]|0x80; Display[7]=Datatab[((ReadADC(3))%50)/10]; }}}。
PLC中AD、DA模块说明

块块 结 检检 束 验验 码 码码 高低
位位
2. 通信命令代码
RCS 读单个接点 WCS 写单个接点 RCP 读多个接点 WCP 写多个接点 RCC 以字为单位读接点信息 WCC 以字为单位写接点信息 SC 在接点区以字为单位预置数 RD 读数据区 WD 写数据区 SD 数据区预置 RS 读定时/计数预置值 WS 写定时/计数预置值
RK WK MC WD MG RR WR RT RP WP RM AB
读定时计数经过值 写定时计数经过值 监视器接点记录/复位 监视器数据记录/复位 监视器执行 读系统监视器 写系统监视器 读PLC状态 读程序 写程序 RUN/PROG方式切换 发送无效
三、FP1与计算机通信的实现
F20 +, WX11, DT0
F32 %, DT0, K3, WY12
(ED)
第5节 FP1通信系统
一、 FP1的通信功能 1.一台计算机与一台PLC通信(1:1方式)
个人 计算机
RS-232C
FP1 控制器
通过FP1控制器RS-232C口连接
个人 计算机
RS-232C RS422/ RS-422 RS232C
CH0:WY9(Y90~Y9F)
CH1:WY10(Y100~Y10F)
当开关置于右边时,该模块设为No.1,其I/O 通道分配如下:
CH0:WY11(Y110~Y11F)
CH1:WY12(Y120~Y12F)
内部数据为K0~K1000,对应的输出信号范围为 0~5VDC,0~10VDC,0~20mADC可选则。
No.414寄存器为 RS-232C串口通信波特率设 置。
设置内容为:K0~K6分别代表波特率19200、 9600、4800、2400、1200、600和300bps。
单片机学习-_AD及DA工作原理及应用

3、绝对精度和相对精度 、 绝对精度(简称精度)是指在整个刻度范围内, 绝对精度(简称精度)是指在整个刻度范围内,任 一输入数码所对应的模拟量实际输出值与理论值之 间的最大误差。绝对精度是由DAC的增益误差(当 的增益误差( 间的最大误差。绝对精度是由 的增益误差 输入数码为全1时,实际输出值与理想输出值之差)、 输入数码为全 时 实际输出值与理想输出值之差)、 零点误差(数码输入为全0 DAC的非零输出 零点误差(数码输入为全0时,DAC的非零输出 )、非线性误差和噪声等引起的 绝对精度( 非线性误差和噪声等引起的。 值)、非线性误差和噪声等引起的。绝对精度(即 最大误差)应小于1个 最大误差)应小于 个LSB。 。 相对精度与绝对精度表示同一含义, 相对精度与绝对精度表示同一含义,用最大误差相 与绝对精度表示同一含义 对于满刻度的百分比表示。 对于满刻度的百分口 6.1.2 DAC0832芯片及其与单片机接口
DAC0832是使用非常普遍的8 D/A转换器, DAC0832是使用非常普遍的8位D/A转换器,由于其片 是使用非常普遍的 转换器 内有输入数据寄存器,故可以直接与单片机接口。 内有输入数据寄存器,故可以直接与单片机接口。 DAC0832以电流形式输出 当需要转换为电压输出时, 以电流形式输出, DAC0832以电流形式输出,当需要转换为电压输出时,可 外接运算放大器。属于该系列的芯片还有DAC0830 DAC0830、 外接运算放大器。属于该系列的芯片还有DAC0830、 DAC0831,它们可以相互代换。DAC0832主要特性 主要特性: DAC0831,它们可以相互代换。DAC0832主要特性: 分辨率8位; 分辨率8 电流建立时间1μS; 电流建立时间1μS; 数据输入可采用双缓冲、单缓冲或直通方式; 数据输入可采用双缓冲、单缓冲或直通方式; 输出电流线性度可在满量程下调节; 输出电流线性度可在满量程下调节; 逻辑电平输入与TTL电平兼容; TTL电平兼容 逻辑电平输入与TTL电平兼容; 单一电源供电(+5V~+15V); (+5V~+15V 单一电源供电(+5V~+15V); 低功耗,20mW。 低功耗,20mW。
51单片机原理及应用

51单片机原理及应用51单片机是一种常见的微控制器,以其高性能和广泛应用而受到广大工程师的青睐。
本文将介绍51单片机的原理和应用。
51单片机的原理可以从其硬件结构和工作流程两方面来讲解。
首先是硬件结构。
51单片机包括中央处理器(CPU),存储器(包括存储器管理单元、内部RAM和ROM),输入/输出端口(I/O口),定时器/计数器,串行通信接口等。
CPU是整个系统的核心,负责指令的执行和数据的处理。
存储器用于存储程序和数据,其中ROM存储程序代码,RAM用于暂存数据。
I/O口用于与外部设备进行信息交互。
定时器/计数器用于产生精确的时间延迟和计数操作。
串行通信接口用于与其他设备进行数据传输。
其次是工作流程。
51单片机的工作流程一般包括初始化、输入/输出控制和运算处理三个阶段。
初始化阶段主要是对各个模块的配置和初始化,例如设置时钟频率、串口波特率等。
输入/输出控制阶段通过读取输入设备(如按键、传感器等)的状态,控制外部设备(如LED灯、马达等)的状态。
运算处理阶段通过执行指令,对数据进行处理和计算。
至于应用方面,51单片机具有广泛的应用领域。
主要应用包括控制系统、嵌入式系统、通信系统、工业自动化等。
在控制系统中,51单片机可以用于控制家电、机器人、机械设备等。
在嵌入式系统中,51单片机可以应用于智能家居、智能交通、智能仪表等。
在通信系统中,51单片机可以用于电话、网络和无线通信设备等。
在工业自动化中,51单片机可以用于工厂生产线控制、仪器仪表控制等。
总结起来,51单片机的原理和应用都是非常重要的。
通过了解其硬件结构和工作流程,可以更好地理解其工作原理。
而了解其应用领域,则可以为工程师在实际项目中的选择和设计提供参考。
51单片机(AD及DA转换器)

时,LE 1 …=0
则数据被锁存
当 WR2 和 XFER 均为低电平时,LE2=1,此时允许D/A转换,否则 LE2
=0,将数20据21锁/3/1存1 于DAC寄存器中
9
DAC 0832 常 见 的 几 种 用 法
(a): DAC寄存器直通方式 (b): 输入寄存器直通方式
(c)2:021/两3/11个寄存器同时选通及锁存方式
2021/3/11
DAC0832
CS
WR1 AGND
D3 D2 D1
D0 Vref Rfb DGND
VCC
ILE WR2 XFER D4 D5
D6 D7 Iout2 Iout1
20 PIN DIP封装
5
DAC0832 内部结构框图
D0—D7:8位数字量输入端 /CS: 片选端,低有效 ILE: 数据锁存允许,高有效 /WR1: 写控制信号1,低有效 /WR2: 写控制信号2,低有效 /XFER: 数据传送控制信号 Iout1: 电流输出端1 LE Iout2: 电流输出端2 Rfb: 内置反馈电阻端 Vref: 参考电压源,-10~+10V DGND:数字量地 AGND:模拟量地 Vcc: +5~+15V单电源供电端
10
DAC0832 常见的几种用法
D7
输 入
寄
存
D0
器
ILE 1 &
LE1 1
CE 0
1
WR1 0 ≥1
WR2 0
1
XFER 0 ≥1
Vref
DAC
D/A Iout2
寄 存
转 换
Iout1
器
器
Rfb LE2
LE=1,Q 跟随 D LE=0,Q 锁存 D
51单片机原理

51单片机原理51单片机是一种常用的微控制器,广泛应用于各种电子设备和嵌入式系统中。
它具有成本低、性能稳定、易于编程等特点,因此备受工程师和电子爱好者的青睐。
本文将介绍51单片机的原理及其应用。
首先,我们来了解一下51单片机的基本结构。
51单片机是一种8位的微控制器,它由CPU、RAM、ROM、I/O口、定时器/计数器、串行通信接口等部分组成。
其中,CPU是单片机的核心,负责执行指令和控制整个系统的运行;RAM用于临时存储数据;ROM则存储程序代码和常量;I/O口用于与外部设备进行数据交换;定时器/计数器用于产生精确的时间延迟和计数功能;串行通信接口则实现单片机与外部设备的数据通信。
其次,我们来了解一下51单片机的工作原理。
在单片机系统中,CPU从ROM 中读取程序指令,并根据指令控制其他部件的工作。
当系统上电后,CPU会从指定的地址开始执行程序,不断地取指令、分析指令、执行指令,直到程序结束。
在执行过程中,CPU会根据需要从RAM中读取数据,并将处理结果写回RAM或者输出到外部设备。
同时,定时器/计数器可以产生精确的时钟信号,用于控制系统的时序和定时功能。
另外,51单片机的应用非常广泛。
它可以用于各种电子设备中,如家用电器、工业控制、通信设备、汽车电子等。
在这些设备中,单片机可以实现各种功能,如控制、监测、通信、显示等。
同时,由于单片机具有较强的可编程性,因此可以根据具体的应用需求进行灵活的定制和开发。
总的来说,51单片机作为一种常用的微控制器,具有成本低、性能稳定、易于编程等优点,因此在各种电子设备和嵌入式系统中得到了广泛的应用。
通过本文的介绍,相信读者对51单片机的原理和应用有了更深入的了解,希望能够对大家的学习和工作有所帮助。
51系列单片机寄存器详解

AUXR:辅助寄存器字节地址=8EH,不可位寻址- - - WDIDLE DISRTO - - DISALEWDIDLE:WTD在空闲模式下的禁止/允许位当WDIDLE=0时,WDT在空闲模式下继续计数当WDIDLE=1时,WDT在空闲模式下暂停计数DISRTO:禁止/允许WDT溢出时的复位输出当DISRTO=0时,WDT定时器溢出时,在RST引脚输出一个高电平脉冲当DISRT0=1时,RST引脚为输入脚DISALE :ALE禁止/允许位当DISALE=0时,ALE有效,发出恒定频率脉冲当DISALE=1时,ALE仅在CPU执行MOVC和MOVX类指令时有效,不访问外寄存器时,ALE不输出脉冲信号AUXR1:辅助寄存器1字节地址A2,不可位寻- - - -- - - DPSDPS:数据指针寄存器选择位当DPS=0时,选择数据指针寄存器DPRT0DPRT1时,选择数据指针寄存器DPS 当=PSW:程序状态字CY——进位标记AC——半进位标记F0——用户设定标记RS1、RS0——4个工作寄存器区的选择位。
VO——溢出标记P——奇偶校验标记PCON:电源控制器及波特率选择寄存器字节地址=87H,不可位寻址SMOD - - POF GF1 GF0 PD IDLSMOD——波特率倍增位GF1、GF0——用户通用标记PD——掉电方式控制位,PD=1时进入掉电模式IDL——空闲方式控制位,IDL=1时进入空闲方式在AT89S51中PCON.4是电源断电标记位POF,上电是为1IE:中断允许控制寄存器EA:中断允许总控制位当EA=0时,中断总禁止。
当EA=1时,中断总允许后中断的禁止与允许由各中断源的中断允许控制位进行设置。
EX0( EX1):外部中断允许控制位当EX0( EX1)=0 禁止外中断当EX0( EX1)=1 允许外中断ET0(EX1):定时/计数中断允许控制位当ET0(ET1)=0 禁止定时(或计数)中断当ET0(ET1)=1 允许定时(或计数)中断ET2:定时器2中断允许控制位,在AT89S52、AT89C52中ES:串行中断允许控制位当ES=0 禁止串行中断当ES=1 允许串行中断IP:中断优先级控制寄存器PX0——外部中断0优先级设定位PT0——定时中断0优先级设定位PX1——外部中断1优先级设定位PT1——定时中断1优先级设定位PS——串口中断优先级设定位优先级设定位2PT2——定时器SCON:串行口控制寄存器SM0、SM1:串行口工作方式选择位SM2:多机通信控制位REN:允许/禁止串行口接收的控制位TB8:在方式2和方式3中,是被发送的第9位数据,可根据需要由软件置1或清零,也可以作为奇偶校验位,在方式1中是停止位。
51单片机ad、da转换器[精制材料]
![51单片机ad、da转换器[精制材料]](https://img.taocdn.com/s3/m/81279c3b011ca300a6c3906c.png)
(1)分辨率(Res程ol)ut时io所n)需要的时间。
(2)偏移误差(O建ffs立e时tE间rro是r)D/A转换速率快慢的一个重 (3)精度(Accur要速ac参 率y)数越。低很。显不然同,型建号D立A时C间的越建大立,时转间换一
(4)转换速度(co般n从ve几rt个in纳g 秒sp到ee几d个) 微秒不等。若输出
(3)精度(Accuracy)
(4)转换速率/建立时间(converting speed)
(5)温度灵敏度(TemperatureSensitivity)
实操应用
3
二、DAC及其接口
(一)DAC介绍:数模转换,将一个二进制数字信号转换成与 此值成正比的模拟信号。
1.DAC结构:DAC芯片上集成有D/A转换电路和辅助电路。
第三节 A/D、D/A转换器
一、模拟接口概述
在实际系统中,单片机经常要对来自控制现场的各种模拟信 号进行采集和处理,如电压、电流等随时间连续变化的电量, 或者是温度、压力、流量等随时间连续变化的非电量。单片机 要接收这些模拟量,就要通过ADC来实现;如果单片机控制的 对象需要模拟量,则要用到DAC。
(5)温度灵敏度(形Te式m是p电er流at,urDeSAeCn的si建tiv立it时y)间是很短的; 若输出形式是电压,DAC的建立时间主
要是输出运算放大器所需要的响应时间。
实操应用
6
二、DAC及其接口
(一)DAC介绍:数模转换,将一个二进制数字信号转换成与 此值成正比的模拟信号。
1.DAC结构:DAC芯片上集成有D/A转换电路和辅助电路。
差一般可在D/A转换器外部用电位器
调节到实最操应小用 。
4
二、DAC及其接口
51单片机部分寄存器介绍

MCS-51 单片机的中断源有两个用户可控的中断优先级,从而可实现二级中断嵌 套。中断系统遵循如下三条规则: 1、正在进行的中断过程不能被新的同级或低优先级的中断请求所中断,直到该中断服 务程序结束,返回了主程序且执行了主程序中的一条指令后,CPU 才响应新的中断请求。 2、正在进行的低优先级中断服务程序能被高优先级中断请求所中断,实现两级嵌套。 3、CPU 同时接收到几个中断请求时,首先响应优先级最高的中断请求。
机通信中,以 TB8 位的状态表示主机发送的是地址还是数据:TB8=0 为数据,TB8=1
为地址;也可用作数据的奇偶校验位。该位由软件置位或复位。
RB8:接收数据 D8 位。在方式 2 和方式 3 时,接收到的第 9 位数据,可作为奇偶校验
位或地址帧或数据帧的标志。方式 1 时,若 SM2=0,则 RB8 是接收到的停止位。在
的计数值。
溢出率=fosc/{12×[256-(TH1)]} 在使用串行口之前,应对它进行编程初始化,主要是设置产生波特率的定时器 1、
串行口控制和中断控制。具体步骤:
1、确定定时器 1 的工作方式(编程 TMOD 寄存器);
2、计算定时器 1 的初值,装载 TH1、TL1;
3、启动定时器 1(编程 TCON 中的 TR1 位);
则不论第 9 位数据为 0 或 1,都将前 8 位数据装入 SBUF 中,并产生中断请求。在方
式 0 时,SM2 必须为 0。
REN:允许串行接收控制位。若 REN=0,则禁止接收;REN=1,则允许接收,该位由
软件置位或复位。
TB8:发送数据 D8 位。在方式 2 和方式 3 时,TB8 为所要发送的第 9 位数据。在多
定时器/计数器 T0、T1 都有四种工作方式,可通过程序对 TMOD 设置来选择。 TMOD 的低 4 位用于定时器/计数器 0,高 4 位用于定时器/计数器 1。其位定义如下:
51单片机中如何对 AD和DA操作

51单片机开发板28课配套视频教程
PCF8591读取一个字节的程序
/************************************************************ * 函数名 : Pcf8591ReadByte * 函数功能 : 读取一个转换值 * 输入 : * 输出 : dat ************************************************************/ unsigned char Pcf8591ReadByte() { unsigned char dat; I2cStart(); I2cSendByte(READADDR);//发送读器件地址 dat=I2cReadByte();//读取数据 I2cStop(); //结束总线 return dat; }
D6
亚博科技
51单片机开发板28课配套视频教程
PCF8591的写入
第一个字节是器件地址和读写控制
第二个字节被存到控制寄存器,用于控制器件
功能。 第三个字节被存储到DAC数据寄存器,并使用 片上D/A转换器转换成对应的模拟电压。(所 以不输入D/A时,可以不用输入。)
亚博科技
51单片机开发板28课配套视频教程
亚博科技
51单片机开发板28课配套视频教程
第17讲
AD和DA实验
亚博科技
51单片机开发板28课配套视频教程
AD和DA的概念
AD转换的功能是把模拟量电压转换为数字量电压。 DA转换的功能正好相反,就是讲数字量转换位模拟 量。 分辨率的概念 一位数字量所表示的电压值。对于5V的满量程,采 用8位的DAC时,分辨率为5V/256=19.5的转换值被存为对应的8位二进制码,取
51单片机ad、da转换器

DAC电流输出1,当
① VCC电源可以在5-15V内变化。典型使用
DAC寄存器中为全1
时用15V电源。
时,输出电流最大,
② AGND为模拟量地线,DGND为数字量地 线,使用时,这两个接地端应始终连在一起。 ③ 参考电压VREF接外部的标准电源,VREF 一般可在+10V到—10V范围内选用。
当DAC寄存器中为全 0时,输出电流为0。 lout2为DAC电流输 出2,Iout2为一常数 与Ioutl之差,即
DI0 DI1
8位
DI2 输入
DI3 DI4
寄
DI5 DI6
存
DI7
器
8位
DAC 寄 存 器
8位
VREF
D/A Io utI2OUT2 +
转 Io utI1OUT1 -
换 器 RfRbfb
loutl+out2.=常数
电 平 输出
在实际使用时,总是
ILE
LE1
LE2
CS &
WR1+
DGND 将电流转为电压来使 用,即将Ioutl和 lout2加到一个运算
XFER
WR2 +
放大器的输入。
DAC0832的引脚
DAC0832是CMOS工艺,双列直插式20引脚。 ① VCC电源可以在5-15V内变化。典型使用 时用15V电源。 ② AGND为模拟量地线,DGND为数字量地 线,使用时,这两个接地端应始终连在一起。 ③ 参考电压VREF接外部的标准电源,VREF 一般可在+10V到—10V范围内选用。
A转换器的温度灵敏度约为满量程模拟 值变化的±50X10-6/oC。
3.与单片机接口形式
D/A转换器与单片机接口有2种,主要决定于转换器本身 是否带数据锁存器。有两类D/A转换器:一是不带锁存器的, 另一是带锁存器的。
51单片机寄存器集(包括所有的寄存器位的详细介绍)

(1)SM0、SM1:串行口工作方式控制位。
SM0,SM1 工作方式00 方式0-波特率由振荡器频率所定:振荡器频率/1201 方式1-波特率由定时器T1或T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/3210 方式2-波特率由振荡器频率和SMOD所定:2SMOD ×振荡器频率/6411 方式3-波特率由定时器T1或T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/32(2)SM2:多机通信控制位。
< br> 多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。
接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。
当SM2=0时,就不管第位数据是0还是1,都难得数据送入SBUF,并发出中断申请。
工作于方式0时,SM2必须为0。
(3)REN:允许接收位。
< br> REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。
(4)TB8:发送接收数据位8。
< br> 在方式2和方式3中,TB8是要发送的——即第9位数据位。
在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。
(5)RB8:接收数据位8。
在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。
(6)TI:发送中断标志位。
可寻址标志位。
方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。
(7)RI:接收中断标志位。
可寻址标志位。
接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。
11、PCON-----电源管理寄存器PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,单元地址是87H,其结构格式如下:。
51单片机AD,DA模块寄存器及原理介绍

STC15系列单片机内部AD/DA模块介绍时间:2015/04/13 22:00为什么要用AD和DA:模拟信号只有通过A/D转化为数字信号后才能用软件进行处理,这一切都是通过A/D转换器(ADC)来实现的。
与模数转换相对应的是数模转换,数模转换是模数转换的逆过程。
数模转换(D/A):将数字量转换为模拟电量(电压或电流),使输出的模拟电量与输入的数字量成正比。
(1) 转换速度转换速度是指完成一次D/A转换所用的时间。
转换时间越长,转换速度就越低。
(2) 分辨率D/A转换器的分辨力用可用输入的二进制数码的位数来表示。
位数越多,则分辨力也就越高。
常用的有8位、10位、12位、16位、24位、32位等。
(3) 转换精度转换精度定义为实际输出与期望输出之比。
以全程的百分比或最大输出电压的百分比表示。
理论上D/A转换器的最大误差为最低位的1/2,10位D/A转换器的分辨率为1/210,约为0.1%,它的精度为0.05%。
如10位D/A转换器的满程输出为10V,则它的最大输出误差为10V×0.0005=5mV。
模数转换(A/D):将时间连续、幅值也连续的模拟信号转换为时间离散、幅值也离散的数字信号分辨率:采样值的位数的选取需要满足一定的动态范围及数字部分处理精度的要求,一般分辨率80dB的动态范围要求下不能低于12位。
转换速率:完成一次由模拟转换成数字所需时间的倒数。
采样时间:两次转换之间的间隔。
采样速率要小于等于转换速率,但很多情况下采样速率不能太低。
转换精度:指转换后所得二进制数的位数。
相关寄存器详细信息请参见以下介绍实际应用请配合开发板原理图及相关例程。
谢谢!由于水平有限,文档难免有误,还请指教以上资料部分来自于官方数据手册及百度网,仅做整理,特此声明!。
51单片机DAC、ADC和红外模块

三、红外模块
因缺少调试元件,待上课后再补充进来!
ADUC848内置DA简介
DA为12位,也可设臵为8位; 单通道电压型输出,其输出引脚为DAC;
输出电压范围在0~VREF(内部参考电压 2.56v)和0~AVDD(单片机模拟工作电压为 3v或5v)可选; 内臵一个缓冲器,可增强其带负载能力。
在接近满刻度及0电压输出时,电压线性度有 失真,在0~AVDD输出时必须使用; 在0~VREF输出时,可以禁止缓冲器,外加双电 源运放射随电路解决。
开发板AD简介
根据开发板的硬件设计,在不添加板外电路情 形下,其AD使用如下:
输入通道为AIN5、AIN6。两者既可作为两个单极 性伪差动输入通道(AIN5、AIN6相对模拟地), 也可结合为1个单双极性均可的全差动输入通道 (AIN5为+,AIN6为-) 无外接参考电压源,故AD为内部参考电压。 斩波模式下,AD转换有效精度优于非斩波模式, 但转换时间较长; 数字滤波器抽样系数可通过SF寄存器来设臵,SF值 从3~255,数字越大,其输出噪声越低,但转换时 间越长。
位于测试程序包中“ADDA联合测试”目录,双 击TEST.UVPROJ文件打开并编译下载。
测试程序
ADC测试现象
右边三个数码管显示DA输出值,从0.10V以 0.05V递增至1.00V,不断循环。
左边4个数码管显示AD输入值。DA输出值与AD输入 值基本相同。 两路AD需分别检测通过。
程序测试情形
一、DAC模块 二、ADC模块 三、红外模块
一、DAC简介
DAC(Digital-to-Analog Conversion),数 模转换,将离散的数字量转换为连接变化 的模拟量。 计算机能直接处理的是数字量,而自然界 大部分信息为模拟量,因此计算机监控系 统常通过模数转换(ADC)获取外界信息, 通过数模转换(DAC)实现控制。
51单片机寄存器功能一览表(最全)

0V:溢出标志位运算结果按补码运算理解。
有溢出,OV=1;无溢出,OV=0。
什么是溢出我们后面的章节会讲到。
P:奇偶校验位它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。
若为奇数,则P=1,否则为0。
运算结果有奇数个1,P=1;运算结果有偶数个1,P=0。
例:某运算结果是78H(01111000),显然1的个数为偶数,所以P=0。
4、DPTR(DPH、DPL)--------数据指针7、IP-----中断优先级控制寄存器(同时1怎么排序?)8、TMOD-----定时器控制寄存器•IT0:外部中断源0触发方式控制位。
IT0=0,外部中断1程控为电平触发方式,当INT0(P3.2)输入低电平时,置位IE0。
IT0=1为边沿触发方式。
10、SCON----串行通信控制寄存器它是一个可寻址的专用寄存器,用于串行数据的通信控制,单元地址是98H,其结构格式如下:(1)SM0、SM1:串行口工作方式控制位。
SM0,SM1 工作方式00 方式0-波特率由振荡器频率所定:振荡器频率/1201 方式1-波特率由定时器T1或T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/3210 方式2-波特率由振荡器频率和SMOD所定:2SMOD ×振荡器频率/6411 方式3-波特率由定时器T1或T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/32(2)SM2:多机通信控制位。
< br> 多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。
接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。
当SM2=0时,就不管第9位数据是0还是1,都将数据送入SBUF,并发出中断申请。
工作于方式0时,SM2必须为0。
(3)REN:允许接收位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STC15系列单片机内部AD/DA模块介绍
时间:2015/04/13 22:00
为什么要用AD和DA:模拟信号只有通过A/D转化为数字信号后才能用软件进行处理,这一切都是通过A/D转换器(ADC)来实现的。
与模数转换相对应的是数模转换,数模转换是模数转换的逆过程。
数模转换(D/A):将数字量转换为模拟电量(电压或电流),使输出的模拟电量与输入的数字量成正比。
(1) 转换速度
转换速度是指完成一次D/A转换所用的时间。
转换时间越长,转换速度就越低。
(2) 分辨率
D/A转换器的分辨力用可用输入的二进制数码的位数来表示。
位数越多,则分辨力也就越高。
常用的有8位、10位、12位、16位、24位、32位等。
(3) 转换精度
转换精度定义为实际输出与期望输出之比。
以全程的百分比或最大输
出电压的百分比表示。
理论上D/A转换器的最大误差为最低位的1/2,10位D/A转换器的
分辨率为1/210,约为0.1%,它的精度为0.05%。
如10位D/A转换器的满程输出为10V,则它的最大输出误差为10V
×0.0005=5mV。
模数转换(A/D):将时间连续、幅值也连续的模拟信号转换为时间离散、幅值也离散的数字信号
分辨率:采样值的位数的选取需要满足一定的动态范围及数字部分处理精度的要求,一般分辨率80dB的动态范围要求下不能低于12位。
转换速率:完成一次由模拟转换成数字所需时间的倒数。
采样时间:两次转换之间的间隔。
采样速率要小于等于转换速率,但很多情况下采样速率不能太低。
转换精度:指转换后所得二进制数的位数。
相关寄存器详细信息请参见以下介绍
实际应用请配合开发板原理图及相关例程。
谢谢!由于水平有限,文档难免有误,还请指教以上资料部分来自于官方数据手册及百度网,仅做整理,特此声明!。