51单片机课程设计 AD转换
- 格式:docx
- 大小:1.14 MB
- 文档页数:15
#include "reg51.h"#include "intrins.h"#define FOSC 18432000L#define BAUD 9600typedef unsigned char BYTE; //定义了一个unsigned char的同义词BYTE typedef unsigned int WORD; //定义了一个unsigned int 的同义词WORD /*Declare SFR associated with the ADC */sfr ADC_CONTR = 0xBC; //AD转化控制寄存器,地址是0xBCsfr ADC_RES = 0xBD; //8位AD转换结果寄存器sfr ADC_LOW2 = 0xBE; //AD转化低2位结果寄存器sfr P1ASF = 0x9D; //P1口中的相应位作为模拟功能使用时的控制寄存器/*Define ADC operation const for ADC_CONTR*/#define ADC_POWER 0x80 //ADC电源控制位#define ADC_FLAG 0x10 //ADC 完成标志#define ADC_START 0x08 //ADC 启动控制位//AD转换速度选择#define ADC_SPEEDLL 0x00 //540 clocks#define ADC_SPEEDL 0x20 //360 clocks#define ADC_SPEEDH 0x40 //180 clocks#define ADC_SPEEDHH 0x60 //90 clocksvoid InitUart();void SendData(BYTE dat);void Delay(WORD n);void InitADC();BYTE ch = 0; //ADC channel NO.void main(){InitUart(); //Init UART, use to show ADC resultInitADC(); //Init ADC sfrIE = 0xa0; //Enable ADC interrupt and Open master interrupt switch//Start A/D conversionwhile (1);}/*----------------------------ADC 中断处理----------------------------*/void adc_isr() interrupt 5 using 1{ADC_CONTR &= !ADC_FLAG; //清除ADC中断标志位SendData(ch); //Show Channel NO.SendData(ADC_RES); //Get ADC high 8-bit result and Send to UART//if you want show 10-bit result, uncomment next line// SendData(ADC_LOW2); //Show ADC low 2-bit resultif (++ch > 7) ch = 0; //切换到下一通道ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;}/*----------------------------Initial ADC sfr----------------------------*/void InitADC( ){P1ASF = 0xff; //设置P1口全部为ADC通道ADC_RES = 0; //清除高8位缓冲数据ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;Delay(2); //打开ADC}/*----------------------------Initial UART----------------------------*/void InitUart(){SCON = 0x5a; //8 bit data ,no parity bitTMOD = 0x20; //工作方式寄存器,8位初值自动重新装入定时器TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrateTR1 = 1; //T1开始运行}/*----------------------------Send one byte data to PCInput: dat (UART data)Output:-----------------------------*/void SendData(BYTE dat){while (!TI); //WaitTI = 0; //ClearSBUF = dat; //Send}/*----------------------------Software delay function----------------------------*/void Delay(WORD n){WORD x;while (n--){x = 5000;while (x--); } }。
基于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]; }}}。
实验六 ADC0809AD转换实验一、实验目的1、掌握ADC0809AD芯片的工作原理和使用方法。
2、掌握如何使用51单片机配合ADC0809AD芯片实现模拟量转换。
二、实验原理ADC0809AD是一种8位分辨率、并行输出、单通道,3MHz 工作速率的A/D转换器。
ADC 有两个输入电压端子,IN+和IN-,它们之间加入了一个内部参考电压源(RE),所以在输入模拟信号时常在IN+端连接信号输入,而IN-端接地。
当选用RE = +2.5 V时,IN+的输入范围约为0-VREF,在本实验中选用的是RE = +5 V,所以IN+的输入范围约为0-5V。
当外部触发信号TRIGGER开启后,ADC执行转换操作。
在转换时,电压采样保持时间通常为 100 ns,最长转换时间为 200 us,当转换结束时,ADC将数字输出置在低电平并发出一个中断请求(INTR)信号。
转换结果可以通过 8个输出线路(DB0-DB7)获得。
三、实验器材2、*1 9针座(1x9 Pin Socket)。
3、*1 51单片机学习板。
4、*1 电阻10KΩ。
5、*1 电压源。
6、*1 面包板。
7、*5 条杜邦线。
四、实验步骤1、根据下表将ADC0809AD芯片插入到面包板中。
ADC0809AD引脚码ADC0809AD引脚名称功能1 A0- A/D输入(低、多路)引脚17 AGND 模拟地18 VREF/2 参考电压输出19 VCC 数字电源2、将9脚座插入面包板的横向边缘上。
3、使用杜邦线将ADC0809AD转换器连接到学习板上,并根据原理部分对芯片引脚进行接线。
4、将一个10KΩ的电阻连接到ADC0809AD芯片的IN+引脚和GND之间。
6、使用杜邦线将ADC0809AD芯片的DB0-DB7引脚连接到学习板的P0.0-P0.7引脚上。
7、将学习板的P0.0-P0.7引脚转为输出模式。
五、实验代码#include <reg52.h>// SFR位定义sfr ADC_CONTR = 0xBC; // ADC控制寄存器sfr ADC_RES = 0xBD; // ADC结果寄存器sfr ADC_RESL = 0xBE; // ADC结果低字节寄存器sfr P0 = 0x80; // P0口// 公用函数void delay(int time) // 延时函数{int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 125; j++);}}while (1) {ADC_CONTR |= 0x08; // 开始转换while (!(ADC_CONTR & 0x10)); // 等待转换结束P0 = ADC_RES; // 将结果输出到P0口delay(1000); // 延时1000ms}}根据程序分析,程序采用了循环语句控制ADC的转换、输出,程序中实现的是ADC的一次转换。
51单片机ad转换代码及仿真一、前言51单片机是一种广泛应用于嵌入式系统领域的微控制器,其具有低功耗、高性能、易学易用等特点。
其中,AD转换模块是其重要的功能之一,可以实现模拟信号到数字信号的转换。
本文将介绍51单片机AD 转换的相关知识和代码实现,并通过仿真验证其正确性。
二、51单片机AD转换原理1. AD转换概述AD转换(Analog-to-Digital Conversion)是指将模拟信号(如声音、图像等)转化为数字信号的过程。
在嵌入式系统中,AD转换通常用于采集外部传感器等模拟量信号,并将其转化为数字量进行处理。
2. 51单片机AD转换模块51单片机内置了一个8位AD转换模块,可以对0~5V范围内的模拟信号进行采样和转换。
该模块包含以下主要部分:(1)输入端:可接受外部0~5V范围内的模拟信号。
(2)采样保持电路:在采样期间对输入信号进行保持,以避免采样过程中信号波动。
(3)比较器:将输入信号与参考电压进行比较,并输出比较结果。
(4)计数器:对比较结果进行计数,得到AD转换的结果。
(5)控制逻辑:控制采样、保持、比较和计数等过程。
3. AD转换精度AD转换精度是指数字信号与模拟信号之间的误差,通常用位数来表示。
例如,8位AD转换器可以将模拟信号分成256个等级,即精度为1/256。
因此,AD转换精度越高,数字信号与模拟信号之间的误差越小。
4. AD转换速率AD转换速率是指单位时间内进行的AD转换次数。
在51单片机中,AD转换速率受到时钟频率和采样时间的限制。
因此,在实际应用中需要根据具体情况选择合适的时钟频率和采样时间以满足要求的转换速率。
三、51单片机AD转换代码实现以下为51单片机AD转换代码实现:```#include <reg52.h>sbit IN = P1^0; // 定义输入端口sbit OUT = P2^0; // 定义输出端口void main(){unsigned char result;while (1){ADC_CONTR = 0x90; // 打开ADCADC_CONTR |= 0x08; // 开始采样while (!(ADC_CONTR & 0x10)); // 等待采样完成result = ADC_RES; // 读取结果OUT = result; // 输出结果}}```代码解释:(1)定义输入输出端口:使用sbit关键字定义输入端口和输出端口。
目录A/D转换系统设计.................................................................................................................... - 1 -摘要和关键词.......................................................................................................................................... - 1 - 第一章设计任务与要求.......................................................................................................... - 2 -1.1、设计题目......................................................................................................................................... - 2 -1.2、设计目的......................................................................................................................................... - 2 -1.3、设计要求......................................................................................................................................... - 2 -1.4、完成的任务..................................................................................................................................... - 2 - 第二章方案比较与论证.......................................................................................................... - 2 -2.1、方案设想......................................................................................................................................... - 2 -2.2器件选择............................................................................................................................................ - 2 - 第三章芯片简介...................................................................................................................... - 3 -3.1 ADC0808简介................................................................................................................................... - 3 -3.1.1ADC0808的内部逻辑结构..................................................................................................... - 3 -3.1.2ADC0808引脚结构................................................................................................................. - 3 -3.2、8051单片机引脚图与引脚功能简介 ............................................................................................ - 5 -3.2.1、电源: ................................................................................................................................... - 5 -3.2.2 时钟: ....................................................................................................................................... - 5 -3.2.3控制线: .................................................................................................................................... - 5 -3.2.4、I/O线.................................................................................................................................. - 6 -3.3、8255A .............................................................................................................................................. - 6 - 第四章设计方案及程序流程图.............................................................................................. - 7 -4.1、设计方案...................................................................................................................................... - 7 -4.2、系统框图......................................................................................................................................... - 7 -4.3、程序流程图..................................................................................................................................... - 7 - 第五章PROTEUS仿真电路................................................................................................... - 8 -5.1、复位电路......................................................................................................................................... - 8 -5.2、振荡源............................................................................................................................................. - 9 -5.3、二分频电路................................................................................................................................... - 10 -5.4、AD转换电路 ................................................................................................................................ - 10 -5.5、显示电路....................................................................................................................................... - 11 -5.6 8255A电路...................................................................................................................................... - 11 -5.7总电路仿真...................................................................................................................................... - 12 - 第六章程序............................................................................................................................ - 12 -第七章感想体会.................................................................................................................... - 14 -第八章参考文献.................................................................................................................... - 15 -A/D转换系统设计摘要和关键词A/D转换是指将模拟信号转换为数字信号,这在信号处理、信号传输等领域具有重要的意义。
51单片机ad转换程序解析1.引言1.1 概述概述部分旨在介绍本篇文章的主题——51单片机AD转换程序,并对文章的结构和目的进行简要说明。
51单片机是指Intel公司推出的一种单片机芯片,它广泛应用于嵌入式系统中。
而AD转换则是模拟信号转换为数字信号的过程,是嵌入式系统中的重要功能之一。
本文将详细解析51单片机中的AD转换程序。
文章结构分为引言、正文和结论三个部分。
引言部分将给读者介绍本篇文章的内容和结构安排,正文部分将详细讲解51单片机AD转换程序的相关要点,而结论部分将总结正文中各个要点的内容,以便读者能够更好地理解和掌握51单片机AD转换程序的实现原理。
本文的目的在于向读者提供一份对51单片机AD转换程序的详细解析,使读者能够了解51单片机的AD转换功能以及如何在程序中进行相应的设置和操作。
通过本文的学习,读者将掌握如何使用51单片机进行模拟信号的采集和处理,为后续的嵌入式系统设计和开发提供基础。
在下一节中,我们将开始介绍文章的第一个要点,详细讲解51单片机AD转换程序中的相关知识和技巧。
敬请期待!1.2 文章结构文章结构部分主要是对整篇文章的框架和内容进行介绍和归纳,以帮助读者更好地理解文章的组织和内容安排。
本文以"51单片机AD转换程序解析"为主题,结构分为引言、正文和结论三个部分。
引言部分主要包括概述、文章结构和目的三个方面。
首先,通过对单片机AD转换程序的解析,来讲解其实现原理和功能。
其次,介绍文章的结构,帮助读者明确整篇文章的主要内容和组织方式。
再次,阐明文章的目的,即为读者提供关于51单片机AD转换程序的详尽解析和指导,帮助读者深入了解该技术并进行实际应用。
正文部分则分为两个要点,即第一个要点和第二个要点。
第一个要点可以从AD转换的基本概念入手,介绍51单片机AD转换的原理和流程。
包括输入电压的采样、AD转换器的工作原理、ADC的配置和控制等方面的内容。
在此基础上,深入解析51单片机AD转换程序的编写和调用方法,包括编程语言、寄存器的配置、数据的获取和处理等。
四、实验说明1、D/A 转换是把数字量转换成模拟量的变换,实验台上D /A 电路输出的是模拟电压信号。
要实现实验要求,比较简单的方法是产生三个波形的表格,然后通过查表来实现波形显示。
2、产生锯齿波和三角波的表格只需由数字量的增减来控制,同时要注意三角波要分段来产生。
要产生正弦波,较简单的方法是造一张正弦数字量表。
即查函数表得到的值转换成十六进制数填表。
D/A 转换取值范围为一个周期,采样点越多,精度越高些。
本例采用的采样点为256点/周期。
3、8位D/A 转换器的输入数据与输出电压的关系为U(0∽-5V)=Uref/256×N U(-5V ∽+5V)=2·Uref/256×N-5V (这里 Uref 为+5V)五、实验框图六、参考程序xdata unsig n ed char CS 0832 _at_ 0xa000;void Write 0832(unsig n ed char b){CS0832 = b;}void main(){Write 0832(0);Write 0832(0x80);Write 0832(0xff);开始否 是置计数器初值 查表读波形数据 启动D/A 改变计数器及表指针 转换完毕while(1);}/*========================================================== =*/CS0832 equ 0a000hmov dptr, #CS0832mov a, #00hmovx @dptr, amov a, #40hmovx @dptr, amov a, #80hmovx @dptr, amov a, #0c0hmovx @dptr, amov a, #0ffhmovx @dptr, aljmp $end硬件实验十三 A/D 模数转换实验一、实验要求利用实验板上的ADC 0809做A /D 转换器,实验板上的电位器提供模拟量输入,编制程序,将模拟量转换成二进制数字量,用8255的PA 口输出到发光二极管显示。
51单片机ad转换流程51单片机是一种广泛应用于嵌入式系统中的微控制器。
与其他单片机相比,51单片机的特点之一是其模拟到数字转换功能(AD转换),它允许将模拟信号转换为数字量,以便进行数字信号处理和控制。
在本文中,我们将以“51单片机AD转换流程”为主题,详细介绍AD转换的步骤和相关概念。
第一步:了解AD转换的基本概念模拟到数字转换(AD转换)是电子系统中一种常见的操作。
它涉及将连续的模拟信号转换为离散的数字信号,以便进行数字信号处理。
AD转换的结果通常以二进制形式表示,可以被计算机或其他数字处理设备使用。
在AD转换过程中,最重要的参数是分辨率和采样率。
分辨率是指AD转换器能够分辨的最小信号变化量,通常以比特数表示。
例如,8位AD转换器的分辨率为2^8,即256个离散的信号水平。
采样率是指AD转换器每秒钟进行的样本数量,通常以赫兹(Hz)表示。
第二步:准备硬件连接在进行AD转换之前,需要连接电源、待转换的模拟信号源和51单片机上的AD输入引脚。
具体的硬件连接方式可以根据具体的应用需求和开发板设计进行调整。
通常情况下,待转换的模拟信号将通过电阻网络与AD输入引脚相连接。
这个电阻网络起到电压分压的作用,将输入信号的幅度限制在AD转换器可接受的范围内。
开发板上的AD输入引脚通常还具有可选的电容网络,用于去除输入信号中的高频噪声。
第三步:配置AD转换器参数在开始AD转换之前,需要通过编程设置51单片机上的AD转换器参数。
这些参数包括分辨率、输入通道选择、参考电压选择和采样率等。
这些参数的设置是通过对寄存器的操作来实现的。
通过写入相应的寄存器值,我们可以选择转换的分辨率。
51单片机上的AD转换器可以支持不同的分辨率,如8位、10位或12位。
选择转换的输入通道也是一个重要的步骤。
通常情况下,AD转换器具有多个输入信道,可以同时转换多个信号。
需要根据具体的信号源,选择合适的输入通道。
参考电压的选择也要根据具体的应用需求来确定。
/*****************************************************************//* *//*名称:AD转换+LCD12864显示程序*/ /*功能: 1 AD转换,二进制转换成十进制*/ /* 2 显示英文,数字,符号,图片。
*//*难度等级:高*//*****************************************************************/#include <reg52.h>#include <string.h>#define uchar unsigned char/**********引脚定义*********/sbit lck = P3^5;//锁存信号sbit addr0 = P1^4;sbit addr1 = P1^5;sbit addr2 = P1^6;sbit cs138 = P1^7;/********常用命令及参数定义********/#define DISPON 0x3f#define DISPOFF 0x3e#define DISPFIRST 0xc0#define SETX 0x40#define SETY 0xb8#define LCDBUZY 0x80#define L 0x00#define R 0x40#define LIMIT 0x80/**********全局变量************/uchar cbyte;uchar data statu;bit xy;/**************函数******************/void WrL(uchar x);void WrR(uchar x);void Lcmcls(void);void Lcminit (void);void Putpicture();void delay(unsigned int time);void VtoH8x16change(uchar *hzbuf);void Puthalf(uchar *strch,uchar row,uchar col);void Wrdata(uchar x,uchar row,uchar col);void Locatexy(uchar row,uchar col);void vWrite8x16Character(uchar *ch,uchar row,uchar col,bit flag);uchar ADC0804();extern uchar code char_Table[95][16];extern unsigned char code picture[];/***************微秒级延时*****************/void delay(unsigned int time){ unsigned int i;for(i=0;i<time;i++);}/***********主程序***************/void main(void){ uchar i,j,k;float voltage,decimal;unsigned int intvolt,tofloat;addr0 = 1;addr1 = 0;addr2 = 1;//ULN2003片选地址P0 = 0x00;//断开继电器A,Bcs138 = 1;cs138 = 0;//数据锁存到U18(74HC574)Lcminit();//LCD初始化Putpicture();//显示界面图片while(1){voltage = ADC0804();voltage = voltage * 0.0391;//将二进制字节数据变成实际电压值10/256 = 0.0196 intvolt = voltage;//取整数部分tofloat = intvolt;decimal = voltage - tofloat;//取小数部分decimal = decimal * 100;//小数部分取两位i = intvolt % 0x0a + '0';//整数部分个位intvolt = decimal;j = intvolt % 0x0a + '0';//小数部分低位intvolt = intvolt / 0x0a;k = intvolt % 0x0a + '0';//小数部分高位vWrite8x16Character(&char_Table['V'-0x20][0],3,112,0);//显示电压单位vWrite8x16Character(&char_Table[j-0x20][0],3,104,0);//显示小数低位vWrite8x16Character(&char_Table[k-0x20][0],3,96,0); //显示小数高位vWrite8x16Character(&char_Table['.'-0x20][0],3,88,0); //显示小数点vWrite8x16Character(&char_Table[i-0x20][0],3,80,0);//显示整数位delay(5000);}}/*******************0804转换程序********************/uchar ADC0804(){ uchar adc0804value;addr0 = 1;addr1 = 1;addr2 = 0;//输出AD0804片选地址。
课程设计报告华中师大学传媒学院传媒技术学院电子信息工程2011仅发布百度文库,所有.AD转换要求:A.使用单片机实现AD转换B.可以实现一位AD转换,并显示(保留4位数字)设计框图:方案设计:AD转换时单片机设计比较重要的实验。
模数转换芯片种类多,可以满足不同用途和不同精度功耗等。
外部模拟量选择的是简单的电位器,通过控制电位器来改变模拟电压。
显示电压值采用一般的四位七段数码管。
而AD转换芯片采用使用最广的ADC0809ADC0809芯片有28条引脚,采用双列直插式封装,如图所示。
下面说明各引脚功能:•IN0~IN7:8路模拟量输入端。
•2-1~2-8:8位数字量输出端。
•ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。
•ALE:地址锁存允许信号,输入端,高电平有效。
•START:A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
•EOC:A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
•OE:数据输出允许信号,输入端,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
•CLK:时钟脉冲输入端。
要求时钟频率不高于640KHz。
•REF(+)、REF(-):基准电压。
•Vcc:电源,单一+5V。
•GND:地工作原理:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
本次实验采用中断方式把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
Proteus学习51单片机之AD转换概述模拟数字转换器(ADC)是将模拟信号转换为数字信号的设备。
我们将在本文中介绍如何在Proteus中使用51单片机进行AD转换。
首先,我们需要了解一些关于ADC的基础知识。
什么是ADC?ADC是模拟数字转换器的缩写。
它是一种将模拟信号( 例如声音或光线)转换为数字信号的设备。
数字信号可以通过数字处理器 例如计算机或嵌入式系统)进行进一步处理。
为什么需要ADC?数字设备不能直接处理模拟信号。
因此,我们需要将模拟信号转换为数字信号,以便数字设备可以处理它。
这就是ADC的作用。
如何使用ADC?ADC一般有以下几个步骤:1.(采样:使用ADC将连续的模拟信号转换为离散的数据点。
2.(量化:将采样结果转换为离散的数字值。
3.(编码:将数字值转换为二进制值。
在51单片机中,ADC转换的基本步骤是:1.(设定ADC电平:在程序中,我们需要将端口设置为读取ADC的电平。
2.(ADC模式设置:通过设定模式,来选择如何采样和量化信号。
3.(读取ADC值:读取ADC的数字输出值。
Proteus中51单片机AD转换的操作步骤下面我们将了解如何在Proteus中使用51单片机进行AD转换。
1.(创建Proteus新工程在Proteus中创建新工程。
从库中选择合适的51单片机,并将其放置在原理图中。
2.(连接一组电压源和电阻连接一组电压源和电阻,以模拟数字模拟转换器(ADC)输入信号。
3.(添加ADC模块前往“Component(Mode” 元器件模式)下,添加ADC模块。
选择合适的ADC元器件,并将其添加到工程中。
4.(连接ADC模块到单片机将ADC模块与单片机相连。
5.(配置ADC将ADC模块属性栏中的ADC模块讯号连接到单片机的相应端口上,设置ADC的属性。
6.(编写程序并上传到单片机根据需要编写程序,并上传到单片机上。
7.(调试调试程序,并检查ADC是否正常工作。
8.(监测ADC输出透过示波器或LED等设备监测ADC的输出值。
51-单片机课程设计题目:用PCF8591P芯片对电位器上的电压进行AD采样,将采到的数据用1602LCD进行显示。
姓名: 学号:学院:专业: 指导教师:目录1、PCF8591概述 (3)2、芯片介绍 (3)3、PCF8591的A/D 转换 (4)4、A/D转换程序设计流程 (5)5、1602LCD主要技术参数 (7)6、Proteus仿真原理图 (10)7、程序代码 (10)8、结语 (17)9、参考文献 (17)1、PCF8591 概述PCF8591 是一种具有 I2C 总线接口的 8 位 A/D D/A 转换芯片,在与 CPU 的信息传输过程中仅靠时钟线 SCL 和数据线 SDA 就可以实现。
I2C 总线是Philips (飞利浦)公司推出的串行总线,它与传统的通信方式相比具有读写方便,结构简单,可维护性好,易实现系统扩展,易实现模块化标准化设计,可靠性高等优点。
2、芯片介绍2.1内部结构及引脚功能描述PCF8591 为单一电源供电(2.5 6 V)典型值为 5 V,CMOS 工艺 PCF8591 有 4 路 8 位 A/D 输入,属逐次比较型,内含采样保持电路; 1 路 8 位 D/A 输出,内含有 DAC的数据寄存器 A/D D/A 的最大转换速率约为 11 kHz,但是转换的基准电源需由外部提供 PCF8591 的引脚功能如图1所示图1 PCF8591引脚功能2.2片内可编程功能设置在 PCF8591 内部的可编程功能控制字有两个,一个为地址选择字,另一个为转换控制字 PCF8591 采用典型的I2C总线接口的器件寻址方法,即总线地址由器件地址引脚地址和方向位组成 Philips (飞利浦)公司规定 A/D器件高四位地址为 1001,低三位地址为引脚地址A0A1A2,由硬件电路决定,地址选择字格式具体描述如表 2 所示因此 I2C 系统中最多可接 23=8 个具有总线接口的A/D 器件地址的最后一位为方向位 R/W,当主控器对 A/D 器件进行读操作时为1,进行写操作时为 0 总线。
51单片机AD转换代码及仿真1. 任务概述本文主要探讨51单片机模拟信号的AD(模数转换)过程以及相关代码的编写和仿真。
通过本文,读者将了解到51单片机的AD转换原理、AD转换的流程、具体代码实现方法以及如何使用仿真软件进行验证和调试。
2. 51单片机的AD转换原理[为了实现模拟信号到数字信号的转换,51单片机内置了一部分模拟数字转换器(ADC)。
ADC是一种电子元器件,它可以将模拟信号转换成数字信号。
模拟信号是连续的,而数字信号是离散的。
模拟信号转换成数字信号的过程叫做AD(模数转换),其原理可以简单描述如下:]1.首先,模拟信号通过模拟输入引脚进入51单片机中的ADC模块。
2.ADC模块将模拟信号进行采样,即对信号进行离散化处理,将离散化后的采样值存储在一个寄存器中。
3.采样值随后会经过数字化处理,变成具有一定精度的数字量。
4.数字量经过处理后,嵌入系统可以根据其数值进行分析、判断和控制。
3. 51单片机的AD转换流程[51单片机的AD转换流程可以分为以下几个步骤:]3.1 设置ADC模块在使用51单片机进行AD转换之前,需要先设置ADC模块的相关参数,如引脚选择、参考电压选择、时钟频率等。
这些设置可通过写入ADC相关的寄存器来完成。
3.2 启动转换设置完成后,可以通过设置一个特定的位来启动AD转换。
一旦AD转换开始,51单片机将根据设置的参数自动进行转换操作。
3.3 等待转换完成在启动AD转换后,需要等待转换完成。
此时,可以通过查询ADC模块的状态位来判断转换是否完成。
3.4 读取转换结果转换完成后,可以通过读取ADC寄存器的值来获取AD转换结果。
这个值将会代表输入模拟信号的数字化数值。
4. 51单片机AD转换的代码实现[以下给出一个简单的51单片机AD转换的代码示例。
本示例假设选用了P1口作为ADC的输入引脚,使用AVCC作为参考电压,时钟频率为12MHz。
]#include <reg52.h>// 引入51单片机的头文件sbit ADC_IN = P1^0; // 定义P1.0为ADC输入引脚void ADC_Init() {// 设置ADC参考电压为AVCCADMUX = (1<<REFS0);// 设置ADC输入通道为ADC0(P1.0)ADMUX |= (1<<MUX0);// 启用ADC模块,设置ADC时钟频率为F_CPU/8ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);}unsigned int ADC_Read() {unsigned int adc_value = 0;// 设置ADC转换开始位ADCSRA |= (1<<ADSC);// 等待转换完成while (ADCSRA & (1<<ADSC));// 读取ADC寄存器的值adc_value = ADCL;adc_value |= (ADCH<<8);return adc_value;}void main() {unsigned int adc_result = 0;ADC_Init(); // 初始化ADC模块while (1) {adc_result = ADC_Read(); // 读取ADC转换结果// 在此处对结果进行处理或输出}}在以上示例代码中,首先通过ADC_Init()函数对ADC进行初始化设置。
单片机ad转换的原理
单片机AD转换的原理是根据输入电压的大小,通过一定的电路和算法将其转换为对应的数字信号。
其基本流程如下:
1. 参考电压的选择:首先需要确定一个参考电压,用于将输入电压映射到数字量。
单片机通常提供一个内部或外部的参考电压源,可以选择适合应用需求的参考电压。
2. 采样保持电路:在转换开始之前,需要对输入电压进行采样并保持其值稳定。
这通常通过一个采样保持电路来实现,它会将输入电压的瞬时值转换为一个持续的电压供给转换电路。
3. 转换电路:转换电路通常是由一组比较器、计数器和控制逻辑组成。
在采样保持电路稳定后,转换电路开始工作。
它以参考电压为基准,将输入电压与一系列离散的电压级别进行比较,然后确定输入电压所对应的数字值。
4. 输出数字信号:转换电路根据比较结果,将对应的数字值输出,通常以二进制形式表示。
这个数字信号可以与其他单片机模块进行数据传输、处理和控制。
需要注意的是,AD转换存在一定的精度和分辨率,即能够准
确表示输入电压的范围和精度。
根据单片机型号和应用需求的不同,AD转换的位数(最高位数)和精度(有效位数)会有
所不同。
OE EQU P1.0//给特定的符号名赋值EOC EQU P1.1ST EQU P1.2CLK EQU P1.3SHU EQU 30HTEMP EQU 31HORG 0000H ;起始指令AJMP MAINORG 000BHCPL CLK ;i这是在定时器中翻转CLK,也就是给ADC提供时钟。
RETIORG 0100HMAIN:MOV SP,#60H ;这个是设置堆栈的位置,否则默认的堆栈肯定会被冲掉MOV TMOD,#02H ;设置T0工作于外启动,定时,方式2MOV TH0,#14HMOV TL0,#00H ;给定时器赋初值,X=M-T/TmMOV IE,#82H ;IE初始化SETB TR0 ; 启动定时器T0MOV A,#3FHMOV P1,A ;选通模拟量输入通道3MOV SHU,#0SCAN:CLR STSETB STCLR ST ;人为地在ST引脚上产生脉冲,给ADC一个开始脉冲,告诉它启动AD 转化M0: JNB EOC,M0 ;EOC是AD转换结束的标志,可作为转换结束中断的请求信号SETB OE ; OE是数字量输出允许信号输入,高电平有效MOV A,#0FFHMOV P3,AM1: MOV A,P3MOV SHU,A ;把转换出来的数给SHULCALL CHANGELCALL DISPCLR OE ;使能ADC,让它能够工作,看来这个ADC是低电平使能AJMP SCANDISP:MOV R0,#TEMPMOV R2,#00HDISP1:MOV A,R2MOV DPTR,#TAB1MOVC A,@A+DPTRMOV P2,A ;把选通的那一个管的数给P2口MOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTR ;取字符MOV P0,A ;A就输出MOV R5,#5ACALL DELAYINC R0INC R2CJNE R2,#3,DISP1 ;扫描显示MOV P0,#00HRETCHANGE: ;把数字分成百、十和个位MOV A,SHUMOV B,#100DIV ABMOV TEMP,AMOV A,BMOV B,#10DIV ABMOV TEMP+1,AMOV TEMP+2,BRETDELAY: ;延时MOV R6,#1DELAY0:MOV R7,#100DJNZ R7,$DJNZ R6,DELAY0DJNZ R5,DELAYRETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;字形码表TAB1: DB 0FDH,0FBH,0F7H ;选通数吗管的通道END。
ad模数转换51单片机程序流程下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!引言AD模数转换是数字系统设计与嵌入式系统开发中常常遇到的问题,其原理和应用十分重要。
课程设计报告华中师范大学武汉传媒学院传媒技术学院电子信息工程2011仅发布百度文库,版权所有.AD转换要求:A.使用单片机实现AD转换B.可以实现一位AD转换,并显示(保留4位数字)设计框图:方案设计:AD转换时单片机设计比较重要的实验。
模数转换芯片种类多,可以满足不同用途和不同精度功耗等。
外部模拟量选择的是简单的电位器,通过控制电位器来改变模拟电压。
显示电压值采用一般的四位七段数码管。
而AD转换芯片采用使用最广的ADC0809ADC0809芯片有28条引脚,采用双列直插式封装,如图所示。
下面说明各引脚功能:•IN0~IN7:8路模拟量输入端。
•2-1~2-8:8位数字量输出端。
•ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。
•ALE:地址锁存允许信号,输入端,高电平有效。
•START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
•EOC: A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
•OE:数据输出允许信号,输入端,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
•CLK:时钟脉冲输入端。
要求时钟频率不高于640KHz。
•REF(+)、REF(-):基准电压。
•Vcc:电源,单一+5V。
•GND:地工作原理:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC 变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
本次实验采用中断方式把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。
首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。
采用中断可以减轻单片机负担。
并可以使程序有更多的空间作二次开发。
硬件原理图:程序流程图:仿真图:制作实物图:AD转换模块:最小系统及显示:整体效果:调试最多的是数码管显示问题扫描太慢显示会太暗和有闪烁问题,通过不断改变延迟来调整达到最佳状态。
心得体会:通过这次的实验设计特别是前期的电路设计,和芯片选择以及后期的实物焊接。
对我们专业的电路认识了很多,学到了很多。
做一个东西要选择你要的芯片的,你必须要先了解一些大体的东西当你选择好后你更要全面了解它的性能。
对于单片机硬件来说要了解芯片,你要如何去驱动他来满足你的要求。
这对于编程和看懂芯片的时序有着高要求。
毕竟现在硬件更新换代太快,必须要学习怎么去设计去编写你要的程序来控制它。
这是我这次实验最深刻的理解。
这次实验也培养了我团队合作能力积极主动沟通,遇到问题一起解决。
对于现在的我们即将走出校门的人来说意义重大。
同时这次实验也大大拓宽了我的视野我还有很多东西要去理解去学习。
#include <reg51.h> // 引用标准库的头文件#include <intrins.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned intuint temp=0;sbit ST=P3^6; //启动信号sbit EOC=P3^3; //转换结束信号,连到外部中断1口,转换结束后进入外部中断sbit OE=P3^7; //输出使能//sbit ls=P2^7;sbit dig_hc595_sh_dr=P1^7; //数码管的74HC595程序sbit dig_hc595_st_dr=P1^6;sbit dig_hc595_ds_dr=P1^5;void initial_myself();void initial_peripheral();void delay_short(unsigned int uiDelayShort);void delay_long(unsigned int uiDelayLong);//void display_service();void display_drive();void dis_service(int temp);//unsigned char ucDigShow8; //第8位数码管要显示的内容//unsigned char ucDigShow7; //第7位数码管要显示的内容//unsigned char ucDigShow6; //第6位数码管要显示的内容//unsigned char ucDigShow5; //第5位数码管要显示的内容unsigned char ucDigShow4; //第4位数码管要显示的内容unsigned char ucDigShow3; //第3位数码管要显示的内容unsigned char ucDigShow2; //第2位数码管要显示的内容unsigned char ucDigShow1; //第1位数码管要显示的内容unsigned char code dig_table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char ucDigShowTemp=0; //临时中间变量unsigned char ucDisplayDriveStep=1; //动态扫描数码管的步骤变量void dig_hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);main(){initial_myself();//初始化单片机delay_long(100);initial_peripheral(); //初始化外围while(1){P0=0xff;ST=0;ST=1;ST=0;// 启动A/D转换while(EOC==0);OE=1;//EA=0;//temp=0xff;dis_service(temp);//EA=0;display_drive();//显示电压值//delay_long(1);//EA=1;OE=0;}}void dis_service(int temp){int Tp=0;Tp=temp*1.0/255*500;ucDigShow1 = dig_table[Tp / 1000];ucDigShow2 = dig_table[Tp % 1000 / 100] | 0x80;ucDigShow3 = dig_table[Tp % 100 / 10] ;ucDigShow4 = dig_table[Tp % 10 / 1];}void display_drive()//显示电压值{uchar i=1;for(i=1;i<5;i++){ switch(i){case 1: //显示第1位ucDigShowTemp=ucDigShow1;dig_hc595_drive(ucDigShowTemp,0xfe);break;case 2: //显示第2位ucDigShowTemp=ucDigShow2;dig_hc595_drive(ucDigShowTemp ,0xfd);break;case 3: //显示第3位ucDigShowTemp=ucDigShow3;dig_hc595_drive(ucDigShowTemp,0xfb);break;case 4: //显示第4位ucDigShowTemp=ucDigShow4;dig_hc595_drive(ucDigShowTemp,0xf7);break;/*case 5: //显示第5位ucDigShowTemp=ucDigShow5;dig_hc595_drive(ucDigShowTemp,0xef);break;case 6: //显示第6位ucDigShowTemp=ucDigShow6;dig_hc595_drive(ucDigShowTemp,0xdf);break;case 7: //显示第7位ucDigShowTemp=ucDigShow7;dig_hc595_drive(ucDigShowTemp,0xbf);break;case 8: //显示第8位ucDigShowTemp=ucDigShow8;dig_hc595_drive(ucDigShowTemp,0x7f);break; */}}}//数码管的74HC595驱动函数void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01){unsigned char i;unsigned char ucTempData;dig_hc595_sh_dr=0;dig_hc595_st_dr=0;ucTempData=ucDigStatusTemp16_09; //先送高8位for(i=0;i<8;i++){if(ucTempData>=0x80)dig_hc595_ds_dr=1;else dig_hc595_ds_dr=0;dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器delay_short(1);dig_hc595_sh_dr=1;delay_short(1);ucTempData=ucTempData<<1;}ucTempData=ucDigStatusTemp08_01; //再先送低8位for(i=0;i<8;i++){if(ucTempData>=0x80)dig_hc595_ds_dr=1;else dig_hc595_ds_dr=0;dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器delay_short(1);dig_hc595_sh_dr=1;delay_short(1);ucTempData=ucTempData<<1;}dig_hc595_st_dr=0; //ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来delay_short(1);dig_hc595_st_dr=1;delay_short(1);dig_hc595_sh_dr=0; //拉低,抗干扰就增强dig_hc595_st_dr=0;dig_hc595_ds_dr=0;}void delay_short(unsigned int uiDelayShort){unsigned int i;for(i=0;i<uiDelayShort;i++){;}}void delay_long(unsigned int uiDelayLong){unsigned int i;unsigned int j;for(i=0;i<uiDelayLong;i++){for(j=0;j<500;j++){;}}}void initial_myself(){P0=0xff;P1=0xff;P2=0xff;P3=0xff;TMOD=0x02;//T1工作模式2TH0=0x14;TL0=0x00;}void initial_peripheral() //初始化外围{IE=0x82; //IE.7位为1表示CPU开放中断,IE.1位也为1,表示允许定时器T0溢出中断TR0=1; //使能定时器P0=0xff; //选择ADC0809的通道7(111)(P1.0~P1.2)//ls=0;ST=0;OE=0;IT1=1; //下降沿触发EX1=1; //使能外部中断1EA=1; //允许全局中断}void counter1(void) interrupt 2 using 2{EX1=0;temp=P0;//temp=0xfe;EX1=1;}。