AVR与AD采集数码管显示
/**********************
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(); }。
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转换与数码管显示设计(实验四)
如图为 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数据采集与显示实验
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转换程序,数码管显示#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采集
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单片机专用周实习报告题目:数码管一位显示班级:学号:姓名:目录一、实验目的 (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显示
#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
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);}} }。
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++); }。
