51单片机AD,DA模块寄存器及原理介绍
- 格式:docx
- 大小:1.46 MB
- 文档页数:11
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本讲内容:介绍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]; }}}。
51单片机原理及应用51单片机是一种常见的微控制器,以其高性能和广泛应用而受到广大工程师的青睐。
本文将介绍51单片机的原理和应用。
51单片机的原理可以从其硬件结构和工作流程两方面来讲解。
首先是硬件结构。
51单片机包括中央处理器(CPU),存储器(包括存储器管理单元、内部RAM和ROM),输入/输出端口(I/O口),定时器/计数器,串行通信接口等。
CPU是整个系统的核心,负责指令的执行和数据的处理。
存储器用于存储程序和数据,其中ROM存储程序代码,RAM用于暂存数据。
I/O口用于与外部设备进行信息交互。
定时器/计数器用于产生精确的时间延迟和计数操作。
串行通信接口用于与其他设备进行数据传输。
其次是工作流程。
51单片机的工作流程一般包括初始化、输入/输出控制和运算处理三个阶段。
初始化阶段主要是对各个模块的配置和初始化,例如设置时钟频率、串口波特率等。
输入/输出控制阶段通过读取输入设备(如按键、传感器等)的状态,控制外部设备(如LED灯、马达等)的状态。
运算处理阶段通过执行指令,对数据进行处理和计算。
至于应用方面,51单片机具有广泛的应用领域。
主要应用包括控制系统、嵌入式系统、通信系统、工业自动化等。
在控制系统中,51单片机可以用于控制家电、机器人、机械设备等。
在嵌入式系统中,51单片机可以应用于智能家居、智能交通、智能仪表等。
在通信系统中,51单片机可以用于电话、网络和无线通信设备等。
在工业自动化中,51单片机可以用于工厂生产线控制、仪器仪表控制等。
总结起来,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单片机的原理和应用有了更深入的了解,希望能够对大家的学习和工作有所帮助。
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中是停止位。
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位。
转换速率:完成一次由模拟转换成数字所需时间的倒数。
采样时间:两次转换之间的间隔。
采样速率要小于等于转换速率,但很多情况下采样速率不能太低。
转换精度:指转换后所得二进制数的位数。
相关寄存器详细信息请参见以下介绍
实际应用请配合开发板原理图及相关例程。
谢谢!由于水平有限,文档难免有误,还请指教以上资料部分来自于官方数据手册及百度网,仅做整理,特此声明!。