版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、湖南大学电气与信息工程学院本科生课程设计题目: 基于ADuC848的智能电压监视仪课程:微机原理与接口技术专业:电气工程及其自动化班级:XX班学号:XXXX姓名:XX指导老师: XX设计时间: 2015年4月27日至2015年5月31日目录:1、 任务及设计要求(课题要求)2、 系统原理框图(框架图)3、 硬件原理图(含元器件清单,使用到的硬件模块接线图,分模块绘制并解释各模块作用)4、 程序(含全部源程序及详细注释,所有功能的程序流程图)5、 使用说明书(含功能描述及具体的操作指南)6、 心得体会(收获,感想,建议和看法等)7、 参考文献(教材、论文、相关书籍等) (一)任务及设计要求设计一
2、个智能电压监视仪;电网电压的信号可用变压器从市电上取得,也可用+5V的电位器模拟。2、要求1)显示内容:电压当前值;最大电压值;最小电压值;电压合格率;超上限率;超下限率;电压上、下限给定值、当前时间2)利用小键盘实现电压上、下限给定值的输入和显示选择命令3)电压采样周期为1秒,平均值的计算周期为2分钟,所求得的电压平均值作为统计和计算的依据,统计和计算以一天为单位,超过24小时则从头开始统计计算4)超上限率=(其中超上限的次数)/(采样计算得到的总的电压平均值次数)*100%;超下限率的计算公式与此类似5)合格率=1-超上限率-超下限率6)显示北京时间,可调整7)当前电压超上限或下限时,利用
3、蜂鸣器报警(二)系统原理框图(三)硬件原理图1. 元器件清单ADuC848开发板, 5V电源适配器 ,LCD1602 ,USB转串口线 ,杜邦线、短路帽等。2. 硬件模块接线图及各模块作用 2.1电源模块原理图如图1.2所示。 采用5V电源适配器供电(开关往上拨、插针1下面两脚接跳线帽)。将开关sw4第2、3脚接通(开关往上拨),电源网络DVDD连接到插针1第2脚的输出,将插针1的第1、2脚(插针1下面两脚)接跳线帽,DVDD直接连接到电源适配器输入端,即为5V电源适配器供电模式。2.2模数转换 ADuC848内部有16位ADC,模拟信号输入模块原理图如图1.3所示。图1.3 模拟信号输入模块
4、D15和D16为钳位保护二极管,R55为限流保护电阻。其中CONAIN1对应板上的接口5、CONAIN2对应板上的接口6。CONAIN1和CONAIN2的第1、2脚在板上的分布和在原理图上的类似,均为1脚朝上。模拟信号有两种输入方式: (1)两路单端输入。把输入信号电压高的一端接到第1脚,电压低的一端接到同一个接口的第2脚。(2)一路差分输入。把输入信号的两端分别接到CONAIN1和CONAIN2的第1脚。 2.3显示模块 采用LCD1602,显示信号连接图如图1.7所示。图1.7 LCD信号连接关键网络名和引脚名解释: (1)DISCTRL04:显示控制信号。(2)D0D7、DB0DB7:数
5、据总线。(3)E:LCD使能信号。(4)RS:数据、指令选择信号。(5)RW:读、写选择信号。(6)CS1、CS2:LCD12864由两部分组成,CS1和CS2为选择信号。板上接口4的上排位LCD12864的接口,下排位LCD1602的接口,排针和排母左对齐插入。切勿插错。2.4蜂鸣器和红外发送模块 该模块原理图如图1.10所示。图1.10 蜂鸣器和红外发送本设计中采用无源电磁式蜂鸣器,蜂鸣器由PWM1(P2.6)控制,红外二极管由PWM0(P2.5)控制。PWM1和PWM0均为片内PWM模块的输出。蜂鸣器和红外LED的驱动均采用普通NPN三极管。为方便调试,对该模块中的信号设了测试点,具体位
6、置参见附图1。插针配置: (1)若要使用蜂鸣器,可以接通插针3,为减少功耗,不用请断开。(2)若要使用红外二极管,可以接通插针4,为减少功耗,不用请断开。2.5按键输入 模块该模块原理如图1.12所示。图1.12 按键模块由于P1口(用于行扫描)内部无上拉电阻,为使无键按下时行信号为高电平,故将行信号接上拉电阻,电阻大小10K即可。引脚复用:P2.0P2.3为4X4矩阵式键盘列扫描信号,又复用作步进电机控制信号,SPI信号、P2.1P2.3还复用为数码管第5、6、7位位码控制信号。参与复用的一项功能使用时,其他参与复用的功能则不能使用。插针配置: (1)插针10上面两脚接跳线帽,4X4矩阵式键
7、盘输入,行扫描信号为P1.0P1.3,列扫描信号为P2.02.3。(2)插针10下面两脚接跳线帽,独立按键输入,该模式有4个独立按键可用,按键扫描所用端口为P1.0P1.3。这4个按键为4X4矩阵键盘的左边4个按键。2.6 IIC总线(RTC时钟和EEPROM) 该模块原理图如图1.13所示。图1.13 IIC总线连接AduC848片内有I2C模块,并有独立的引脚SCLOCK和SDATA。板上的RTC时钟芯片DS1307和EEPROM芯片AT24C08均使用了I2C总线。板上设置了I2C接口,方便MCU与板外的I2C设备进行通信。对SCLOCK和SDATA设置了测试点。2.7复位与下载 复位与
8、下载电路如图1.14所示。图1.14 复位与下载进入下载或调试模式的步骤为: (1)按住BTN1(down or debug按键)不要放开; (2)按下BTN2(reset按键),然后放开BTN2(reset按键);(3)放开BTN1(down or debug按键)。这样单片机就进入了调试模式,可以下载或调试程序。(四)程序(含全部源程序及详细注释,所有功能的程序流程图)4.1矩阵式键盘矩阵键盘流程图4.2蜂鸣器驱动程序流程图如下图所示。a、中断子程序流程图4.3 1602字符显示程序流程图如图所示。4.4 A/D转换程序流程图如图所示。4.5全部源程序(含注释)1)键盘模块#include
9、<AD.h>#include<table.h>#include<lcd1602.h>#include<jianpan.h>#include<DS1307.h>#include<main.h>idata uchar id; /跳出显示时间界面的标志量,id=0,跳出;否则,继续显示。idata uchar kcount=0; /按键次数量,亦即光标显示位置的标志量idata uchar kcount1; /当与kcount相等时,说明没按下光标移动键uchar ad_flag=0; /设置上下限值的标志量,上限值对应1,下限
10、值对应2bit tflag=0; /改动时间标志,tflag=1时能改动时间,tflag=0时锁存时间,禁止改动。uchar ad=0; /AD显示物理量标志号,各AD物理量对应不同标志号,如当前电压值为1,最大值为2,最小值为3. void delay() /延时函数uchar i;for(i = 0;i < 100;i+);/光标移动void move() if(tflag) if(ad_flag=0) /调节时间时光标移动情况 /超过范围则光标复位 if(kcount>16) kcount=1; /遇到非数字符号调到下一位有效位 if(kcount=3|kcount=6|kc
11、ount=11|kcount=14) kcount+; lcd_wc(0x0f);/光标显示并闪烁 /光标闪烁位置 if(kcount>8) lcd_wc(0xC0+kcount-9); /当kcount大于8时,光标从第二行开始闪烁 else lcd_wc(0x80+kcount-1); /当kcount小于8时,光标从第一行开始闪烁 /当不再按键时,光标停留在原位上 kcount1=kcount; delay(); while(kcount=kcount1) Keyscan(); if(ad_flag=1|ad_flag=2) /调节电压上、下限值时光标移动情况 lcd_wc(0x0
12、f);/光标显示并闪烁 lcd_wc(0xC0); tflag=0;/lcd屏幕显示void lcd_display(uchar key) switch(key) case 1: /当前电压值 Check_Busy();lcd_wc(lcd_clear);gettable1();id=0;setbz_flag(0); while(ad) Data_Process(ad); Keyscan();break; case 2: /最大电压值 Check_Busy();lcd_wc(lcd_clear);gettable2();id=0;setbz_flag(0);while(ad) Data_Pro
13、cess(ad); Keyscan();break; case 3:/最小电压值 Check_Busy();lcd_wc(lcd_clear);gettable3();id=0;setbz_flag(0);while(ad) Data_Process(ad); Keyscan();break; case 4:/电压合格率 Check_Busy();lcd_wc(lcd_clear);gettable4();id=0;setbz_flag(1);while(ad) Data_Process(ad); Keyscan();break; case 5:/超上限率 Check_Busy();lcd_w
14、c(lcd_clear);gettable5();id=0;setbz_flag(2);while(ad) Data_Process(ad); Keyscan();break; case 6: /超下限率 Check_Busy();lcd_wc(lcd_clear);gettable6();id=0;setbz_flag(3);while(ad) Data_Process(ad); Keyscan();break; case 7:/电压上限值 Check_Busy();lcd_wc(lcd_clear);gettable7();id=0;ad_flag=1;tflag=1;setbz_flag
15、(0);while(ad) Data_Process(ad); Keyscan();break; case 8:/电压下限值 Check_Busy();lcd_wc(lcd_clear);gettable8();id=0;ad_flag=2;tflag=1;setbz_flag(0);while(ad) Data_Process(ad); Keyscan();break; case 9:/显示时间 Check_Busy();lcd_wc(lcd_clear);id=1;ad_flag=0;tflag=1; display(); break; case 10:/确认 Check_Busy();
16、id=1; makeSure();break; /键盘扫描void Keyscan() unsigned char temp;unsigned int j=0; P1&=0xf0; /P1口低四位作为数字输入时应往相应引脚写0P2&=0xf0; /置列扫描信号为0temp=P1&0x0f; if(temp!=0x0f) /P1口低四位不全为1,则有键被按下 delay(); /延时消抖 if(temp=(P1&0x0f) /消抖后再判断键值 P2|=0x07; /P2.3为0switch(P1&0x0f)case 0x0e:/显示电压当前值 ad=1;
17、lcd_display(1);break;case 0x0d:/显示超上限率ad=5; lcd_display(5);break;case 0x0b:/当前时间ad=0; lcd_display(9); break;case 0x07:/确认 ad=0; lcd_display(10); break;case 0x0f:break;default:break;P2&=0xf0; P2|=0x0b; /P2.2为0switch(P1&0x0f)case 0x0e: /显示最大电压值 ad=2; lcd_display(2); break;case 0x0d:/显示超下限率 ad=
18、6; lcd_display(6); break;case 0x0b: /光标移动ad=0; kcount+; move(); break;case 0x07:/增加电压值 ad=0; tiaoya_add(ad_flag); break;case 0x0f:break;default:break;P2&=0xf0; P2|=0x0d; /P2.1为0switch(P1&0x0f)case 0x0e:/显示最小电压值ad=3; lcd_display(3); break;case 0x0d: /电压上限给定值 ad=7; lcd_display(7); break;case 0
19、x0b: /加光标所在位置的数值 ad=0; addValue(kcount); break;case 0x07: /减小电压值 ad=0; tiaoya_sub(ad_flag); break;case 0x0f:break;default:break;P2&=0xf0; P2|=0x0e; /P2.0为0switch(P1&0x0f)case 0x0e:/显示电压合格率ad=4; lcd_display(4); break;case 0x0d: /电压下限给定值ad=8; lcd_display(8); break;case 0x0b: /减光标所在位置的数值ad=0; s
20、ubValue(kcount); break;case 0x07: /电压调整完毕 ad=0; lcd_wc(0x0c); break;case 0x0f:break;default:break; /设置按键次数量,主要负责清零重置void setk(uchar count)kcount=count;/获得跳出显示时间界面的标志量uchar getid() return id;/获得设置上下限值的标志量uchar getad_flag() return ad_flag; /获得AD显示物理量标志号uchar getad() return ad;2)LCD1602模块#include <l
21、cd1602.h>/延时函数void lcd_delay(uint t)while(-t);/检测忙信号void Check_Busy(void)P0 = 0xff; /P0口作为输入lcd_delay(50);rs = 0;rw = 1;e = 1;lcd_delay(50);while(P0&0X80);e = 0;rw = 0;P0 = 0X00; /lcd写指令void lcd_wc(uchar cmd) Check_Busy();rs=0;rw=0;e=1;P0=cmd;lcd_delay(3);e=0;lcd_delay(65535);lcd_delay(65535)
22、;/lcd写数据void lcd_wd(uchar dat)Check_Busy();rs=1;rw=0;e=1;P0=dat;lcd_delay(3);e=0;lcd_delay(250);/显示位置void lcd_pos(uchar pos ) pos+=0x80;lcd_wc(pos); /lcd初始化void lcd_init() uchar code table="Voltage Monitor"uint i=0;lcd_delay(60000);lcd_delay(60000);lcd_delay(60000);lcd_delay(60000);lcd_wc(
23、0x38);lcd_delay(60000);lcd_delay(60000);lcd_wc(0x38);lcd_delay(60000);lcd_delay(60000);lcd_wc(0x38);lcd_delay(60000);lcd_delay(60000);lcd_wc(0x38);/设置16x2显示,5x7点阵,8位数据接口lcd_wc(0x0c);/开显示,不显示光标lcd_wc(0x06);/地址指针加1,且光标加1,整屏显示不移动lcd_wc(0x01);/清屏/lcd_wc(0x0f); /显示开关 lcd_pos(0); while(tablei!='0'
24、) lcd_wd(tablei); i+; 3)DS1307模块#include<DS1307.h>/#include<LCD1602.h> /#define uchar unsigned char /#define uint unsigned intvoid iic_delay_4us()uchar t=25+5;/适当增加延时,保证信号while(-t);void iic_delay_5us()uchar t=32+5;while(-t);void iic_init()I2CM=1;/master模式MDE=1;MCO=0;/允许SDA改变MDO=1;/释放SDAv
25、oid iic_start()MDE=1;/允许输出MCO=0;/时钟拉低,允许数据线改变MDO=0;/下面在数据线上产生一个脉冲MCO=1;/制造起始条件iic_delay_4us();/等待稳定MDO=1;/上升iic_delay_5us();/等待稳定MDO=0;/拉低数据线,产生起始信号iic_delay_4us();/等待稳定MCO=0;/时钟拉低,开始void iic_stop()MDE=1;/允许输出MCO=0;MDO=0;MCO=1;iic_delay_4us();MDO=1;iic_delay_5us();/MDO=0;/中止后应该释放数据线/1307读入位数据void ii
26、c_write_bit(bit dat)MDE=1;MCO=0;MDO=dat;iic_delay_4us();MCO=1;iic_delay_4us();MCO=0;iic_delay_4us();/1307写出,输出1307发送出的位数据bit iic_read_bit()bit dat;MDE=1;MCO=0;MDO=1;/释放数据线MDE=0;iic_delay_4us();MCO=1;iic_delay_4us();dat=MDI;MCO=0;iic_delay_4us();return dat; /判断1307写出是否有效,即从机是否接受,输出应答信号。该信号为低,则表明有效bit
27、 iic_write_char(uchar dat)uchar i;bit res;for(i=0;i<8;i+)iic_write_bit(dat>>(7-i)&0x01);res=iic_read_bit();return res; /读入1307,输出写入的字符数据uchar iic_read_char(bit nack)uchar dat=0,i;for(i=0;i<8;i+)dat<<=1;if(iic_read_bit()=1)dat+;iic_write_bit(nack);return dat; /判断写地址是否有效bit iic_w
28、rite_address(uchar id,uchar address)iic_start();if(iic_write_char(id)!=0)return 1;if(iic_write_char(address)!=0)return 1;return 0;4)AD模块#include <lcd1602.h>#include <AD.h>#define v_count 9#define a_count 3unsigned char InterruptCounter=0;/定义中断计数变量并赋初值0 unsigned int count=0;/定义秒计数变量并赋初值0u
29、nsigned int count1=0; unsigned int max,min;/电压最大、最小值 unsigned int CurrentValue;/电压当前值 unsigned int qual_rate,overup_rate,overlow_rate;/电压上、下限值、合格率、超上限率、超下限率unsigned int upper_limit=2000;unsigned int lower_limit=0;bit bz_flag;/设标志位,区分对象是电压值还是百分比,输出“V”还是“%”unsigned int Fir_bit,Sec_bit,Thi_bit,Fou_bit;
30、 /电压位 unsigned int num=0,num1=0; /num为电压采样周期内总计数,num1为平均值计算周期内总计数unsigned int num_up=0,num_low=0; /num_up为超上限次数,num_low为超下限次数unsigned int sum=0; /sum为电压采样周期内电压总数和unsigned int valuev_count;/取样电压值数组,存放一个平均值计算周期内的每秒电压值unsigned int averagea_count;/平均值数组,存放平均值 void Init()ADCMODE = 0X23; /一直转换 /CHOP使能ADC0
31、CON1 = 0x27; /主ADC选用放大1倍,单端输入,1.28VADC0CON2 = 0x0C; /选用内部参考电源,模拟信号从AIN5 AIN6输入 /*TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1; */TMOD=0x01;/配置定时器0为16位模式,时钟是core clock,默认为1.572864MHz IE=0x82;/使能定时器0中断和全局中断 TH0=0X00; TL0=0X00; TR0=1;/开启定时器0void Data_Process(unsigned char ad)
32、unsigned int w; if(RDY0) CurrentValue=(ADC0H*256)+ADC0M)*5/256; / CurrentValue=1000; valuenum = (ADC0H*256)+ADC0M)*5/256; max=value0; min=value0; /求最大、小值 for(w=1;w<num;w+) if(valuew-1>valuew) valuew=valuew-1; else max=valuew; if(valuew-1<valuew) valuew=valuew-1; else min=valuew; sum+=valuen
33、um;/求电压采样周期内电压总和 averagenum1=sum/v_count; /取计算周期内所有采样电压值总和的平均值 /计算上、下限率 overup_rate=(num_up/num1)*100; overlow_rate=num_low/num1*100; qual_rate=99*(1-overup_rate/100-overlow_rate/100); /当超过上下限值时,蜂鸣器鸣响报警 if(CurrentValue>upper_limit|CurrentValue<lower_limit) beep=0;delay_beep(10);beep=1;delay_be
34、ep(10); /选择显示对应AD标号电压值或比率 switch(ad) case 1: AD_display(CurrentValue);break; case 2: AD_display(max); break; case 3: AD_display(min); break; case 4: AD_display(qual_rate); break; case 5: AD_display(overup_rate); break; case 6: AD_display(overlow_rate); break; case 7: AD_display(upper_limit); break;
35、case 8: AD_display(lower_limit); break; RDY0 = 0; void delay_beep(unsigned int z) unsigned int x,y;for(x=z;x>0;x-)for(y=100;y>0;y-);/定时器中断void timer0() interrupt 1 unsigned int k; InterruptCounter+; if(InterruptCounter>=24*8) InterruptCounter=0; count+;num+;/1秒采样一个电压 if(count>1) count=0;
36、/每一个采样周期获得一个平均值if(num=v_count) num1+; num=0; sum=0; /一个采样周期后采样电压值清零,重新存储 for(k=0;k<v_count;k+) valuek=0; /判断电压是否超上下限 for(k=0;k<num1;k+) if(averagek>upper_limit&&num_up<a_count) num_up+; if(averagek<lower_limit&&num_low<a_count) num_low+; /一个计算周期后清零重置if(num1=a_count)
37、 num1=0; num=0; num_up=0; num_low=0; for(k=0;k<a_count;k+) averagek=0; /将电压数据或者比率显示在lcd上void AD_display(unsigned int d) if(RDY0) if(bz_flag=0) Fir_bit = d/1000; Sec_bit = d/100%10;Thi_bit = d/10%10;Fou_bit = d%10; lcd_pos(lcd_next);/向液晶写指令lcd_wd(0x30+Fir_bit); lcd_wd(0x2e);/向液晶写'.'lcd_wd(
38、0x30+Sec_bit);lcd_wd(0x30+Thi_bit);lcd_wd(0x30+Fou_bit);lcd_wd(0x56);/向液晶写'V' else d*=100; Fir_bit = d/1000; Sec_bit = d/100%10;Thi_bit = d/10%10;Fou_bit = d%10;if(Fir_bit>9) Fir_bit=9; lcd_pos(lcd_next);/向液晶写指令lcd_wd(0x30+Fir_bit); lcd_wd(0x30+Sec_bit);lcd_wd(0x2e);/向液晶写'.'lcd_wd
39、(0x30+Thi_bit);lcd_wd(0x30+Fou_bit);lcd_wd(0x25);/向液晶写'%' /* if(bz_flag=1) d*=100; Fir_bit = d/1000; Sec_bit = d/100%10;Thi_bit = d/10%10;Fou_bit = d%10; lcd_pos(lcd_next);/向液晶写指令lcd_wd(0x30+Fir_bit); lcd_wd(0x30+Sec_bit);lcd_wd(0x30+Thi_bit);lcd_wd(0x2e);/向液晶写'.'lcd_wd(0x30+Fou_bit)
40、;lcd_wd(0x25);/向液晶写'%' */RDY0=0;/加压void tiaoya_add(unsigned char temp) Fir_bit+; if(Fir_bit>9) Fir_bit=0; lcd_wc(0xc0);lcd_wd(0x30+Fir_bit);lcd_wc(0xc0);if(temp=1) upper_limit=Fir_bit*1000; if(temp=2) lower_limit=Fir_bit*1000;/减压void tiaoya_sub(unsigned char temp) if(Fir_bit=0) Fir_bit=10
41、;Fir_bit-; lcd_wc(0xc0);lcd_wd(0x30+Fir_bit);lcd_wc(0xc0);if(temp=1) upper_limit=Fir_bit*1000; if(temp=2) lower_limit=Fir_bit*1000;/设定标志位区分电压值或者比率void setbz_flag(bit nack) bz_flag=nack;5)显示数据部分#include<AD.h>#include<lcd1602.h>#include<table.h> /当前电压值void gettable1() lcd_pos(0);lcd_wd(0x43);lcd_pos(0x01); lcd_wd(0x75);lcd_pos(0x02);lcd_wd(0x72);lcd_pos(0x03);lcd_wd(0x72);lcd_pos(0x04);lcd_wd(0x65);lcd_pos(0x05);lcd_wd(0x6E);lcd_pos(0x06);lcd_wd(0x74);lcd_po
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 变频电源通讯协议书
- 安置协议书房产归谁
- 169.社区老年食堂老年人营养健康科普宣传材料设计考核试卷
- 足球协议书都是哪些比赛
- 产品设备变更协议书模板
- 2025初级商业人像摄影师曲线工具人像光影调整考核试卷
- ups是什么协议书
- 直播网店购货协议书
- 拆除合作协议书
- 产业扶持政策协议书
- 2025年超声产前筛查试题及答案
- 2025安徽合肥市大数据资产运营有限公司招聘35人笔试历年参考题库附带答案详解
- 2024年4月全国自考《马克思主义基本原理概论》试题及答案
- 2025年民航招聘英语题库及答案
- 2025年二十届四中全会知识测试题库(含答案)
- 人格心理学-重难点笔记-陈会昌译版
- 建标 198-2022 城市污水处理工程项目建设标准
- 附件 《中级注册安全工程师注册证注销申请表》
- 支架现浇箱梁监理细则(超级全面)
- 抛物线焦点弦的性质(公开课)(20张)-完整版PPT课件
- 肾脏切除手术
评论
0/150
提交评论