(参考)基于AVR_atmega16数字式直流电压表的开发与研究.doc

上传人:rrsccc 文档编号:9006927 上传时间:2021-01-29 格式:DOC 页数:18 大小:319.50KB
返回 下载 相关 举报
(参考)基于AVR_atmega16数字式直流电压表的开发与研究.doc_第1页
第1页 / 共18页
(参考)基于AVR_atmega16数字式直流电压表的开发与研究.doc_第2页
第2页 / 共18页
(参考)基于AVR_atmega16数字式直流电压表的开发与研究.doc_第3页
第3页 / 共18页
(参考)基于AVR_atmega16数字式直流电压表的开发与研究.doc_第4页
第4页 / 共18页
(参考)基于AVR_atmega16数字式直流电压表的开发与研究.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《(参考)基于AVR_atmega16数字式直流电压表的开发与研究.doc》由会员分享,可在线阅读,更多相关《(参考)基于AVR_atmega16数字式直流电压表的开发与研究.doc(18页珍藏版)》请在三一文库上搜索。

1、基于AVR_atmega16简易数字式直流电压表的设计摘要 本设计是基于ATmega16单片机开发平台和自动控制原理的基础上实现的一种数字电压表系统。该系统采用ATmega16单片机作为控制核心,以MAX187为数据采样系统,实现被测电压的数据采样;使用系列比较器检测输入电压的范围,并通过继电器阵列实现了输入量程的自动转换;使用HS1602A LCD液晶显示器显示被测电压。关键词 量程自动转换 电压检测 MAX187 ATmega16 LCD显示目 录一、课程设计目的二、用途及功能三、硬件设计思想和电路原理图1.系统总体设计与框图2.实际电路图 2.1单片机系统 2.2 AD转换电路 2.3信

2、号调理模块 2.4继电器模块 2.5 LCD显示电路3.总体设计电路图4.硬件单元的使用四、软件设计与流程1.系统软件介绍2.软件程序流程图3.软件功能五、系统测试过程及测试数据六、设计所需的全部资源七、成员分工和工作情况八、参考文献九、附录一、课程设计目的1.实现自动切换量程的数字电压表。2. 通过本次课程设计加深对单片机课程的全面认识和掌握。3. 锻炼通过自学与自己探索的方式解决问题的能力。4. 通过此次课程设计将单片机软硬件结合起来对程序进行编辑,校验,锻炼实践能力和理论联系实际的能力。5. 锻炼团队分工合作与协调能力。二、用途及功能根据待测电压的不同,自动切换量程并检测电压的大小。三、

3、硬件设计思想和电路原理图1.系统总体设计与框图本系统采用ATMEGAL16L单片机作为控制核心,以12位的A/D转换MAX187为数据采样系统,实现被测电压的高精度数据采集与显示。2.实际电路图2.1单片机系统本设计是以ATMEGA16L单片机为控制核心,其外围接口电路如图所示。单片机的PA口主要用于信号检测,PB口用于继电器控制,PC口用于按键输入、过压报警等,PD口用于液晶显示。2.2 AD转换电路我们利用MAX187作为AD数据采样器件, 它是串行接口方式的A/D转换器,仅有8个引脚,外围接线很少。体积小、速度快、精度高。2.3信号调理模块该部分主要实现的功能是自动量程切换和电压变换,模

4、块主要由电压极性检测电路、电压范围粗测电路、电压变换电路、继电器模块四部分组成。2.3.1 电压极性检测电路电压极性检测电路采用过零比较器检测负电压的方式实现的,运算放大器LM324的反向端接地,同向端通过100K电阻接输入信号。2.3.2 电压范围粗测电路为了粗略地得到被测量的电压范围我们采用多组比较器的方式,通过阶梯式比较的方法确定输入电压的范围。2.3.3量程切换电路电路由衰减电阻、切换继电器和运算放大器组成,对应的是衰减1/2、1/3、1/4和无零漂放大50倍,切换电路如图所示。电压变换到0-5V标准信号后,再由A/D转换进行采样,最后由单片机算法还原。2.4继电器模块我们采用了八个继

5、电器实现量程的自动切换,其动作由单片机PB口控制。2.5 LCD显示电路采用字符型液晶模块HS1602与单片机的接口和编程的方法显示测量的电压大小、极性、峰值。3.总体设计电路图4.硬件单元的使用将待测电压输入,首先进行极性判断,输入单片机。然后对继电器8进行控制,正电压不工作,负电压接通常断进行电压反向。输入电压粗测电路判断电压范围并输入单片机。根据输入端控制继电器1,2,3,4,5,进行电压增减。继电器6根据极性接通,使正电压输入A/D转换器MAX187进行测量并输入单片机。最后输入到LCD显示测量结果。四、软件设计与流程1.系统软件介绍软件部分采用模块化程序设计的方法,由单片机控制主程序

6、、A/D转换子程序、电压检测及继电器控制程序、液晶显示组成。系统软件设计是在C编译环境下进行的,由于C语言程序可移植性好,所以提高了编程的效率。2.软件程序流程图3.软件功能PC0首先接收数据,据此控制PC6,PC7实现电压转换,保证正电压输出。PB0,PB1,PB2,PB3,PA6的输入值通过PA1,PA2,PA3,PA4,PA5控制继电器1,2,3,4,5实现电压增减并输入A/D转换器MAX187进行测量。最后输入PB4,PB6,PB7并由PD4,PD5,PD6,PD7输入LCD显示。五、系统测试过程及测试数据由于开发板无法连接计算机,不能进行烧录,项目未完成。六、设计所需的全部资源ATm

7、ega16L,MAX187,LM324,OP07,继电器,电阻,导线,电容,三极管9013七、成员分工和工作情况刘同川:主要负责硬件连接及部分后期工作刘巍 :主要负责电路设计,硬件排布以及各种资料的制作龙世同:主要负责程序编写工作基本上由三人共同承担,贡献相当八、参考文献(一)网站资料http:/?http:/.?http:/?(二)电子资料 Mega16数据手册(三)书籍资料1ATmega8原理及应用手册马潮 詹卫前 耿德根 编 清华大学出版社2C语言程序设计 谭浩强 编 清华大学出版社3AVR单片机C语言开发入门指导 沈文 Eagle lee詹卫前 编 清华大学出版社。4AVR单片机嵌入式

8、系统原理与应用实践马潮 编 北京航空航天大学出版社5单片机原理与接口 李茂奎九、附录程序/ICC-AVR application builder : 2009-6-17 3:59:07/ Target : M16/ Crystal: 4.0000Mhz#include #include /call this routine to initialize all peripheralsvoid init_devices(void) /stop errant interrupts until set up CLI(); /disable all interrupts port_init(); MCU

9、CR = 0x00; GICR = 0x00; TIMSK = 0x00; /timer interrupt sources SEI(); /re-enable interrupts /all peripherals are now initialized/ICC-AVR application builder : 2009-6-11 21:56:23/ Target : M16/ Crystal: 4.0000Mhz#include #include stdio.h#define Vref 4420#define ss 4 /PB4#define mosi 5 /PB5#define mis

10、o 6 /PB6#define sck 7 /PB7#define p17 0 /pc0 input#define p10 0 /pb0#define p11 1 /pb1#define p12 2 /pb2#define p13 3 /pb3#define p14 6 /pa6#define mats6 6 /pc6 output#define mats8 7 /pc7#define RS_0 PORTD &= (1 PD0)#define RS_1 PORTD |= (1 PD0)#define RW_0 PORTD &= (1 PD1)#define RW_1 PORTD |= (1 P

11、D1)#define EN_0 PORTD &= (1 PD2)#define EN_1 PORTD |= (1 1); /毫秒级延时程序晶振8MHZ void delay_ms(unsigned int time) while(time!=0) delay_us(1000); time-; /*显示屏命令写入函数*/void LCD_write_com(unsigned char com) RS_0; RW_0; PORTB = com; EN_1; delay_us(20); EN_0; /*显示屏命令写入函数*/void LCD_write_data(unsigned char data

12、) RS_1; RW_0; PORTB = data; EN_1; delay_us(200); EN_0;/*显示屏清空显示*/void LCD_clear(void) LCD_write_com(0x01); delay_ms(5);/*显示屏字符串写入函数*/void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) if (y = 0) LCD_write_com(0x80 + x); else LCD_write_com(0xC0 + x); while (*s) LCD_write_data( *s);

13、s +; /*显示屏单字符写入函数*/void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) if (y = 0) LCD_write_com(0x80 + x); else LCD_write_com(0xC0 + x); LCD_write_data( data); /*显示屏初始化函数*/void LCD_init(void) DDRB = 0xFF; /*I/O口方向设置*/ DDRD |= (1 PD3) | (1 PD4) | (1 PD6); LCD_write_com(0x38); /*显示

14、模式设置*/ delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); LCD_write_com(0x08); /*显示关闭*/ LCD_write_com(0x01); /*显示清屏*/ LCD_write_com(0x06); /*显示光标移动设置*/ delay_ms(5); LCD_write_com(0x0C); /*显示开及光标设置*/unsigned char X; unsigned char Y;unsigned int ADC_M

15、AX187(void);void lcd_clear ( void );unsigned char lcd_init(unsigned char lcd_columns);void delay_1ms(void);void spi_init(void);uint ADC_MAX187(void);void delay_1us(void);void delay_nus(unsigned int n);void delay_nms(unsigned int n);void delay_1us(void) /2.5us延时函数 asm(nop); void delay_nus(unsigned in

16、t n) /N us延时函数 unsigned int i=0; for (i=0;in;i+) delay_1us(); void spi_init(void)SPSR = 0x0;SPCR = 0x50;/WIZARD_MAP(SPI)uint ADC_MAX187(void)static uint temp,temp1;PORTB&=(1sck);PORTB&=(1ss);delay_nus(2);while(!PORTB&(1miso);SPDR=0x00;while(!SPSR&(1SPIF);PORTB&=(1sck);temp=SPDR;temp=(uint)temp8;SPSR

17、=0x00;while(!SPSR&(13;/while(!PORTB&(1miso);PORTB|=(1ss);return (temp);void lcd_gotoXY ( unsigned char, unsigned char );/dyb_system.c : source file for the dyb_system project/char singal8;unsigned char fhao;/dyb_systemvoid delay_1ms(void) /1ms延时函数 unsigned int i; for (i=0;i420;i+); void delay_nms(un

18、signed int n) /N ms延时函数 unsigned int i=0; for (i=0;in;i+) delay_1ms(); /WIZARD_MAP(General)/WIZARD_MAP(General)/WIZARD_MAP(Watchdog)/ Watchdog Disabled/WIZARD_MAP(Watchdog)/WIZARD_MAP(Analog Comparator)/ Analog Comparator Disabled/WIZARD_MAP(Analog Comparator)void Process(unsigned int tepp,char *p2)

19、p26=tepp%10+0;tepp=tepp/10;p25=tepp%10+0;tepp=tepp/10;p24=tepp%10+0;tepp=tepp/10;p23=.;p22=tepp%10+0;tepp=tepp/10;p21=tepp%10+0;if(p21=0&p22=0)p21= ;if(fhao=1)p20=-;else p20= ;int bitset(int l, int bit) return ( l & bit) = bit); void main() static unsigned char count,flag; static unsigned int max,av

20、er_value; unsigned int bjtemp; long int average;unsigned int ktemp;/WIZARD_MAP(Initialization)port_init();spi_init();/WIZARD_MAP(Initialization)/ TODO: Add extra initialization here/WIZARD_MAP(Global interrupt)/WIZARD_MAP(Global interrupt)lcd_gotoxy(0,0);LCD_write_str(0,0,*Voltage* );while(1) / TODO

21、: Add your code here static char data,dl_AV=1; /uint temp; if(PINC&(1p17)/检测电压的极性 PORTC|=(1mats6)|(1mats8);/高电平时为正,继电器不操作 fhao=1; else PORTC&=(1mats6)|(1mats8);/底电平时为负,继电器6、8操作 fhao=0; data=(PINA&(1p14)|(PINB&(1p13)|(PINB&(1p12)|(PINB&(1p11)|(PINB&(1p10); PORTA&=0xc1; switch(data&0x4f) case 79:PORTA

22、|=(1mats5);dl_AV=0.02;break;/继电器5操作 case 78:PORTA|=(1mats1);dl_AV=1;break;/继电器1操作 case 76:PORTA|=(1mats2);dl_AV=2;break;/继电器2操作 case 72:PORTA|=(1mats3);dl_AV=3;break;/继电器3操作 case 64:PORTA|=(1mats4);dl_AV=4;break;/继电器4操作 case 0: PORTA&=(1max)max=bjtemp; average+=bjtemp; if(PINA&(1B_key)=0)/如果按下按键PD7

23、delay_nms(10); /去抖动 if(PINA&(1B_key)=0) flag=0x01; bitset(PINA,B_key); if(flag=1) lcd_gotoxy(0,1);/显示最大值 LCD_write_str(0,1,Max_V=); ktemp=1.0858*max; Process(ktemp,singal); lcd_gotoxy(6,1); LCD_write_str(6,1,singal); else lcd_gotoxy(0,1);/显示平均值 LCD_write_str(0,1,Ave_V=); ktemp=1.0858*aver_value; Process(ktemp,singal); lcd_gotoxy(6,1); LCD_write_str(6,1,singal); (注:文档可能无法思考全面,请浏览后下载,供参考。可复制、编制,期待你的好评与关注)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1