#单片机课程设计数字电压表文档格式.docx
- 文档编号:20500792
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:24
- 大小:872.81KB
#单片机课程设计数字电压表文档格式.docx
《#单片机课程设计数字电压表文档格式.docx》由会员分享,可在线阅读,更多相关《#单片机课程设计数字电压表文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
7
4设计结论、测试结果、误差分析、教学建议………………………………………14
4.1设计课题的设计结论及使用说明……………………………………………14
4.2设计课题的测试结果…………………………………………………………14
4.3设计课题的误差分析…………………………………………………………16
4.4设计体会………………………………………………………………………16
4.5教学建议………………………………………………………………………16
参考文献………………………………………………………………………………17
附录………………………………………………………………………………18
1设计课题任务、功能要求说明及方案介绍
1.1设计课题任务
设计一个能够测量直流电压的数字电压表。
测量电压范围0~5V,测量精度小数点后两位。
该电压表上电或按键复位后能自动显示系统提示符作者信息,进入测量准备状态,按测量开始键则开始测量,并将测量值显示在液晶显示器上。
按退出键完成电压表的测量。
1.2功能要求说明
调动滑动变阻器,显示电压数值随之改变。
1.3设计课题总体方案介绍及工作原理说明
本电压表主要由单片机、4*4行列式键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1.1所示:
AT89C51
图1.1总体设计方案图
本电压表的所有的软件、参数均存放在AT89S52的FlashROM和内部RAM中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。
行列式键盘采用动态扫描方式。
利用单片机定时器及计数器产生定时效果通过编程形成数字电压表效果,再利用液晶显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
2设计课题硬件系统的设计
2.1设计课题硬件系统各模块功能简要介绍
本设计的硬件系统主要采用以下基本模块来实现,单片机最小系统模块,输入模块、输出模块、显示模块、电源模块。
(1)复位电路:
复位是由外部的复位电路来实现的。
片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。
复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路,如图所示。
当时钟频率选用6MHz时,C取22μF,Rs约为200Ω,Rk约为1K。
(2)键盘电路:
当非编码键盘的按键较少时,采用独立式键盘比较方便,但液晶板则适合行列式键盘,占用口线少,使用也相对方便,所以本设计采用行列式键盘。
行列式键盘的工作方式是先用列线发送扫描字,然后读取行线的状态,查看是否有按键按下。
键盘部分提供一种扫描的工作方式,可以和具有64个按键的矩阵键盘相连接,能对键盘不断扫描、自动消抖、自动识别按下的键,并给出编码,能对双键或n个键同时按下的情况实行保护。
键盘电路原理图如图2.4所示
(3)显示电路:
显示器普遍地用于直观地显示数字系统的运行状态和工作数据,按照材料及生产工艺,单片机应用系统中常用的显示器有:
发光二极管LED显示器、液晶LCD显示器、CRT显示器等。
LCD显示器是现在最常用的显示器之一。
本设计用的是HS12864液晶显示器,通过单片机输出的数据在液晶屏上显示。
(4)电源电路:
现在市面上销售的编程器有很多都是由PC机的USB口直接供电,为了降低本设计的成本及节省设计时间,没有另外设计编程器。
(5)TLC549电路:
TLC549带有片内系统时钟,该时钟与I/OCLOCK是独立工作的,无需特殊的速度或相位匹配。
当CS为高时,数据输DATAOUT端处于高阻状态,此时I/OCLOCK不起作用。
这种CS控制作用允许在同时使用多片TLc549时,共用I/OcLOCK,以减少多路(片)A/D使用时的I/O控制端口。
一组通常的控制时序操作如下:
(1)将Cs置低,内部电路在测得CS下降沿后,在等待两个内部时钟上升沿和一个下降沿后,再确认这一变化,最后自动将前一次转换结果的最高位(D7)位输出到DATAOUT端;
(2)在前四个I/OCLOCK周期的下降沿依次移出第2、3、4和第5个位(D6,D5,D4,D3),片上采样保持电路在第4个I/OCLOCK下降沿开始采样模拟辅人:
(3)接下来的3个I/OCLOCK周期的下降沿可移出第6、7、8(D2,D1,D0)各转换位
(4)最后,片上采样保持电路在第8个I/OCLOCK周期的下降沿将移出第6、7、8(D2,D1,D0)各转换位。
然后使保持功能持续4个内部时钟周期,接着开始进行32个内部时钟周期的A/D转换。
在第8个I/OcLCOK后,CS必须为高或I/OLOCK保持低电平,这种状态需要维持36个内部系统时钟周期以等待保持和转换工作的完成。
如果CS为低时,I/OCLOCK上出现一个有效干扰脉冲,则微处理器,控制器将与器件的I/O时序失去同步;
而在cs为高时若出现一次有效低电平,则将使引脚重新初始化,从而脱离原转换过程。
在36个内部系统时钟周期结束之前,实施步骤
(1)~(4),可重新启动一次新的A/D转换,与此同时,正在进行的转换将终止。
但应注意,此时的输出是前一次的转换结果而不是正在进行的转换结果。
若要在特定的时刻采样模拟信号,则应使第8个I/OCLOCK时钟的下降沿与该时刻对应。
因为芯片虽在第4个I/OCLOCK时钟的下降沿开始采样,却在第8个I/OCLOCK的下降沿才开始保存。
TLC549的电路原理如图2.4所示。
2.2设计课题电路原理图、PCB图、元器件布局图
图2.1电路原理图
图2.2PCB图
2.3设计课题元器件清单
图2.3元器件清单
3设计课题软件系统的设计
3.1设计课题使用单片机资源的情况
设计课题使用单片机资源的情况如下:
在本次设计中用到了P0和P3、P1口。
P0口接液晶显示器的D0-D7,进行数据的读写功能;
P3口接的是“|E,RS,R/W”对液晶进行读写控制命令,P1口接行列式键盘,通过行列式键盘按键的控制来完成电压表的制作
3.2设计课题软件系统个模块功能简要介绍
本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、键盘输入程序模块、液晶显示程序模块。
主程序:
主要是用于对模拟输入信号的处理、输出信号的控制和对各个功能程序模块的运用及其控制,通过调用子程序来完成模数转换的功能。
中断服务程序:
主要是用于电压表的准确运行、数据输入过程中的等待处理。
行列式键盘输入程序模块:
主要是用于确定按键并得到特定的键码值。
液晶及其驱动模块:
主要用于显示单片机处理后的数字电压值。
延时模块:
程序中有两种延时子程序,一种是短延时用于判键按下等,一种是长延时;
按键去抖和等待模拟信号的输入采样。
3.3设计课题软件系统程序流程框图
系统软件采用汇编语言按模块化方式进行设计,然后通过Keil软件开发平台将程
序转变成十六进制程序语言。
主程序流程框图如3.1所示;
键盘扫描子程序框图如3.2所示;
电压转换流程图如3.3所示;
液晶显示程序流程图如图3.4所示;
N
图3.1主程序流程框图
图3.2键盘扫描子程序
图3.3电压转换流程图
图3.4液晶显示程序图
3.4设计课题软件系统程序清单
/********************
名称:
电压表
作者:
吴强
时间:
2012.1.1
功能:
s10是确认键,s11是分层退出键,s16是总退出键。
//进入菜单界面,按数字键3跟确认键之后进入电压表,再按数字键2确认之后开始测量电压,并显示在液晶屏上**********************/
#include<
absacc.h>
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineTa500
ucharkeyscan();
uchartime,flag;
ucharv,n=0;
intNum_Index;
bitrs=P3^1;
sbitrw=P3^6;
sbiten=P3^7;
sbitCS=P3^4;
//片选信号
sbitIOCLK=P3^3;
//时钟信号
sbitDATAOUT=P3^2;
//数据口
ucharcodeyejingtable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x2e,0x76};
//0--9
ucharfind_code[3];
/******************延时函数*********************/
voiddelay(uintm)
{
while(--m);
}
/***************************************************/
uchartlc549()
uchari,T1=0;
CS=1;
IOCLK=0;
CS=0;
//使能549
_nop_();
for(i=0;
i<
8;
i++)
IOCLK=1;
//准备好数据
delay(10);
T1=T1<
<
1;
//左移1位
if(DATAOUT==1)
T1=T1+1;
//保存本次移出的位
//打出下一位数据
CS=1;
//释放对TLC945的控制
returnT1;
delay(20);
}
/******************键扫描函数*********************/
ucharkeyscan(void)
ucharscan,tmp;
//列号,行号
P1=0xf0;
//发全行0扫描码
if((P1&
0xf0)!
=0xf0)//若有键按下
delay(1000);
//延时去抖
=0xf0)//延时再判键是否还按下
scan=0xfe;
while((scan&
0x10)!
=0)//逐行扫描
P1=scan;
//输出行扫描码
=0xf0)//本行有键按下
{
tmp=(P1&
0xf0)|0x0f;
delay(50000);
//按键判释放
return((~scan)|(~tmp));
}//还回键值
elsescan=(scan<
1)|0x01;
//行扫描码左移一位
}
return(0);
//无键按下,还回0
}
/*****************延时2s************************/
voiddelay2s()
TMOD=0X01;
TH0=0x3C;
TL0=0xB0;
EA=1;
ET0=1;
TR0=1;
do{}while(time<
40);
time=0;
TR0=0;
}
voidtimer_()interrupt1
time++;
TL0=0XB0;
}
//===========液晶写命令函数
voidwritecommand(ucharcommand)
delay(100);
rs=0;
rw=0;
en=1;
P0=command;
//液晶数据线P0
en=0;
//============液晶写数据函数
voidwritedata(uchardate)
rs=1;
P0=date;
//==============液晶设置函数
voidlcdset(void)
writecommand(0x30);
//基本指令集
writecommand(0x01);
//清屏,DDRAM的地址归零
writecommand(0x02);
//地址归位
writecommand(0x0c);
//显示开,光标关,反白关
writecommand(0x06);
//DDRAM地址加1
//===========液晶显示函数
voiddisplay(uchary,ucharx,uchar*p)
switch(y)
case1:
writecommand(0x7f+x);
break;
//液晶第一行
case2:
writecommand(0x8f+x);
//0x90+(x-1)
case3:
writecommand(0x87+x);
break;
case4:
writecommand(0x97+x);
default:
while(*p)
writedata(*p++);
/*************************确认函数*****************/
voidsure()
uchari=2,j=2;
do{
v=keyscan();
if(v!
=0x44&
&
v!
=0)
{lcdset();
n=v;
display(i++,j++,"
确认?
"
);
if(i==5)
{i=1;
j=1;
}
}while(v!
=0x84&
=0x88);
voiddisplay1(void)
writecommand(0x92);
writedata(yejingtable[find_code[0]]);
writedata(yejingtable[11]);
writedata(yejingtable[find_code[1]]);
writedata(yejingtable[find_code[2]]);
writedata(yejingtable[12]);
voidmain()
lcdset();
delay(1000);
display(2,1,"
电气与信息工程院"
display(3,2,"
电气本4班"
display(4,2,"
吴强"
writedata(0x03);
delay2s();
while
(1)
display(1,3,"
电压表"
sure();
flag=1;
switch(n)
{
case0x41:
while(flag==1)
{
longinti,temp;
i=tlc549();
temp=(i*5)*39.1;
从TLC549里读取数据
find_code[0]=temp/10000;
百位
find_code[1]=(temp/1000)%10;
十位
find_code[2]=(temp/100)%10;
个位
display(1,3,"
测量电压"
for(i=0;
100;
{display1();
}
n=keyscan();
if(n==0x88)
flag=0;
}writecommand(0x01);
}
}
4设计结论、仿真结果、误差分析、教学建议
4.1设计课题的设计结论及使用说明
液晶板子是在暑假做的,那是第一次做,所以花了一周的时间来完成PCB板的制作,在电路板上安装元件,并焊接。
经过将近三天的电路焊接,系统电路焊接基本完成,本设计用液晶做为显示器,它显示电压值;
行列式键盘为按键,其中S3为启动键(显示电压表字形),S10为确认键,S1为进入测试键,进入测试,调滑动变阻器显示不同值电压。
该设计主要是利用TLC549的模数转换功能来实现在液晶屏上显示相应的电压值,测量的结果是很准确的,基准误差很小,这样的结果与设计要求完全相符,本设计成功。
完成了设计任务。
4.2设计课题的结果
在液晶板上运行程序,结果如图4.1与4.2所示。
实现功能:
电压表工作状态:
(1)、显示设计者的相关信息;
(2)、运行状态的显示;
图4.1初始状态
图4.2运行状态
4.3设计课题的误差分析
,该电压表在运行中存在一定的误差,误差产生有三种可能,首先是采用的测压方案是软件测的,测的优势是利用定时器中断来实现的。
然后电路板做工不够精细,各元件自身老化电阻过大,所以就产生了一定的误差,当然这个误差是避免不了的,误差分析表格如图4.3所示。
4.4设计体会
为期二周的课程设计终于结束了,这次课程设计给了我很多启发,同时也培养了我对陌生问题的分析和解决的能力,在这里非常感谢吴老师,是他强调课程设计不是做实验,而是培养分析问题和解决问题的能力。
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,只有我们去试着做了,才能真正的掌握,学习的理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
4.5教学建议
首先,在此真的很感谢吴老师,老师兢兢业业,尽职尽责,真的很让我钦佩,我们都很喜欢听老师讲的课,不管是理论课还是实验课,我们都学到了很多知识,在我们遇到困难的时候老师都详细的给我们讲解,直到我们完全懂了,老师辛苦了。
听说老师还要叫我们微机原理,真的很高兴吴老师能继续带领我们一起学习;
和老师一起学习我们很快乐,希望吴老师以后把课后习题讲解得更加详细.透测,那样我们就更加容易吸收和学以致用。
参考文献
[1]代启化.基于Proteus的电路设计与仿真[J].现代电子技术.2006,第19期.
[2]刘文秀.单片机应用系统仿真的研究[J].现代电子技术.2005,第286期.
[3]曹巧媛.单片机原理及应用[M],北京:
电子工业出版社,1997.7.
[4]张洪润.兰清华,单片机应用技术教程[M],北京:
清华大学出版社,1997.11.
[5]李广第.单片机基础[M],北京航空航天大学出版社,2006.7.
[6]DaiQiHua.Proteus-basedcircuitdesignandsimulation[J].Modernelectronic
technology.2006,No.19
[7]LiuWenXiu.MicrocontrollerApplicationSystemSimulation[J].Modernelectronic
technology.2005,No.286
[8]CaoQiaoYuan.MicrocontrollerTheoryandApplications[M],Beijing:
Electronic
IndustryPress,1997.7.
[9]ZhangHongrun,LanQinghua,MCUapplicationtechnologytutorial[M],Beijing:
TsinghuaUniversityPress,1997.11.
[1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 数字 电压表