AVR与AD采集数码管显示

合集下载

ADC数据采集显示实验

ADC数据采集显示实验

实验目的:1、掌握ADC的工作原理和操作过程2、掌握ADC的接口方法3、了解数据处理的实现方法主要实验仪器:硬件:个人电脑一台软件:ICCA VR软件、protuse仿真软件实验原理及主要工作:1、实验原理将连续变化的模拟信号转换为数字信号,显示在1602液晶显示上。

2、主要工作(1)使用ICCA VR软件编写C程序并编译(2)使用protuse仿真,找到相应的软件符号并连接线路(3)仿真结果请按以下几个部分完成实验报告。

一、实验步骤二、实验原理图(proteus)三、程序流程图四、C程序代码全部五、调试结果截图六、实验总结及心得体会七、附件(原理图及程序压缩包)二、实验原理图三、实验流程图四、C程序代码#include <iom16v.h>#include <macros.h>#include <math.h>#define uchar unsigned char#define uint unsigned int#define RS_CLR PORTB&=~BIT(2)#define RS_SET PORTB|=BIT(2)#define RW_CLR PORTB&=~BIT(1)#define RW_SET PORTB|=BIT(1)#define E_CLR PORTB&=~BIT(0)#define E_SET PORTB|=BIT(0)const uchar disp[]={"ADC TXT "}; uint value=0;void delay_ms (t){uchar x,y;for(;t>0;t--){for(x=0;x<114;x++) for(y=0;y<1;y++);}}void WR_DAT(uchar dat) {E_CLR;RS_SET;RW_CLR;PORTC=dat;E_SET;delay_ms(5);E_CLR;}void WR_COM(uchar dat) {E_CLR;RS_CLR;RW_CLR;PORTC=dat;E_SET;delay_ms(5);E_CLR;}void init_1602(void){DDRB=0XFF;DDRC=0XFF;delay_ms(20);WR_COM(0X38);delay_ms(5);WR_COM(0X38);delay_ms(5);WR_COM(0X38);delay_ms(5);WR_COM(0X08);WR_COM(0X0C);WR_COM(0X01);delay_ms(10);WR_COM(0X06);WR_COM(0X85);}void ADC_init(void){DDRA=0X00;PORTA=0X00;ADMUX=0X00;ADCSRA=0XE7;SFIOR=0X00;}void main(void){uchar i,ADC_L,ADC_H;DDRA=0X00;DDRB=0XFF;DDRC=0XFF;ADC_init();init_1602();WR_COM(0X80);for(i=0;i<15;i++){WR_DAT(disp[i]);}while(1){ADC_L=ADCL;ADC_H=ADCH;WR_COM(0Xc0);value=(ADC_H*256+ADC_L)*5/10.24; ADC_init();WR_DAT('0'+value/100);WR_DAT('.');WR_DAT('0'+value%100/10);WR_DAT('0'+value%100%10);WR_DAT('v');}}五、实验结果。

用DSP实现AD转换与数码管显示设计(实验四)

用DSP实现AD转换与数码管显示设计(实验四)

如图为 4 位数码管显示原理图,采用共阳极连接方法,即可通过将 GPIO70、 GPIO71、GPIO72、GPIO73 置 1 来控制数码管的位选(1 为选择此位);数码管 的段码输入由串行输入、并行输出的 74HC164 决定。选取 F28335 的 GPIO54SPISOMI 作为 74HC164 的数据输入端,GPIO56-SPICLK 作为 74HC164 的时钟 输入端。SPICLK 每经过一次上升沿跳变,74HC164 锁存数据就右移一位(方向 QA-QH),所以 SPISOMI 数据输出端输出数据时,数据传送采用高位到低位的 方式。 下图为 74HC164 的时序图:
SPI 结合 74HC164 实例: A、设置 SPI 下降沿触发,至少 8 位数据传输以及波特率。 B、设置 SPI 的 FIFO,禁止 SPI 中断。
2、软件设计
主函数:
开始
主循环:
初始化(时钟、GPIO 配置及 初始化、关看门狗、模式初 始化、SPI 初始化、数码管
初始化、ADC 初始化)
主循环
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //设置采样窗口时间:(15+1)
*ADCCLK
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //ADC内核时钟分频:
HSPCLK/2=6.25MHZ
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
#define SET_BIT4 GpioDataRegs.GPCSET.bit.GPIO70 = 1
//与外设板
8_LEDS 端子的 IO70 对应
#define RST_BIT4 GpioDataRegs.GPCCLEAR.bit.GPIO70 = 1

实验2:AD数据采集与显示实验

实验2:AD数据采集与显示实验

LOGO实验2A/D数据采集与显示实验设计报告系别:专业:学号:姓名:指导老师:目录一、实验目的 (3)二、实验硬件设计 (3)三、实验电路仿真设计图 (4)四、实验程序设计 (6)五、实验小结 (11)一、实验目的1、完成用单片机和AD1674接口电路设计,用电位器改变输入电压实现A/D 数据采集处理。

模拟输入信号可以在10Vin引脚接一个电位器,电位器接5V电压,改变电位器即可输入0~5V电压,提供给A/D进行采样(AD1674与AD574的引脚和用法完全一样)2、完成用单片机接口4位数码管做动态显示,把A/D采集的数字量经过数字滤波处理后显示出对应的电压值来。

二、实验硬件设计AD1674:引脚按功能可分为逻辑控制端口、并行数据输出端口、模拟信号输入端口和电源端口四种类型。

(1)逻辑控制端口12/8:数据输出位选择输入端。

当该端输入为低时,数据输出为双 8 位字节;当该端输入为高时,数据输出为单 12 位字节。

CS:片选信号输入端;R/C:读/转换状态输入端。

CE:操作使能端;输入为高时,芯片开始进行读/转换操作。

A0:位寻址/短周期转换选择输入端。

STS:转换状态输出端。

输出为高时表明转换正在进行;输出为低时表明转换结束。

(2)并行数据输出端口DB11~DB8:在 12 位输出格式下,输出数据的高 4 位;在 8 位输出格式下,A0 为低时也可输出数据的高 4 位。

(3)模拟信号输入端口10VIN:10V 范围输入端,包括 0V~10V 单极输入或±5V 双极输入;20VIN:20V 范围输入端,包括 0V~20V 单极输入或±10V 双极输入;(4)供电电源端口REF IN:基准电压输入端,在 10V 基准电源上接 50Ω电阻后连于此端;REF OUT:+10V 基准电压输出端;BIP OFF:双极电压偏移量调整端,VCC:+12V/+15V 模拟供电输入;VEE:-12V/-15V 模拟供电输入;VLOGIC:+5V 逻辑供电输入;AGND/DGND:模拟/数字接地端;74LS164:符号引脚说明DSA 1 数据输入DSB 2 数据输入Q0~Q3 3~6 输出GND 7 地 (0 V)CP 8 时钟输入(低电平到高电平边沿触发)/M/R 9 中央复位输入(低电平有效)Q4~Q7 10~13 输出VCC 14 正电源74LS373:D0~D7 数据输入端OE 三态允许控制端(低电平有效)Q0~Q7 输出端三、实验电路仿真设计图四、实验程序设计ORG 0000HSJMP MAINORG 0030HMAIN: ACALL INIT ;初始化函数LOOP: ACALL Get_ADC ;A/D采集函数ACALL DATA_Hand ;数据处理ACALL DISPLAY ;数码管显示函数AJMP LOOPINIT: ;初始化函数MOV SCON,#00H ;方式0时:移位寄存器I/O方式,波特率=晶振频率/12,工作于方式0时,SM2必须为0。

电压采集,AD转换程序,数码管显示

电压采集,AD转换程序,数码管显示

电压采集,AD转换程序,数码管显示#include#includesbit ADC_CS=P3^5; //片选引脚,低电平有效sbit ADC_CLK=P3^4; //ADC0832芯片的时钟输入引脚sbit ADC_DO=P3^3; //数据信号输出引脚,用于将转换的数据输给单片机sbit ADC_DI=P3^3; //数据信号输入引脚,用于通道的选择控制#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存void Delay(unsigned char x);unsigned char ReadADC(viod);unsigned char TempData[8]; //存储显示值的全局变量unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f};// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码void Display(unsigned char FirstBit,unsigned char Num);void main(){unsigned char a;a=ReadADC();while(1){TempData[0]=dofly_DuanMa[a/100];//分解显示信息,如要显示68,则68/10=6 68%10=8TempData[1]=dofly_DuanMa[(a%100)/10];TempData[2]=dofly_DuanMa[(a%100)%10];Display(2,3);}}// 延时函数void Delay(unsigned char x){unsigned char i;for(i=0;i<x;i--);}// 把模拟电压转换成八位二进制数,并返回unsigned char ReadADC(unsigned char b){unsigned char i,ch;ch=0;ADC_CS=0; //片选引脚,低电平有效,ADC_DO=0; //DO为高阻状态for(i=0;i<10;i++); //稍做延时ADC_CLK=0;Delay(2); //以上那个为准备工作ADC_DI=1;ADC_CLK=1;Delay(2); //第一个脉冲,起始位ADC_CLK=0;Delay(2);ADC_DI=1;ADC_CLK=1;Delay(2); //第2个脉冲,DI=1表示双通道单极性输入ADC_CLK=0;Delay(2);ADC_DI=1;ADC_CLK=1;Delay(2); //第3个脉冲,DI=1表示表示选择CH1,马上准备读取转换数据ADC_CLK=1;Delay(2);ADC_CLK=0;Delay(2);for(i=0;i<8;i++){ADC_CLK=1;Delay(2);ADC_CLK=0;Delay(2);ch=(ch<<1)|ADC_DO;}ADC_CS=1; //取消片选,一个转换周期结束return(ch);}void Display(unsigned char FirstBit,unsigned char Num) {unsigned char i;for(i=0;i<num;i++){DataPort=0; //清空数据,防止有交替重影LATCH1=1; //段锁存LATCH1=0;DataPort=dofly_WeiMa[i+FirstBit]; //取位码LATCH2=1; //位锁存LATCH2=0;DataPort=T empData[i]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0;Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影}}</num;i++)</x;i--);。

基于AVR单片机的八通道AD采集

基于AVR单片机的八通道AD采集

A VR采集数据软硬件设计一、概述该部分将前部分得到的模拟信号进行AD转换,用数码管进行显示。

采用Atmel公司的ATMEGA128 单片机做控制器,利用其自带的10 位精度的模数转换器,免去外部ADC 芯片,在提高采样精度的同时降低硬件成本,设计采用过采样技术,将mega128单片机自带的10 位AD转换器的精度提高到12 位。

依据过采样原理的限制条件,为了保证过采样原理应用的可靠性,设计引入了噪声激励信号。

为了避免噪声激励可能出现的偏差,使用了mega128 自身的计数器来生成噪声,来满足实验要求。

二、系统要求ADC 转换时可能引入很多种噪声,例如热噪声、杂色噪声、电源电压变化、参考电压变化、由采样时钟抖动引起的相位噪声以及由量化误差引起的量化噪声。

有很多技术可用于减小噪声,例如精心设计电路板和在参考电压信号线上加旁路电容等,但是ADC 总是存在量化噪声的,所以一个给定位数的数据转换器的最大SNR 由量化噪声定义。

在一定条件下过采样和求均值会减小噪声和改善SNR,这将有效地提高测量分辨率。

过采样指对某个待测参数,进行多次采样,得到一组样本,然后对这些样本累计求和并对这些样本进行均值滤波、减小噪声而得到一个采样结果。

要准确采集到微弱信号可以提高ADC的分辨率,而高分辨率的ADC价格较为昂贵,并且它是用速度换取的高精度,导致采样率不高,特别是用于多通道采样时,由于建立时间长,采样率还会显著降低。

利用AVR单片机内部集成的ADC转换器可大大减少硬件开支。

Atmel 的AVR 单片机提供了10 位精度的模数转换器。

在大多数情况10 位精度已经足够了,但是某些情况下需要更高的精度。

我们可以使用特殊的信号处理技术来提高测量的精度。

使用这种方法可以得到较高的精度,不需要使用外部的ADC。

可以有效地利用片上资源,降低硬件成本。

三、过采样技术原理过采样技术是以远高于奈奎斯特采样频率的频率对模拟信号采样。

,由信号采样量化理论可知,若输入信号的最小幅度大于量化阶梯Δ,并且输入信号的幅度随机分布,则量化噪声的总功率为一个常数,与采样频率fs 无关,且在0~fs 的频带范围内均匀分布。

AVR单片机专用周周实验报告(数码管一位显示)

AVR单片机专用周周实验报告(数码管一位显示)

AVR单片机专用周实习报告题目:数码管一位显示班级:学号:姓名:目录一、实验目的 (2)二、实验要求 (2)三、实验原理 (2)四、实验程序 (5)五、心得体会 (9)一、实验目的通过对例程序的思考与理解,利用实验室所提供的AVR单片机硬件、软件资源,编程实现数码管的一位显示。

观察并分析实验结果,在实验中了解单片机的结构与原理。

二、实验要求利用课上所教例程序的相关原理,设计出数码管一位显示的程序。

观察实验结果,写出实验报告。

三、实验原理3.1、 AVR系列端口介绍AVR系列单片机的IO端口结构比基本51系列单片机的端口要复杂一些,以ATmega16单片机为例,它有4组8位IO端口,分别是PORTA、PORTB、PORTC和PORTD。

通过特殊功能寄存器,我们可以使每个端口实现双向数字IO 通道或双向模拟量通道功能。

ATmega16单片机的大部分端口具有除基本IO功能外的第二功能,关于第二功能的使用这里不作介绍。

下面说明端口的基本IO输入输出和模拟量输入输出的工作过程。

①同步数字输出。

作为输出时,总线给方向寄存器D触发器F9写1,三态门F1打开,总线来的数据经D触发器F10到达输出端Pxn,此时上拉电阻是关断的。

②数字输入。

作为输入时,总线给方向寄存器D触发器F9写0,三态门F1关断,上拉电阻根据需要由PUD选择是否导通,在休眠信号SLEEP无效时,模拟开关M1打开,MOS管T2截止,从Pxn来的输入信号经整形电路F7和同步锁存器进入三态门F4成为同步输入信号。

③模拟量输入输出。

在模拟量输入输出模式下,通过设置使上拉电阻、三态门F1和模拟开关M1都处于关断状态,管脚Pxn直接连通单片机内部相关模拟量输入输出单元,为单片机内部模拟比较器、A/D转换器及D/A转换器等功能单元提供与外围连接的通道。

3.2、数码管(发光二级管)数码管(发光二级管)分为共阳极连接和共阴极连接。

共阳极数码管在判别时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。

AVR单片机1路AD采集数据12864显示

AVR单片机1路AD采集数据12864显示

#include <iom128v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned int#define PSBH PORTC|=BIT(0);#define PSBL PORTC&=~BIT(0);#define EH PORTC|=BIT(1);#define EL PORTC&=~BIT(1);#define RWH PORTC|=BIT(2);#define RWL PORTC&=~BIT(2);#define RSH PORTC|=BIT(3);#define RSL PORTC&=~BIT(3);void Delay_ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}/**********************************************************液晶显示(串行方式)**********************************************************/void SendByte(uchar zdata) // 按照液晶的串口通信协议,发送数据{uchar i;for(i=0; i<8; i++){if((zdata << i) & 0x80){RWH;}else{RWL;}EL;EH;}}void write_LCD_cmd(uchar cmdcode) // 写串口指令{RSL;RSH;SendByte(0xf8);SendByte(cmdcode & 0xf0);SendByte((cmdcode << 4) & 0xf0);Delay_ms(2);}void write_LCD_dat(uchar Dispdata) // 写数据{RSL;RSH;SendByte(0xfa);SendByte(Dispdata & 0xf0);SendByte((Dispdata << 4) & 0xf0);Delay_ms(2);}void Display_str(uchar X,uchar Y,uchar *p)//显示字符串函数{uint i; //局部循环体控制变量switch(X){case 0:write_LCD_cmd( 0x80 + Y );break; //第一行case 1:write_LCD_cmd( 0x90 + Y );break; //第二行case 2:write_LCD_cmd( 0x88 + Y );break; //第三行case 3:write_LCD_cmd( 0x98 + Y );break; //第四行}for(i=0;p[i]!='\0';i++){write_LCD_dat(p[i]);}}//**********液晶初始化**********//void LCD_init(){PSBL; //串行方式Delay_ms(5);write_LCD_cmd(0x30);//选择基本指令操作Delay_ms(1);write_LCD_cmd(0x0C);//显示状态开关:整体显示开,光标显示关,光标显示反白关Delay_ms(1);write_LCD_cmd(0x01); //清除显示DDRAMDelay_ms(2);write_LCD_cmd(0x06);//启始点设定:光标右移Delay_ms(1);}void main(void){DDRD=0xFF;PORTD=0xFF;LCD_init();Display_str(0,0,"AD电压采集显示值");Display_str(1,0,"实际电压:");while(1);}。

数码管显示AD

数码管显示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转换结果(按照书上整理后的完整代码)

数码管显示两路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);}} }。

STC单片机内部ADC采集电压用数码管显示

STC单片机内部ADC采集电压用数码管显示

STC单片机内部ADC采集电压用数码管显示////////////////////////////////////////////////////////////////////////////////////////////////////// ///特点:/// ///1、数码管显示用中断方式/// ///2、STC12C5A60S2内ADC采样电压值,先采样30次然后去掉上下10个再取平均值/// ///3、采集数据用串口发送到PC /// ///------------------------------------------------------------------------shenzhen---iqss----2011/02/23--------/// //////////////////////////////////////////////////////////////////////////////////////////////////////#include <reg51.h>#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++)for(j=0;j<250;j++); }。

实验七:内置ADC做数字电压表

实验七:内置ADC做数字电压表

因此:ADCSRA=0xc6; 使用 ADC 模块,最重要就是这两个寄存器的配置,实际上,单片机内部的模块的使用 方法与此大同小异,主要工作在于配置内部寄存器,这种方法一定要掌握。 另外,ADC 模块启动后,第一次转换的结果不准确应舍弃。 ADC 模块介绍到此,回到开发板,开发板上方有一个多圈电位器,接在 VCC 构成一个 分压器,如下图:
Vx 1024 ,AVCC 的实测电压为 4.69V,因此 AVCC
4690 N (mV ) 4.59 N (mV ) 。 1024
USB 电压为 5.0V,进入开发板时经过了一个 1N5819 防逆二极管,1N5819 导通压降约 0.3V,因此实际供电电压只有 4.7V 左右。实验时,不同电脑的 USB 电压略有不同,直接用 以上计算公式误差不大,如果要更高精度,自行用万用表测量 AVCC,修正计算公式。
Editor:*轩辕十四* Created date:2010-2-3
-2-
华南理工大学无线电爱好者协会
AVR-R&D
V2.1
QQ 群:63191815
• Bit 6 – ADSC: ADC 开始转换 在单次转换模式下,ADSC 置位将启动一次ADC 转换。在连续转换模式下,ADSC 置位 将启动首次转换。第一次转换( 在ADC 启动之后置位ADSC,或者在使能ADC 的同时置位 ADSC) 需要25 个ADC 时钟周期,而不是正常情况下的13 个。第一次转换执行ADC初始 化的工作。在转换进行过程中读取ADSC 的返回值为"1”,直到转换结束。ADSC 清零不产 生任何动作。这一位是转换标志位,通过置位来启动,并判断是否转换结束。 • Bit 5 – ADATE: ADC 自动触发使能 ADATE置位将启动ADC自动触发功能。触发信号的上跳沿启动ADC转换。触发信号源通过 SFIOR 寄存器的ADC 触发信号源选择位ADTS 设置。这里单次转换,不需要自动触发, 置0。 • Bit 4 – ADIF: ADC 中断标志 在ADC 转换结束,且数据寄存器被更新后, ADIF 置位。如果ADIE 及SREG 中的全局 中断使能位I 也置位,ADC 转换结束中断服务程序即得以执行,同时ADIF 硬件清零。此 外,还可以通过向此标志写1 来清ADIF。要注意的是,如果对ADCSRA 进行读-修改-写 操作,那么待处理的中断会被禁止。这也适用于SBI 及CBI 指令。本实验不需中断,置0。 • Bit 3 – ADIE: ADC 中断使能 若ADIE 及SREG 的位I 置位, ADC 转换结束中断即被使能。这里不需中断,置0。 • Bits 2:0 – ADPS2:0: ADC 预分频器选择位 由这几位来确定XTAL 与ADC 输入时钟之间的分频因子,决定ADC转换速度。转换速度为 ADC时钟/13,对于15ksps的转换速度,需要195kHz的时钟源,本实验晶振为12MHz,进行64 分频恰好。即ADPS2..0:110。

avr单片机在多回路数据采集器中的应用

avr单片机在多回路数据采集器中的应用
考虑到模 拟 信 号 及 开 关 量 信 号 的 数 目 、速 度 、精 度 的 要 求, 系统结构的精简、成本以及今后软硬件的升级需要, 该采集器系
- 110 - 360元 / 年 邮局订阅号: 82-946
《现场总线技术应用 200 例》
您的论文得到两院院士关注
单片机开发与应用
统 的 微 处 理 器 功 能 模 块 由 ATmega128 单 片 机 来 实 现 。 AD 采 集处理部分是本系统设计的关键部分, 它需要采集 8 路输入信 号, 每路输入信号有:1 个电流有效值(0 ̄6A), 两个有源开关量输 入( 报警信号和状态信号输入) 。参数设置部分主要设置本设备 地 址 和 通 讯 波 特 率 , 可 设 置 本 设 备 地 址 范 围 为 1 ̄63, 通 讯 波 特 率范围为 4800 ̄38400 波特, 以满足用户多种不同需求。这一功 能由软件编程来实现。输出单元同样有 8 路输出,每路有 2 个开 关量输出, 用继电器提供两个无源触点来实现。为了避免外部 干扰对信号影响, 信号的输入和输出单元使用高速光电耦合电 路。显示部分用 LED 显示报警信号与状态检测信号 输入、系统 电源的通断信号以及通讯信号的工作情况。通讯接口单元采用 RS485 接 口 电 路 , 是 一 种 RS232/RS485 转 换 器 。 该 数 据 采 集 器 系统与 PC 机通过采用 ModBus/RTU 协议实现通信联网功能。
利用 微 处 理 芯 片 内 A/D 转 换 器 进 行 数 据 处 理 和 存 储 等 , 并 给 出 了 AD 采 集 处 理 的 硬 件 接 口 电 路 和 软 件 编 程 实 现 。
关键字:AVR 单片机; 数据采集; A/D 转换器; 应用程序部分
中 图 分 类 号 : T P 274

AVR单片机(C语言)项目开发实践教程项目5.3 数码管拉幕式显示

AVR单片机(C语言)项目开发实践教程项目5.3 数码管拉幕式显示

74HC164工作时序
0 0 001 1 010 000 00 0 0 0 000 1 101 000 00 0 0 0 000 0 110 100 00 0 0 0 000 0 011 010 00 0 0 0 000 0 001 101 00 0 0 0 000 0 000 110 00 0 0 0 000 0 000 011 00 0 0 0 000 0 000 001 00 0
3、模拟串行发送
data=0xC0;
//要显示的数据字型码给data
for(j=0;j<8;j++) {
//发送8位二进制数据
PORTB&=0xFE; //时钟PB0低电平
delay_us(1);
//短延时
if(data&0x80)
//判断data最高位,为高电平
PORTB|=0x02; //数据高电平
结束
VCC为+5V电源输入端; GND为接地端。 A、B:串行输入端; QA~QH:串行输出端; CLK:串行时钟输入端; /CLR为串行输出清零端;
2、 74HC164内部结构及工作时序
真值表
表 74HC164输入输出关系表
通过真值表我们可以了解到,A,B两个输入端是互锁的,CLK上升沿时 数据移入移位寄存器中,CLEAR为清零用的,接低电平时所有端口都输 出低电平。
《单片机应用技术》
【项目知识点与技能点】
➢ 74HC164芯片的功能及引脚。 ➢ 74HC ➢ 多个数码管静态显示的原理和实现方法。
1、74HC164芯片介绍
74HC164是8位串行输入,并行输出移位寄存器,可 用在单向的并行输出/并行地址锁存等. 74HC164因为 价格便宜,容易使用特别适合使用在需要用到数码管显 示IO口又比较紧张的电子产品中,引脚如图所示。

AVR事无巨细系列十,片内ADC

AVR事无巨细系列十,片内ADC

ADMUX=0xe0;
//内部参考电源 2.56V,输出数据左对齐,PA0 输入通

SFIOR=0;
//自由连续转换
/*使能 ADC,开始转换,允许自动转换,允许 ADC 中断,128 分频*/
ADCSRA=0xef; sei();
//允许全局中断
}
作者:LOSINGAMONG
ADC 上阵
E-mail:Losingamong@
display(2,ge);
/*显示转换结果,最低位*/
}
void readbyte(void)
//读取转换字节函数
{
uchar byte;
byte=ADCH; bai=byte/100; shi=byte%100/10; ge=byte%10; } /*以下为一系列数码管显示函数*/ void HC595send(uchar x) { uchar n,temp; for(n=0;n<8;n++) {
} x<<=1; } } void HC595store(void) { PORTB|=(1<<PB4);
PORTB&=~(1<<PB4);
} void HC595shift(void) {
PORTB|=(1<<PB7); PORTB&=~(1<<PB7); } void display(uchar pos,uchar dat) { HC595send(LedPos[pos]); HC595send( LedData[dat]); HC595store(); } /*以上为一系列数码管显示函数*/ 挑几点特别的来说: 1、要注意设置 ADC 的输入通道 PA0 为输入方向,内部上拉电阻无效,IO 呈高阻 态,(具体见程序)。这样的抗干扰性比较好,从 PA0 管脚可以比较准确的反映 ADC 真 实转换值。 2、转换结果保存在 ADCH 和 ADCL 中,因为是 10 位的二进制转换结果(10 位精度),

AD-DA转换带数码管显示

AD-DA转换带数码管显示

AD-DA转换带数码管显示/************************************************************** **************** ***** 标题: ************* DA-AD试验******************* **** 1.通过本例程了解并掌握AD-DA转换芯片的基本原理和使用** 2.了解掌握I2C总线接口的工作原理及一般编程方法。

** * * 连接方法:JP8 (P1)与J12用跳线连接**** 通过改变学习板上的2个电位器对应的2段模拟输入,实现模拟输入,学员观察数码管的数字变化情况* 通过改D[4]的值,实现模拟输出,学员观察学习板上DA处LED 的亮度变化**** 请学员认真消化本例程,懂得AD-DA 在C语言中的操作应用* *************************************************************** **************** ****/#include#include#define PCF8591 0x90 //PCF8591 地址//else IOsbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83 ,0xC6,0xA1,0x86,0xbf,0xc7,0x8 c,0xc1, 0xff, 0xf7 };unsigned char AD_CHANNEL;unsigned long xdata LedOut[8];unsigned int D[32];/************************************************************** ***** DAC 变换, 转化函数*************************************************************** ****/ bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val){Start_I2c(); //启动总线SendByte(sla); //发送器件地址if(ack==0)return(0);SendByte(c); //发送控制字节if(ack==0)return(0);SendByte(Val); //发送DAC的数值if(ack==0)return(0);Stop_I2c(); //结束总线return(1);}/************************************************************** ***** ADC发送字节[命令]数据函数*************************************************************** ****/ bit ISendByte(unsigned char sla,unsigned char c) {Start_I2c(); //启动总线SendByte(sla); //发送器件地址if(ack==0)return(0);SendByte(c); //发送数据if(ack==0)return(0);Stop_I2c(); //结束总线return(1);}/************************************************************** ***** ADC读字节数据函数*************************************************************** ****/ unsigned char IRcvByte(unsigned char sla){ unsigned char c;Start_I2c(); //启动总线SendByte(sla+1); //发送器件地址if(ack==0)return(0);c=RcvByte(); //读取数据0Ack_I2c(1); //发送非就答位Stop_I2c(); //结束总线return(c);}//************************************************************* *****/ main(){ char i,j;while(1){/********以下AD-DA处理*************/switch(AD_CHANNEL){case 0: ISendByte(PCF8591,0x41);D[0]=IRcvByte(PCF8591)*2; //ADC0 模数转换1break;case 1: ISendByte(PCF8591,0x42);D[1]=IRcvByte(PCF8591)*2; //ADC1 模数转换2break;case 2: ISendByte(PCF8591,0x43);D[2]=IRcvByte(PCF8591)*2; //ADC2 模数转换3break;case 3: ISendByte(PCF8591,0x40);D[3]=IRcvByte(PCF8591)*2; //ADC3 模数转换4break;case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC 数模转换break;}// D[4]=400; //数字--->>模拟输出D[4]=D[3];if(++AD_CHANNEL>4) AD_CHANNEL=0;/********以下将AD的值送到LED数码管显示*************/LedOut[0]=Disp_T ab[D[1]%10000/1000];LedOut[1]=Disp_T ab[D[1]%1000/100];LedOut[2]=Disp_T ab[D[1]%100/10]&0x7f;LedOut[3]=Disp_T ab[D[1]%10];LedOut[4]=Disp_T ab[D[0]%10000/1000];LedOut[5]=Disp_T ab[D[0]%1000/100]&0x7f;LedOut[6]=Disp_T ab[D[0]%100/10];LedOut[7]=Disp_T ab[D[0]%10];for( i=0; i<8; i++){ P1 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}for (j = 0 ; j<90 ;j++) { ;}}P1 = 0XFF;}}/*************************此部分为I2C总线的驱动程序*************************************/#include#include#include#define NOP() _nop_() /* 定义空指令*/#define _Nop() _nop_() /*定义空指令*/sbit SCL=P2^0; //I2C 时钟sbit SDA=P2^1; //I2C 数据bit ack; /*应答标志位*//************************************************************** *****起动总线函数函数原型: void Start_I2c();功能: 启动I2C总线,即发送I2C起始条件.********************************************************************/ void Start_I2c(){SDA=1; /*发送起始条件的数据信号*/_Nop();SCL=1;_Nop(); /*起始条件建立时间大于4.7us,延时*/_Nop();_Nop();_Nop();_Nop();SDA=0; /*发送起始信号*/_Nop(); /* 起始条件锁定时间大于4μs*/_Nop();_Nop();_Nop();_Nop();SCL=0; /*钳住I2C总线,准备发送或接收数据*/_Nop();_Nop();}/************************************************************** *****结束总线函数函数原型: void Stop_I2c();功能: 结束I2C总线,即发送I2C结束条件.*************************************************************** *****/ void Stop_I2c(){SDA=0; /*发送结束条件的数据信号*/_Nop(); /*发送结束条件的时钟信号*/SCL=1; /*结束条件建立时间大于4μs*/_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1; /*发送I2C总线结束信号*/_Nop();_Nop();_Nop();_Nop();}/************************************************************** *****字节数据发送函数函数原型: void SendByte(UCHAR c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

AVR单片机595驱动8位数码管的显示的电路实现

AVR单片机595驱动8位数码管的显示的电路实现

A VR单片机595驱动数码管显示一、电路实现8位数码管的电路如下图所示数码管是一种半导体发光器件,其基本单元是发光二极管。

数码管按段数分为七段数码管和八段数码管(还有一种“米”字型的数码管,其段数更多),八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),其基本原理是:将所有LED的一端(正极、负极均可)连在一起作为一个公共端,然后通过分别控制这组LED的另一个端口来使部分LED点亮,从而达到显示一定字形的目的。

数码管的分类:按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。

共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。

当某一字段的阴极为高电平时,相应字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。

共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。

当某一字段的阳极为低电平时,相应字段就不亮。

我们在实际使用中一定要搞清楚数码管是共阴极的还是共阳极的。

数码管段、位引脚的确定(以4位8段数码管为例),我们在实际应用中购买的数码管不像电阻、电容、集成等元件那样有数据手册或者直接在元件上标明管脚序号和用途,并且市场上数码管的管脚排列顺序并不是一致的,所以我们购买回来的数码管一般都要亲自测量一下各个引脚的用途,怎么测量呢?数码管引脚测量分三步:极性判断(共阳极还是共阴极)、公共端判断(位选端口)、段码端判断(段选端口)。

首先要确定数码管是共阴极还是共阳极的:找一个3到5V的直流电源,准备几个1K或者几百欧姆的电阻。

将电源的正极串接一个电阻后连在数码管的任意一个脚上,然后将电源的负极逐个接到数码管的其余引脚上,观察数码管的某一段是否会点亮,如果全部引脚试过都没有亮的,那么将电源正极(串电阻)换一个引脚再试,直到有一个LED发光,这时固定电源负极不动,电源正极(串电阻)逐个接到数码管的其余引脚上,如果有8段LED都亮,说明该数码管是共阴极的。

AVR ADC采集1602显示

AVR ADC采集1602显示

/*************************A VR单片机ADC采集电压值,lcd1602显示内部采用1M时钟write:电子狼**************************/#include<avr/io.h>#include<math.h>#define uint unsigned int#define uchar unsigned charconst uchar table[]=" RESULT IS: ";const uchar table1[]={'0','1','2','3','4','5','6','7','8','9'};volatile uchar average;volatile float v_in;void delay(uint z) //简单的延时函数{uchar x,y;for(x=z;x>0;x--){for(y=200;y>0;y--){asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");}}}void io_init()//IO口初始化{DDRB=0XFF;DDRC=0XFF;PORTB=0;PORTC=0;}void write_com(uchar com) //向液晶写指令{PORTC&=~_BV(PC6);PORTB=com;delay(5);PORTC|=_BV(PC7);delay(5);PORTC&=~_BV(PC7);}void write_data(uchar data)//向液晶写数据{PORTB=0;PORTC=_BV(PC6);PORTB=data;delay(5);PORTC|=_BV(PC7);delay(5);PORTC&=~_BV(PC7);}void lcd_init() //液晶的初始化{PORTC&=~_BV(PC7);write_com(0X38);write_com(0X0C);write_com(0X06);write_com(0X01);}void adc_init() //adc采集的初始化{DDRA&=~_BV(PA0);PORTA&=~_BV(PA0);ADMUX|=_BV(REFS0)|_BV(ADLAR); //外部参考电压5V/左对齐方式去高八位ADCSRA|=_BV(ADEN)|_BV(ADSC)|_BV(ADA TE)|_BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0); //adc采集使能/adc开始转换/自动触发使能/128预分频}void adc_result(){uchar numb;volatile uint adc_result;for(numb=0;numb<200;numb++) //采集200次电压数据并求平均值{while(!(ADCSRA&(_BV(ADIF))));adc_result=ADCH;}average=adc_result;v_in=(float)((5.0000*average)/256);}void lcd_data() //向lcd写采集到的电压的数据{uint e_result;e_result=(uint)(v_in*1000);write_com(0x80+0x41); //写整数部分write_data(table1[e_result/1000]);delay(5);write_com(0x80+0x42);write_data('.');delay(5);write_com(0x80+0x43); //写小数部分write_data(table1[e_result%1000/100]);delay(5);write_com(0x80+0x44);write_data(table1[e_result%100/10]);delay(5);write_com(0x80+0x45);write_data(table1[e_result%100%10]);delay(5);}int main(void) //主函数{uchar num;io_init();lcd_init();adc_init();write_com(0X80);for(num=0;num<11;num++) {write_data(table[num]); }while(1){adc_result();lcd_data();}}。

adc0809电压采样并用数码管显示

adc0809电压采样并用数码管显示
//P2=0xf7;P0=table[ad0] ;delay(2);
//P2=0xfb;P0=table[ad1] ;xiaoshudian=0;delay(2);
//P2=0xfd;P0=table[ad2] ;delay(2);
//P2=0xfe;P0=table[ad3] ;delay(2);
/*********************************************************************************************************
数码管显示AD采样得到电压值,输入电压0-5V(可以加一个分压电路,进而扩大采样范围,其他举一反三)。
dispbuf[1]=(temp/100)%10;
dispbuf[0]=(temp/10)%10;
*/
ad0=(temp/1000)%10;//分离数据
ad1=(temp/100)%10;
ad2=(temp/10)%10;
ad3=(temp/1)%10;
/********************************************************************************************************************************
步进0.01V,误差0.01V。
改进:1.可改用液晶显示,进而增加可显示范围
2.可加键盘,完成通道的步进
**********************************************************************************************************/
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/**********************
A VR与ADC采集采集的数据有数码管显示,显示的数据为ADCL和ADCH中读出的数据并不为实际的电压值通过计算公式V=num*5/1024;可得到实际的电压值
num位数码管上得到的数据
WRITE:ew电子狼
DA TA;2012/3/4
***********************/
#include<avr/io.h>
#include<avr/interrupt.h>
#define uint unsigned int
#define uchar unsigned char
volatile uint temp_l,temp_h;
const uchar table[]=
{0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
const uchar wei[]={0x01,0x02,0x04,0x08};
uchar data[4];
void delay(uint z) //简单的延时函数
{
uchar x,y;
for(x=z;x>0;x--)
{
for(y=200;y>0;y--)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
}
void adc_init() //adc的初始化
{
DDRA&=~_BV(PA0);
PORTA&=~_BV(PA0); //设置PA0为采集通道
ADMUX|=_BV(REFS0); //选择外部电压源为参考电压
ADCSRA|=_BV(ADEN)|_BV(ADSC)|_BV(ADA TE)|_BV(ADIE)|_BV(ADPS2)|_BV(ADPS1)|_ BV(ADPS0);
//使能ADC/使能开始转换/自动触发中断/中断使能/左对齐方式/128分频
sei(); //开总中断
}
void send_data() //数码管显示函数
{
uchar num;
for(num=0;num<4;num++)
{
PORTC=_BV(PC6);
PORTB=table[data[num]];//发送段选
PORTC&=~_BV(PC6);
PORTC=0X00;
PORTC=_BV(PC5);
PORTB=wei[num]; //发送位选
PORTC&=~_BV(PC5);
delay(3);
}
}
int main() //主函数
{
adc_init();
DDRC=0XFF;
DDRB|=0XFF;
while(1);
}
SIGNAL(SIG_ADC) //ADC转换完成中断
{
temp_l=ADCL; //先读取第八位
temp_h=ADCH*256+temp_l; //在读取干二位
data[0]=temp_h/1000; //显示的数据
data[1]=temp_h%1000/100;
data[2]=temp_h%100/10;
data[3]=temp_h%100%10;
send_data(); }。

相关文档
最新文档