项目编号:2015-2016学年第一学期微机原理(单片机)课程设计总结报告项目名称:数字电压表设计班级:姓名:学号:微机原理(单片机)课程设计任务书项目名称:数字电压表设计内容与要求:上位机:完成界面设计与通讯程序(1)能够显示采集的电压值,及16进制数值。当超出设定阈值时,电压值有提示字母。(2)能够设定电压阈值(3)绘制电压变化曲线,时间轴单位1秒,电压精度0.01V(4)可以对串口进行设置下位机:完成电路设计与控制程序(1)将A/D由电位器采集的10进制电压值及16进制数值,显示在LCD屏上面,电压值保留小数点后2位。(2)通过串口与上位机通讯,并传输电压值,接受阈值设置。(3)将阈值保存至外部存储器,重新复位上电后,阈值不变。(4)当超出电压阈值时,相应指示灯提示,将当前电压值显示在LCD上,当电压高于电压阈值时,数值后显示“-HIGH”,当电压值低于电压阈值时,数值后显示“-NORMAL”。项目组任务分担评价表课程设计报告评分表内容总体方案硬件设计软件设计结果分析明细清单问题分析心得体会参考文献程序代码格式规范总分时逸菲姓名分担任务组内评价时逸菲选题,设计方案。使用C#编写上位机程序,界面美化。4邱铎冠焊接电路,调试下位机程序,测试各模块功能。6得分邱铎冠得分微机原理(单片机)课程设计报告I目录Contents一、总体方案..........................................................................................................................................1二、硬件设计..........................................................................................................................................1三、软件设计..........................................................................................................................................3四、结果分析或项目所实现的功能、指标........................................................................................23五、明细清单........................................................................................................................................27六、设计调试中遇到的疑难问题及解决方法....................................................................................27七、心得体会与建议............................................................................................................................28八、参考文献........................................................................................................................................29I一、总体方案系统结构如图1-1所示。图1-1数字电压表总体功能模块示意图图中,A/D转换模块采用TLC1549芯片,LCD显示模块采用1602液晶屏。外部存储器为X5045(作EEPROM使用),上位机为微型计算机,控制器为基于STC89C52芯片的单片机开发板(含LED)。二、硬件设计TLC1549A/D转换芯片原理如图所示:A/D转换模块LCD显示模块控制器上位机外部存储器模块IX5045原理如图所示:相关硬件设计电路设计只需参照相应手册上典型应用电路图即可。根据开发板的原理图,确定可用的I/O口,并合理分配给1602,X5045,TLC1549三个外设。具体管脚分配可参见下位机程序或最终原理图。最终原理图如下:I最终方案如图所示,该原理图只包含本项目所需外设的链接信息,省略了开发板上已有内容。其中P0口应接上拉电阻,如图所示。P22口连接LED用于指示电压与阈值的关系。LCD1602的硬件电路无需自己设计,直接采用开发板上的20孔排针插座即可,X5045和TLC1549硬件连接则根据相关手册和开发板自身原理图确定。三、软件设计下位机程序设计:波特率设置:9600一位起始位,8位数据位,1位停止位,无校验位。串口通信方式1下,波特率由计数器1的计数频率和PCON的SMOD位决定,校验,计数器工作在方式2下,为8位自动重装初值计数器。其中计数器计数频率为12/OSCff,MHzfOSC0592.11八位自动重装计数器向上溢出I频率为)256/(InitNffCLK经计算,为了让计数器1产生9600波特率,TH,TL应赋初值0xFD。串口通信宏定义和相关初始化代码如下:voidInitUART(void){SCON=0x50;//SCON:模式1,8-bitUART,使能接收TMOD|=0x20;//TMOD:timer1,mode2,8-bit重装TH1=0xFD;//TH1:重装值9600波特率晶振11.0592MHzTR1=1;//TR1:timer1开始计数EA=1;//打开总中断ES=1;//打开串口中断}控制1602液晶屏:1602液晶屏输入信号包括8位数据,读写信号,选通信号,指令/数据选择信号等。根据手册所给的写数据,写指令的时序图,编写基本操作函数如下:#defineuintunsignedintsbitlcden=P1^2;//定义液晶使能端sbitlcdrs=P1^0;//定义液晶RS端sbitrw=P1^1;//定义液晶RW端voiddelay(uintz){uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}/*************/voidwrite_com(ucharcom)//液晶写命令函数I{lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}voidwrite_data(uchardat)//液晶写数据函数{lcdrs=1;P0=dat;delay(5);lcden=1;delay(5);lcden=0;}I1602写操作时序图液晶屏使用前应对其进行初始化,初始化设置为不显示光标,光标不闪烁,地址自增,写操作屏显不产生位移,最后进行一次清屏操作,代码如下:voidinit(){rw=0;lcden=0;write_com(0x38);//初始化1602液晶write_com(0x0c);write_com(0x06);write_com(0x01);//清屏write_com(0x80);//设置显示初始坐标,第一行,第一列delay(1000);}I1602相关指令说明X5045程序设计:本项目中X5045作为EEPROM使用,用于保存电压阈值,实现掉电后不丢失阈值设置的功能。根据手册上所给的时序图,编写基本操作函数如下:#defineWREN0x06//写使能锁存器允许#defineWRDI0x04//写使能锁存器禁止#defineWRSR0x01//写状态寄存器#defineREAD0x03//读出#defineWRITE0x02//写入/*****************************************************函数功能:从X5045的当前地址读出数据出口参数:x***************************************************/unsignedcharReadCurrent(void){Iunsignedchari;unsignedcharx=0x00;//储存从X5045中读出的数据SCK=1;//将SCK置于已知的高电平状态for(i=0;i8;i++){SCK=1;//拉高SCKSCK=0;//在SCK的下降沿输出数据x=1;//将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据x|=(unsignedchar)SO;//将SO上的数据通过按位或运算存入x}return(x);//将读取的数据返回}/*****************************************************函数功能:写数据到X5045的当前地址入口参数:dat***************************************************/voidWriteCurrent(unsignedchardat){unsignedchari;SCK=0;//将SCK置于已知的低电平状态for(i=0;i8;i++)//循环移入8个位{SI=(bit)(dat&0x80);//通过按位与运算将最高位数据送到S//因为传送时高位在前,低位在后SCK=0;SCK=1;//在SCK上升沿写入数据dat=1;//将y中的各二进位向左移一位,因为首先写入的是字节的最高位}I}/*****************************************************函数功能:写状态寄存器,可以设置看门狗的溢出时间及数据保护入口参数:rs;//储存寄存器状态值***************************************************/voidWriteSR(unsignedcharrs){CS=0;//拉低CS,选中X5045WriteCurrent(WREN);//写使能锁存器允许CS=1;//拉高CSCS=0;//重新拉低CS,否则下面的写寄存器状态指令将被丢弃WriteCurrent(WRSR);//写状态寄存器WriteCurrent(rs);//写入新设定的寄存器状态值CS=1;//拉高CS}/*****************************************************函数功能:写数据到X5045的指定地址入口参数:addr***************************************************/voidWriteSet(unsignedchardat,unsignedcharaddr){SCK=0;//将SCK置于已知状态CS=0;//拉低CS,选中X5045WriteCurrent(WREN);//写使能锁存器允许CS=1;//拉高CSCS=0;//重新拉低CS,否则下面的写入指令将被丢弃WriteCurrent(WRITE);//写入指令WriteCurrent(addr);//写入指定地址IWriteCurrent(dat);//写入数据CS=1;//拉高CSSCK=0;//将SCK置于已知状态}/*****************************************************函数功能:从X5045的指定地址读出数据入口参数:addr出口参数:dat***************************************************/unsignedcharReadSet(unsignedchara