6.2-AD转换操作+数码管显示
AD转换的数码管显示
AD转换的数码管显示*本例程采用AD0804 芯片,硬件电路:cs 片选端接P2.3,WR 写数据端写P3.6,RD 读数据端接P3.7,锁存端接P2.6 脚,数码管位选端分别接P3.2,P3.3,P3.4,段选端接P1 口*/#includereg52.h//头文件#define uint unsigned int//宏文件#define uchar unsigned char//宏文件uchar num;//变量void delay3(uint z); //延时定义void dissy();//延时函数定义sbit ge=P3 ;//个位定义sbit shi=P3;//十位定义sbit bai=P3;//百位定义sbit ad_cs=P2;//片选端sbit ad_wr=P3;//写数据端sbit ad_rd=P3;//读数据端sbit pian=P2;//锁存器片选void add();//ad 转换子函数void delay(uint i);//延时子函数申明uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86, 0x8e};//数组/************主函数**********/void main(){while(1){add();//调用AD 转换子函数dissy();//数码管显示子函数} }/************AD 转换子函数**********/void add()//AD 转换子函数{uchar i;ad_cs=1;//将片选关闭ad_cs=0;//将片选打开ad_wr=1;//写数上升沿ad_wr=0;//写数下降沿ad_wr=1;//写数上升沿P1=0xff;//送数到P0 口ad_rd=1;//读数上升沿delay(25);//延时一会儿ad_rd=0;//读数下降沿//////**************因为AD 转换时间周期长,我现在的数码管没有采用锁存器,AD 转换时间大于显示时间,所以显示时会闪烁,解决此问题方法是,连续调用了显示子程序七次,这样显示时就和AD 转换时一至,显示出来的数就不闪了********************//////for(i=0;i7;i++)//调用7 次,相当于delay(255)void dissy();//////**********************************//////num=P1;//将数给计数器num}/************显示子函数**********/void dissy()//显示子函数{P0=table[num/100];//百位显示数据bai=0;//百位打开delay(14);//延时一会bai=1;//。
ad 转换原理
ad 转换原理
AD转换原理是指将模拟信号转换为数字信号的过程。
这个过
程由三个主要步骤组成:采样、量化和编码。
首先是采样步骤。
在采样过程中,模拟信号被定期测量和记录,生成一系列离散的采样值。
这些采样值表示了模拟信号在不同时刻的幅度。
然后是量化步骤。
在量化过程中,采样值被映射为一组离散的量化级别。
通过将采样值分配给最接近的量化级别,模拟信号的幅度被近似表示为离散数值。
这个过程引入了量化误差,即原始模拟信号与量化表示之间的差异。
最后是编码步骤。
在编码过程中,量化后的信号通过数字编码器转换为二进制码字。
编码器将每个量化级别映射为一个二进制代码,以便数字信号可以被存储和传输。
常见的编码方法包括二进制、格雷码和翻转码等。
通过AD转换,模拟信号可以被数字系统处理和分析。
然而,由于采样频率和量化分辨率的限制,AD转换引入了采样误差
和量化误差。
合理选择采样频率和量化分辨率可以平衡系统的复杂性和信号质量。
总结而言,AD转换原理包括采样、量化和编码三个步骤,它
们共同将模拟信号转换为数字信号,实现了模拟和数字之间的转换。
这个过程在许多领域中广泛应用,如通信、音频处理、图像处理等。
Altium Designer 2013案例教程- 第10讲 项目7 数码管显示电路原理图
2. 安装项目5建立的集成库文件:New Integrated_Library1.IntLib
(1)如果用户需要添加新的库文件,单击图7-3中库面板的 Libraries按钮,弹出Available Libraries对话框如图7-7所示。
(2)在Available Libraries对话框中,单击Install按钮,弹出打 开路径的对话框如图7-8所示,选择正确的路径,双击需要安装的库 名即可。
图7-7 安装库文件对话框
图7-8 安装库文件
7.1.3 放置元件
用项目2 介绍的方法放置元件。表7-1给出了该电路中每个元件样本、元件 标号、元件名称(型号规格)、所在元器件库等数据。注意在放置元件的时 候,一定要注意该元件的封装要与实物相符。
表7-1
数码管显示电路元器件数据
元件样本 AT89C2051
(2)用同样的方法将C2封装改为:RAD-0.1;将C3封装改为:CAPR55×5; 将C4封装改为:RB5-10.5。
在原理图内也可以不修改元器件的封装,用缺省的值。然后在PCB板 内,根据实际元器件的尺寸修改封装。
图7-9 为选中元件选择相应的模型
2.放置好元器件位置的数码管电路原 理图如图7-12所示。
9013 12MHz 30pF 10uF/10V 220uF/10V 10K 5K 1K 300
Miscellaneous Devices.IntLib Miscellaneous Devices.IntLib Miscellaneous Devices.IntLib Miscellaneous Devices.IntLib Miscellaneous Devices.IntLib Miscellaneous Devices.IntLib Miscellaneous Devices.IntLib Miscellaneous Devices.IntLib Miscellaneous Devices.IntLib Miscellaneous Connectors.IntLib
单片机ad转换原理
单片机ad转换原理单片机AD转换原理。
单片机(Microcontroller)是一种集成了微处理器、存储器和各种输入输出设备的微型计算机系统。
在很多电子设备中,单片机都扮演着至关重要的角色。
而AD转换(Analog to Digital Conversion)则是单片机中非常重要的功能之一,它可以将模拟信号转换为数字信号,使得单片机可以对外部的模拟信号进行采集和处理。
本文将介绍单片机AD转换的原理及相关知识。
AD转换的原理是利用单片机内部的模数转换器(ADC)来实现的。
模数转换器是一种将模拟信号转换为数字信号的电路,它可以将模拟信号的大小转换为相应的数字值。
在单片机中,模数转换器可以通过一定的采样和量化过程,将模拟信号转换为数字信号,并输出到单片机的数据总线上,以便单片机进行进一步的处理。
在进行AD转换时,首先需要对模拟信号进行采样。
采样是指在一定时间间隔内对模拟信号进行取样,获取其大小。
这样可以将连续的模拟信号转换为离散的信号。
然后,对采样后的信号进行量化。
量化是指将连续的模拟信号转换为一系列离散的数字值。
在单片机中,量化通常是按照一定的精度和分辨率进行的,精度越高,分辨率越大,转换后的数字值越接近原模拟信号的真实数值。
单片机中的ADC模块通常由输入端、采样保持电路、比较器、计数器、数字转换器和控制逻辑等部分组成。
当单片机需要进行AD转换时,首先需要将模拟信号输入到ADC的输入端,然后ADC会对输入信号进行采样和量化,最终输出转换后的数字信号。
在这个过程中,ADC的控制逻辑会根据预设的转换精度和采样频率等参数,控制ADC的工作状态,以保证转换的准确性和稳定性。
在实际应用中,单片机的AD转换功能被广泛应用于各种测控系统、仪器仪表、传感器等领域。
通过AD转换,单片机可以对外部的模拟信号进行采集和处理,实现数据的数字化和处理,为系统的控制和监测提供了重要的支持。
同时,单片机的AD转换功能也为各种信号处理算法和数字信号处理提供了基础,为系统的功能和性能提升提供了可能。
杭电微机原理AD转换DA转换实验实验报告
微型计算机原理与接口技术实验报告班级:学号:姓名:指导老师:朱亚萍实验名称: A/D转换实验D/A转换实验(一)D/A转换实验(二)实验一A/D转换实验一、实验目的了解模/数转换基本原理,掌握ADC0809的使用方法。
二、实验内容利用实验系统上电位器提供的可调电压作为0809模拟信号的输入,编制程序,将模拟量转换为数字量,通过数码管显示出来。
三、实验接线图图 1-1四、编程指南1. ADC0809的START端为A/D转换启动信号,ALE端为通道选择地址的锁存信号,实验电路中将其相连,以便同时锁存通道地址并开始A/D采样转换,其输入控制信号为CS和WR,故启动A/D转换只须如下两条指令:MOV DX, ADPORT OUT DX, AL ;ADC0809端口地址;发CS和WR信号并送通道地址2.用延时方式等待A/D转换结果,使用下述指令读取A/D转换结果:MOV DX, ADPORTIN AL, DX;ADC0809端口地址五、实验程序框图图 1-2六、实验步骤1.断电连接导线, 将0809 CS4插孔连到译码输出FF80H插孔,将通道0模拟量输入端IN0连电位器W1的中心插头AOUT1(0-5V)插孔,8MHZ→T;2. 在PC机和实验系统联机状态下,新建实验程序,编辑完成后进行保存(保存后缀为.asm文件);3. 编译下载;4. 全速运行,运行程序;5. 按RST键退出。
七、实验程序DATA SEGMENTBUF DB 6 DUP(0)DATA1: DB0c0h,0f9h,0a4h,0b0h,99h,DB 92h,82h,0f8h,80h,90h,DB88h,83h,0c6h,0a1h,86h,DB8eh,0ffh,0ch,89h,0deh,DB0c7h,8ch,0f3h,0bfh,8fhDATA ENDSCODE SEGMENTASSUME CS: CODE,DS: DATAADC EQU 0FF80H; ADC0809端口地址PA EQU 0FF20HPB EQU 0FF21HPC EQU 0FF22H MAIN PROC FAR START: MOV AX, DATA MOV DS, AXMOV ES, AX ADC_S:MOV AX, 00HMOV DX, ADCOUT DX, ALMOV CX, 0500H DELAY:LOOP DELAYMOV DX, ADPORT IN AL, DXCALL CONVERS CALL DISPJMP ADC_S MAIN ENDPCONVERS PROC NEARMOV AH, AL3.循环不断采样A/D转换的结果,边采样边显示A/D转换后的数字量。
实验二 数码管显示
实验二数码管显示本实验的目的是掌握数码管的工作原理与使用,实现数码管的静、动态显示。
静态数码管我们先看看什么是数码管,上图就是各种长相各种样子的数码管了,肯定很眼熟了吧。
不管将几位数码管连在一起,数码管的显示原理都是一样的,都是靠点亮内部的发光二极管来发光,下面就来我们讲解一个数码管是如何亮起来的。
数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是10个,显示一个8字需要7个小段,另外还有一个小数点,所以其内部一共有8个小的发光二极管,最后还有一个公共端,生产商为了封装统一,单位数码管都封装10个引脚,其中第3和第8引脚是连接在一起的。
而它们的公共端又可分为共阳极和共阴极,中间图为共阴极内部原理图,右图为共阳极内部原理图。
上图展出了常用的两种数码管的引脚排列和内部结构。
总所周知,点亮发光二极管就是要给予它足够大的正向压降。
所以点亮数码管其实也就是给它内部相应的发光二极管正向压降。
如上图左(一共a、b、c、d、e、f、g、DP 八段),如果要显示“1”则要点亮b、c 两段LED;显示“A”则点亮a、b、c、e、f、g 这六段LED;我们还知道,既然LED 加载的是正向压降,它的两端电压必然会有高低之分:如果八段LED 电压高的一端为公共端,我们称之为共阳极数码管(如上图中);如果八段LED 电压低的一段为公共端,则称之为共阴极数码管(上图右)。
所以,要点亮共阳极数码管,则要在公共端给予高于非公共端的电平;反之点亮共阴极数码管,则要在非公共端给予较高电平。
对共阴极数码来说,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称“共阴”,而它们的阳极是独立的,通常在设计电路时一般把阴极接地。
当我们给数码管的任意一个阳极加一个高电平时,对应的这个发光二极管就点亮了。
如果想要显示出一个8字,并且把右下角的小数点也点亮的话,可以给8个阳极全部送高电平,如果想让它显示出一个0字,那么我们可以除了给第“g, dp”这两位送低电平外,其余引脚全部都送高电平,这样它就显示出0字了。
数码管显示AD
Results[index++] = (ADC12MEM0>>3); // Move results, IFG is cleared
if(index == 32)
{
uchar i;
__interrupt void watchdog_timer(void)
{
P5OUT = 0xff;
P4OUT = scandata[DispBuf[cnt]]; //输出段选信号
P5OUT &= ~(1 << cnt); //输出位选信号
Average = 0;
for(i = 0; i < 32; i++)
Average += Results[i];
Average >>=5;
DispBuf[0] = Average / 1000; //更新数码管显示
uchar DispBuf[4] = {0,0,0,0};
//记录显示位数的全局变量
uchar cnt = 0;
void main(void)
{
WDTCTL = WDT_MDLY_0_5; // 设置内部看门狗工作在定时器模式,1.9ms中断一次0.5
函数名称:watchdog_timer
功 能:看门狗中断服务函数,在这里输出数码管的
段选和位选信号
参 数:无
返回值 :无
********************************************/
#pragma vector=WDT_VECTOR
ADC12CTL0 = ADC12ON + SHT0_15 + MSC; // Turn on ADC12, set sampling time
数码管显示两路AD转换结果(按照书上整理后的完整代码)
#define F_CPU 4000000UL //4 MHZ#include<avr/io.h>#include<util/delay.h>#define INT8U unsigned char#define INT16U unsigned int//各数字的数码管段码,最后一位为空白const INT8U SEG_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF}; //两路模拟转换结果显示缓冲,显示格式为:X.XX X.XX ,第4位和第8位不显示INT8U Display_Buffer[]={0,0,0,10,0,0,0,10};//___________________________________________//对通道CH进行模拟数字转换void ADC_Convert(INT8U CH){int Result;ADMUX=CH; //ADC通道选择//读取转换结果,并转换为电压值Result=(int)((ADCL+(ADCH<<8))*500.0/1023.0);//或使用语句:Result=(int)(ADC*500.0/1023.0);//ADC0的结果放入数组0、1、2单元,ADC1的结果放入数组4、5、6单元Display_Buffer[CH*4]=Result/100;Display_Buffer[CH*4+1]=Result/10%10;Display_Buffer[CH*4+2]=Result%10;}//主函数int main(){INT8U i;DDRA=0xFC;//配置AD转换端口ADC0、ADC1为输入DDRC=0xFF;PORTC=0x00;//配置数码管显示端口DDRD=0xFF;PORTD=0x00;ADCSRA=0xE6;//ADC转换置位,启动转换,64分频_delay_ms(3000);//延时等待系统稳定while(1){ADC_Convert(0);ADC_Convert(1);//对2个通道进行A/D转换for(i=0;i<8;i++){PORTC=0xFF;//先关闭段码PORTD=_BV(i);//发送数码管位码PORTC=SEG_CODE[Display_Buffer[i]];//发送数字段码if(i==0||i==4)PORTC&=0x7F;//对整数位加小数点_delay_ms(4);}} }。
数码管显示AD转换的电压值数码管显示秒表
电子科技大学微电子与固体电子学院实验报告实验名称现代电子技术综合实验姓名:詹朋璇学号:评分:教师签字电子科技大学教务处制电子科技大学实验报告学生姓名:詹朋璇学号:指导教师:熊万安实验地点: 211大楼308 实验时间:2014. 晚一、实验室名称:单片机技术综合实验室实验项目名称:数码管显示A/D转换的电压值&数码管显示秒表二、实验学时: 12三、实验目的与任务:1、熟悉系统设计与实现原理2、掌握KEIL C51的基本使用方法3、熟悉实验板的应用4、连接电路,编程调试,实现各部分的功能5、完成系统软件的编写与调试四、实验器材1、PC机一台2、实验板一块五、实验原理、步骤及内容试验要求:数码管的第1位显示任务号1,第3位到第5位显示、A/D转换的电压值,可调节电压,第7、8位显示两位学号;数码管第2位和第6位显示“-”号;按按键key1进行切换,此时数码管第1位显示任务号2,第7、8位显示循环倒计时的秒表,范围为08秒到01秒后,再过01秒,秒表又显示为08秒;(单片机系统中利用定时器/计数器计数秒表的值:利用定时器T0延时1秒进行计数。
),其它位显示不变,按按键key2时,秒表停止计数,再按按键key2时,秒表继续计数,按key1键,又回到任务1的显示状态。
当电压值大于2伏时,按按键不起作用。
1、硬件设计(可打印)2、各部分硬件原理(可打印)数码管动态扫描TLS549ADC工作时序图3、软件设计按下出中断服务程序。
答:将KEY1与KEY2键通过跳线分别接到INT0与INT1接口上。
开启中断:SysInit(){ …EA=0; 用单片机开发板上丰富的资源可以实现一个有一定功能的系统。
2.懂得利用中断可以使单片机的效率提高。
六、对本实验过程及方法、手段的改进建议实在是没有,都挺好的。
七、附录1、程序/*利用TLC549 A/D转换器实现电压测量与显示*/#include <> //包含8051的SFR寄存器定义头文件#include <> //扩展并行接口所需的绝对地址访问库函数#define LED_dig XBYTE[0x9000] //8位数码管显示器的位选输出控制#define LED_seg XBYTE[0x8000] //8位数码管显示器的段码(字形码)输出控制#define KEY_IN XBYTE[0x8000]//定义TLC549操作接口sbit ADC_CS = P1^7;sbit ADC_DATA = P1^6;sbit ADC_CLK = P1^5;code unsigned char disp_seg[]= //显示段码{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5f,0x79,0x71,0x40,0x00,0xff};// 0 1 2 3 4 5 6 7 8 9 a b c d e f - blank,全亮unsigned char DispBuf[8]; //定义显示缓冲区(由定时中断程序自动扫描)unsigned char key_value,flag;//定义键盘返回值,任务标志unsigned char y1000,y100,y10,y;//定义秒表的个位,十分位,百分位,千分位unsigned short mbiao;//定义秒表计数单元void delay(int ms); //延时大约1msunsigned char ReadAdc(void);//读取A/D转换结果void AdcInit(void); //初始化ADC接口void key_scan(void);void main(){unsigned char i=0;unsigned char volt, x100, x10, x;TMOD &= 0x0f;TMOD |= 0x10;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;ET1 = 1;TMOD &= 0xf0;TMOD |= 0x01;TH0 = 0xFC;TL0 = 0x66;TR0 = 1;ET0 = 1;EA =1;AdcInit();for(i=0; i<8; i++)DispBuf[i] = 17; //全部8位显示灭 y1000=9;y100=9;y10=9;y=9;mbiao=9999;flag=0;while(1){while(flag ==0){volt = ReadAdc(); //得到A/D转换结果的数字量(0x00~0xff)volt = volt * 250/256; //转换成电压值,其中Vr=x100 = volt/100;x10 = (volt - x100*100)/10;x = (volt - x100*100)%10;DispBuf[0] = 4;DispBuf[1] = 2;DispBuf[2] = 16;DispBuf[3] = x;DispBuf[4] = x10;DispBuf[5] = x100;DispBuf[6] = 16;DispBuf[7] = 1;delay(100);if(key_value == 8&&volt<=200){flag = 1;mbiao=9000;while(key_value == 8);}}while(flag==1){TR0=1;volt = ReadAdc();volt = volt * 250/256; //转换成电压值,其中Vr=x100 = volt/100;x10 = (volt - x100*100)/10;x = (volt - x100*100)%10;DispBuf[0] = y1000;DispBuf[1] = 0;DispBuf[2] = 16;DispBuf[3] = x;DispBuf[4] = x10;DispBuf[5] = x100;DispBuf[6]=16;DispBuf[7]=2;if(key_value == 8&&volt<=200){flag = 0;while(key_value == 8);}else if(key_value == 7&&volt<=200){flag = 2;while(key_value == 7);}}while(flag==2){TR0=!TR0;if(key_value == 7){flag = 1;while(key_value == 7);} }}}/*函数:T1INTSVC()功能:定时器T1的中断服务函数*/void T1INTSVC() interrupt 3{code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};static unsigned char n = 0;TR1 = 0;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;LED_dig = 0xFF; //暂停显示if(flag==0){if(n==5)LED_seg = ~(disp_seg[DispBuf[n]]|0x80);elseLED_seg = ~disp_seg[DispBuf[n]];//更新扫描数据}if(flag==1){ if(n==5)LED_seg = ~(disp_seg[DispBuf[n]]|0x80);elseif(n==4)LED_seg = ~( disp_seg[DispBuf[n]] ); //更新扫描数据,elseLED_seg = ~disp_seg[DispBuf[n]]; //更新扫描数据 }if(flag==2){LED_seg = ~disp_seg[DispBuf[n]]; //更新扫描数据 }LED_dig = ~com[n]; //重新显示key_scan();n++;n &= 0x07;}void delay(int ms){unsigned int i,j;for(i=0; i<ms; i++) //延时大约1ms (fosc= {for(j=0; j<100; j++);}}/*函数:ReadAdc()功能:读取A/D转换结果返回:8位ADC代码*/unsigned char ReadAdc(void){unsigned char d; //读取得ADC结果unsigned char n; //ADC bit位计数ADC_CS = 0;n = 5;while ( --n != 0 ); //模拟tsu时间n = 8;do{d <<= 1;if ( ADC_DATA )d = d | 0x01; //或d++;ADC_CLK = 1;ADC_CLK = 0;}while ( --n != 0 );ADC_CS = 1;return d;}/*函数:AdcInit()功能:初始化ADC接口*/void AdcInit(void){ADC_CS = 1;ADC_CLK = 0;ADC_DATA = 1;ReadAdc(); //空读一次,用于启动一次A/D转换过程}void key_scan(void){unsigned char key_in;key_in = KEY_IN;switch(key_in){case 0xff:key_value = 0;break;case ~0x01:key_value = 1;break;case ~0x02:key_value = 2;break;case ~0x04:key_value = 3;break;case ~0x08:key_value = 4;break;case ~0x10:key_value = 5;break;case ~0x20:key_value = 6;break;case ~0x40:key_value = 7;break;case ~0x80:key_value = 8;break;default:break;}}/*函数:T1INTSVC()功能:定时器T0的中断服务函数*/void T0INTSVC() interrupt 1 {TR0 = 0;TH0 = 0xFC;TL0 = 0x66;TR0 = 1;if(mbiao<=9000&&TR0==1)mbiao=mbiao-1;if(mbiao==0)mbiao=9000;y1000=mbiao/1000;y100=(mbiao-y1000*1000)/100;y10=(mbiao-y1000*1000-y100*100)/10;y=(mbiao-y1000*1000-y100*100)%10;}。
郭天祥ad转换显示程序
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit wr=P3^6;sbit rd=P3^7;sbit cs=P0^7;sbit fm=P2^4;sbit wela=P2^7;sbit dula=P2^6;uchar temp,temp1,a,b,c,d;uchar i;uchar code table[]={ //数码管显示编码,郭天祥单片机0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code table1[]={ //数码管显示编码,郭天祥单片机0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void ADchange() //AD转换部分{wela=1;P0=0x7f;P1=0xff;wela=0;wr=1;wr=0;delay(1);wr=1;rd=1;rd=0;delay(1);temp=P1;rd=1;wela=1;P0=0xff;wela=0;temp=temp*2;temp1=temp*1.0/255*500;a=temp1/1000;//取shi位数b=temp1/100%10;//取ge位数c=temp1/10%10;//十分位d=temp1%10;//百分位}void display()//显示部分{wela=1;P0=0xff;wela=0;/* dula=1;P0=table[a];dula=0;wela=1;P0=0x7e;wela=0;delay(5);*/dula=1;P0=table1[b];dula=0;wela=1;P0=0x7d;wela=0;delay(5);dula=1;P0=table[c];dula=0;wela=1;P0=0x7b;wela=0;delay(5);/*dula=1;P0=table[d];dula=0;wela=1;P0=0x77;wela=0;delay(10); */}void main(){while(1){ADchange();if(a!=0)fm=0;elsefm=1;display();;}}教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。
STC单片机内部ADC采集电压用数码管显示
STC单片机内部ADC采集电压用数码管显示STC单片机内部ADC采集电压用数码管显示/////////////////////////////////////////////////////////////////// /////////////////////////////////// ///特点:/// ///1、数码管显示用中断方式/// ///2、STC12C5A60S2内ADC采样电压值,先采样30次然后去掉上下10个再取平均值/// ///3、采集数据用串口发送到PC /// ///------------------------------------------------------------------------shenzhen---iqss----2011/02/23--------/////////////////////////////////////////////////////////////////////////// //////////////////////////////#include#define uchar unsigned char#define uint unsigned int#define segp P0#define scanp P2uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //不带点段驱动信号uchar code tab_d[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带点段驱动uchar code scan[]={0xfe,0xfd,0xfb,0xf7}; //位扫描驱动信号uint display[4]={0,0,0,0}; //初始显示数字uint con=0, _data=0,data2=0; //con显示循环变量_data为ADC采样值临时变量data显示数据临时变量sfr P1ASF=0x9d; //下面五行为ADC定义sfr ADC_CONTR=0xbc;sfr ADC_RES=0xbd;sfr ADC_RESL=0xbe;sfr AUXR1=0xa2;void t0_t1_init(); //t0显示扫描定时器和t1串口比特率定时器初始化函数void adc_init(); //adc初始化函数void uart_out(uchar byte); //串口发送字节函数uint average(uint buffer[30]); //采样数据处理函数void AD(); //电压采样30次函数void delay1ms(uchar x); //延时函数void main(){t0_t1_init();adc_init();while(1){AD();}}/////////定时器初始化///////void t0_t1_init(){ SCON=0x50;PCON=0;TMOD=0x21;TH1=TL1=0xe6;TH0=0xf0;TL0=0x60;EA=ET0=1;// ES=1;TR1=1;TR0=1;}/////ADC初始化///////void adc_init(){ P1ASF=0x01; //启动P10为ADC模拟输入口把内部上拉电阻断开AUXR1 &= 0xfb; //adrj_0 高8位在ADC_RESADC_RES=0; //初值ADC_CONTR=0x80; //开启ADC电源SPEED_1_1,chs000(选择AD采样通道p10) delay1ms(2);// IE|=0xa0;}//////采集30次电压值//////void AD(){ char i;uint temp_buf[30]={0};for(i=0;i<30;i++){ ADC_CONTR |=0x08; //开启转换while((ADC_CONTR&0x10)==0);ADC_CONTR &=0xe7; //清除标志temp_buf[i]=ADC_RES; //取出数值到temp_buf}_data=average(temp_buf); //采样30次后的数据代入处理函数处理后返回处理后的数值,给下面用串口发送出去uart_out(_data);}/////先对整个数组的三十个值进行从小到大的排列,/////////再去掉最大5个和最少5个再求平均值;函数返回temp值/// uint average(uint buffer[30]){uchar i,j;uint temp;for(i=1; i<30; i++)for(j=29; j>=i; --j){if(buffer[j-1] > buffer[j]){temp = buffer[j-1];buffer[j-1] = buffer[j];buffer[j] = temp;}}temp = 0;for(i=5; i<25; i++){temp += buffer[i];}temp = (uint)(((float)temp) / 20 + 0.5);return(temp);}///显示数据处理及扫描显示中断服务函数//// void t0_4ms(void) interrupt 1{data2=_data;data2=_data*19.53;display[3]=tab_d[data2/1000];display[2]=tab[(data2/100)%10];display[1]=tab[(data2/10)%10];display[0]=tab[data2%10];TH0=0xf0;TL0=0x60;if(++con==5) con=1;// segp=0xff;segp=display[con-1];scanp=scan[con-1];}///串口发送节字函数//// void uart_out(uchar byte) { SBUF=byte;while(TI==0);TI=0;}///1ms延时////void delay1ms(uchar x) { uchar i,j;for(i=0;i<x;i++)< p=""> for(j=0;j<250;j++); }</x;i++)<>。
单片机数码管显示实验心得
单片机数码管显示实验心得
一、实验介绍
本次实验是单片机数码管显示实验,通过单片机控制数码管的显示,
学习单片机的基本操作和编程技巧。
二、实验器材
1. 单片机开发板
2. 数码管模块
3. 杜邦线
三、实验原理
数码管是一种数字显示器件,由多个发光二极管组成。
常见的数码管
有共阳极和共阴极两种类型。
共阳极数码管的所有阳极都连接在一起,而共阴极数码管的所有阴极都连接在一起。
在控制数码管时,需要根
据具体情况选择合适的驱动方式。
四、实验步骤
1. 连接硬件:将数码管模块与单片机开发板通过杜邦线连接。
2. 编写程序:使用Keil C51软件编写程序,实现对数码管的控制。
3. 下载程序:将程序下载到单片机开发板中。
4. 调试程序:通过调试工具观察程序运行情况,并进行调试修改。
五、编程要点
1. 数字转换:将需要显示的数字转换为对应的七段码。
2. 位选控制:根据具体情况选择共阳极或共阴极驱动方式,并实现位选控制。
3. 时序控制:通过延时函数或定时器实现数码管的动态显示效果。
六、实验心得
本次实验让我深入了解了单片机的基本操作和编程技巧,对数码管的控制有了更深入的了解。
在编写程序过程中,我遇到了一些问题,如数字转换不正确、位选控制不准确等,通过查阅资料和调试程序最终得以解决。
同时,在进行实验前需要认真检查硬件连接是否正确,避免出现连接错误导致无法正常工作的情况。
总之,本次实验让我收获颇丰,对单片机编程有了更深入的理解和掌握。
ad模拟数字转换器 内部原理
ad模拟数字转换器内部原理
AD模拟数字转换器(A/D转换器)的内部原理主要包括取样、保持、量化与编码等过程。
其工作原理是将时间连续、幅值也连续的模拟量转换为时间离散、幅值也离散的数字信号。
在取样过程中,输入的模拟信号被转化为一系列的窄脉冲,这些脉冲的时间极短。
为了将这些断续的窄脉冲信号数字化,需要一定的时间,因此在两次取样之间,取样的模拟信号会被暂时储存起来,这个动作称之为保持。
取样的结果会被储存起来直到下一个取样脉冲的到来。
在量化过程中,每个取样值被赋予一个最接近的量化级。
量化是将连续幅度的模拟信号近似为数量值的离散幅度。
编码则是将量化后的结果用二进制数来表示。
编码后的数字信号可以方便地进行传输和存储,并可以快速地被计算机处理或通过数据通信系统传输。
AD转换器需要特别注意的参数包括分辨率、转换误差、转换时间、绝对精
准度和相对精准度等。
其中,分辨率决定了数字输出能表示的模拟输入的最大数量,转换误差则是指实际输出与理想输出之间的差异。
转换时间是从启动转换到完成输出的时间,而绝对精准度和相对精准度则分别指输出的绝对误差和相对误差。
在实际电路中,取样、保持、量化及编码等过程可能是合并进行的。
例如,取样-保持电路可以保证模拟电路中取样时的稳定性和数据储存,通常使用电容组件来储存电荷。
此外,为了保证有正确的转换,取样频率必须至少高于最大频率的2倍,这是根据数字信号处理的基本原理,即Nyquist取样定理。
以上内容仅供参考,如需更多信息,建议查阅相关文献或咨询专业人士。
AD转换与显示
引言本课题的任务是对A/D转换电路进行设计,了解A/D转换与单片机的接口方法,掌握AD0809转换性能及编程方法。
把模拟量转换成数字量的器件,称为模数转换器,简称为A/D(Anolog to Digit)。
一般的A/D转换过程是通过采样、保持、量化和编码4个步骤完成的,这些步骤往往是合并进行的。
当A/D转换结束,ADC输出一个转换结束信号数据。
CPU可有多种方法读取转换结果:①查询方式;②中断方式;③ DMA方式。
通道8位A/D转换器,ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,可以和单片机直接接口。
ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
一个实际的系统中需用传感器把各种物理参数(如压力和温度等)测量出来,并转换为电信号,再经过A/D转换器,传送给微型计算机;微型计算机加工处理后,通过D/A转换器去控制各种参数量。
目录一、课程设计目的----------------------------------------------3二、课程设计内容与要求----------------------------------------3三、芯片简介--------------------------------------------------3 (一) A/D转换芯片0809引脚图与功能简介--------------------3(二)8051单片机引脚图与引脚功能简介-----------------------6四、设计方案及程序流程图 -------------------------------------8五、子模块设计及硬件电路连接----------------------------------9(一)A/D转换模块----------------------------------------9 (二)单片机模块-----------------------------------------10 (三)数码管动态扫描模块------------------------------ --10 六、课程设计总结---------------------------------------------10(一)收获与体会------------------------------------------10 (二)遇到的问题及解决------------------------------------11七、参考文献-------------------------------------------------11八、附录(总程序)-------------------------------------------12一、课程设计目的单片机课程设计的目的就是要锻炼学生的实际动手能力。
单片机ad转换原理
单片机ad转换原理单片机AD转换原理。
单片机的AD转换原理是指单片机如何将模拟信号转换为数字信号的过程。
在许多嵌入式系统中,需要将外部的模拟信号转换为数字信号,以便单片机能够对其进行处理和分析。
因此,了解单片机的AD转换原理对于理解嵌入式系统的工作原理至关重要。
在单片机中,AD转换是通过内置的模数转换器(ADC)来完成的。
ADC是一种能够将模拟信号转换为数字信号的电路。
它接收来自外部的模拟信号,并将其转换为相应的数字值,以便单片机能够对其进行处理。
AD转换的过程可以分为几个主要步骤。
首先,模拟信号通过采样电路进行采样,将连续的模拟信号转换为离散的采样值。
然后,采样值经过保持电路进行保持,以便在转换过程中保持稳定。
接下来,采样值通过ADC进行量化,即将其转换为相应的数字值。
最后,数字值经过数字信号处理电路进行处理,以便单片机能够对其进行分析和处理。
在单片机中,AD转换的精度和速度是非常重要的。
精度指的是AD转换的准确度,即数字值与实际模拟信号之间的差异程度。
而速度则指的是AD转换的速度,即完成一次AD转换所需的时间。
单片机的AD转换精度和速度通常取决于其内置的ADC的性能参数,如分辨率、采样速率等。
在实际应用中,需要根据具体的需求选择合适的ADC类型和参数。
例如,对于需要高精度和高速度的应用,可以选择分辨率高、采样速率快的ADC。
而对于一些低精度和低速度要求的应用,则可以选择分辨率低、采样速率慢的ADC。
总之,单片机的AD转换原理是单片机将模拟信号转换为数字信号的过程,通过内置的ADC完成。
了解AD转换的原理和性能参数对于设计和应用嵌入式系统至关重要。
在实际应用中,需要根据具体的需求选择合适的ADC类型和参数,以确保系统的性能和稳定性。
通过对单片机AD转换原理的深入了解,可以更好地理解嵌入式系统的工作原理,为系统的设计和应用提供有力的支持。
数码管显示采集信号
数码管显⽰采集信号#include#include "DrvUART.h"#include "DrvGPIO.h"#include "DrvSYS.h"#include "NUC1xx.h"#include "DrvADC.h"unsigned char const duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 0,1,2,3,4,5,6,7,8,9 unsigned int const wei[8] ={0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};uint8_t inchar[1]={0X55};void NUC_INIT()//时钟配置初始化{UNLOCKREG(); //芯⽚解锁SYSCLK->PWRCON.XTL12M_EN = 1; //设定12M外部晶振DrvSYS_Delay(5000); //等待时钟就绪DrvSYS_Open(48000000); //打开48MHzLOCKREG(); //芯⽚上锁}int flag;void TMR0_Callback(uint32_t u32Param)//定时器回调函数{if (u32Param == 1){if(flag){DrvGPIO_ClrBit(E_GPA,12);flag=0;}else{DrvGPIO_SetBit(E_GPA,12);flag=1;}}}void Time_init(){DrvTIMER_Init(); //定时器初始化DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0); //选择时钟源DrvTIMER_Open(E_TMR0, 5, E_PERIODIC_MODE); //打开定时器DrvTIMER_SetTimerEvent(E_TMR0, 3, (TIMER_CALLBACK)TMR0_Callback, 1);//设置中断回调函数DrvTIMER_EnableInt (E_TMR0); //使能定时器0中断DrvTIMER_Start (E_TMR0); //定时器0开始计时}void GPIO_INIT()//IO⼝初始化{DrvGPIO_InitFunction(E_FUNC_GPIO); //开启普通IO⼝使能DrvGPIO_Open(E_GPD,0,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,1,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,2,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,3,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,4,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,5,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,6,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,7,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,8,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,9,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,10,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,11,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,12,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,13,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,14,E_IO_OUTPUT);DrvGPIO_Open(E_GPD,15,E_IO_OUTPUT);DrvGPIO_Open(E_GPE,4,E_IO_OUTPUT);}void Display(){int i;DrvGPIO_ClrBit(E_GPE,4); //开启数码管使能,低电平有效for(i=0;i<8;i++){DrvGPIO_SetPortBits(E_GPD,duan[i]+wei[i]);//PD0~PD7为段码 PD8~PD15为位码DrvSYS_Delay(1000); //周期内每位保持时间}}void AD_INIT()//AD初始化配置初始化{DrvGPIO_InitFunction(E_FUNC_ADC2); //选择ADDrvADC_Open(ADC_SINGLE_END, ADC_SINGLE_OP, 0, INTERNAL_HCLK, 1); // 最⼤AD时钟频率为16MHZ }int32_t GET_ADC2()//获取AD值{int32_t i32ConversionData; //32溢出位防⽌计算时DrvADC_SetADCChannel(1<<2); //设置激活通道 2表⽰激活2通道,因为选择了AD2DrvADC_StartConvert(); //启动AD转换while(ADC->ADSR.BUSY==1); //等待转换完成 ADC->ADSR.BUSY转换结束的标志i32ConversionData = DrvADC_GetConversionData(2);//得到转换结果获取2通道的数值,范围是0~4095i32ConversionData=i32ConversionData*3000*2/4095;//计算AD值,毫伏转换成电压值,两点式//3000是基准电压,2是硬件做的衰减,4096是精度,12位return i32ConversionData;}main(){int32_t AD,i;NUC_INIT();UART_INIT();AD_INIT();for(i=0;i<10000000;i++);//等待配置稳定while(1){AD=GET_ADC2(); //获取ADprintf("当前采集AD=%d\r\n",AD);for(i=0;i<10000000;i++); //等待}}。
ad中共阴极数码管
ad中共阴极数码管
在AD软件中,共阴极数码管是一种常用的显示元件。
它主要有蓝色、绿色和红色三种颜色。
在绘制原理图时,放置共阴极数码管的方法如下:
1. 打开AD软件,依次点击文件-新的-原理图。
2. 在右侧找到库,输入相应的数码管型号,如蓝色共阴数码管可输入“Dpy Blue-CC”。
3. 点击“Place Dpy Blue-CC”,此时会出现一个活动的蓝色共阴数码管。
4. 拖动蓝色共阴数码管到合适的位置,单击鼠标左键完成绘制。
类似地,您还可以绘制绿色共阴数码管(输入“Dpy Green-CC”)和红色共阴数码管(输入“Dpy Red-CC”)。
需要注意的是,在AD中绘制原理图时,共阴极数码管的颜色并不影响其功能。
例如,即使您使用红色共阴极数码管,也可以选择蓝色共阴数码管的库(如“Dpy Blue-CC”)。
只需确保在绘制原理图时使用正确的库即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
~0x40,~0xff,0x88,0x83,0xc6,0XA1,0x86,0x8e,0xd0,0x89};//'- ABCDEFGH'
PORTB=ad_value; //PORTB输出AD转换结果,并用8个LED发光二极管显示
dis(1,(ad_value%100)%10,(ad_value%100)/10,ad_value/100,0);
}
}
void dis(int time ,int a, int b, int c,int d)
byte ad_value; //AD转换结果
/*-----------------ms 级延时---------------------*/
void delay_ms(int m)
{int i,j;
for(j=0;j<m;j++)
for(i=0;i<800;i++);
EnableInterrupts; // 开放总中断
for(;;) {
while(!ATD0STAT2L_CCF7); //等待转换结束,退出循环
ad_value=(byte)ATD0DR7H;//左对齐,右对齐时转换结果都先存储在ATD0DRxH,后存储在ATD0DRxL.
{
PTT=WeiMa[wei-1];
PTP=DisplayDecode[data];
delay_ms(10);
}
//中断禁止(bit1=0)
ATD0CTL3 = 0X0C; //0 0001 1 00 转换序列为 1 、 FIFO模式启动,冻结模式下继续转换
ATD0CTL4 = 0XE1; // 1 11 00001 8位精度, 24个ATD采样时间
}
/***---------------初始化程序---------------***/
void InitAD(void){
ATD0CTL2 = 0XC0; //1100 0000 启动A/D, 快速清除标志位
//无等待模式, 外部触发禁止(bit2=0),
const unsigned char WeiMa[]={0xfe,0xfd,0xfb,0xf7};
void display(unsigned char wei,unsigned char data);
void delay_ms(int m);
void dis(int time ,int a, int b, int c,int d) ;
//由通道ATD0进行单通道A/D转换,转换值在B口显示,并用数码管实现二进制值
//与B口对应
//AN7接电位器0~5V输入
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
}
/***---------------主程序---------------***/
void main(void) {
InitAD();
DDRB=0XFF; // 设PO=0xFF;
DDRT=0xFF;
// 总线(1+1)*2 = 4 分频,AD时钟 = 1MHz
ATD0CTL5 = 0X27; // 0 0 1 0 0 111 右对齐,无符号,连续转换,单通道, 起始通道 ATD7
ATD0DIEN = 0X00; // 数字输入 disabled
{int i;
for(i=1;i<time*25;i++) {
display(1,a);
display(2,b);
display(3,c);
display(4,d);
}
}
void display(unsigned char wei,unsigned char data)