河北工程大学基于单片机微电压传感器信号测量仪课程设计Word文档格式.docx
《河北工程大学基于单片机微电压传感器信号测量仪课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《河北工程大学基于单片机微电压传感器信号测量仪课程设计Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![河北工程大学基于单片机微电压传感器信号测量仪课程设计Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/24/3277f57e-43c4-49e1-a0a4-27a7e5c7e07d/3277f57e-43c4-49e1-a0a4-27a7e5c7e07d1.gif)
它采用超大规模技术将具有数据处理能力的微处理器(CPU)、存储器(含程序存储器ROM和数据存储器RAM)、输入、输出接口电路(I/O接口)集成在同一块芯片上,构成一个即小巧又很完善的计算机硬件系统,在单片机程序的控制下能准确、迅速、高效地完成程序设计者事先规定的任务。
所以说,一片单片机芯片就具有了组成计算机的全部功能,从某种意义上来说,一块单片机就是一台微型计算机。
51系列单片机的主要功能特点:
⑴一个8位微处理器CPU;
⑵片内振荡器,振荡频率范围为1.2~12MHZ;
⑶4KB/8KB的片内ROM(8031、8032、80C31无);
⑷128/256字节的片内RAM;
⑸片外ROM的寻址范围为64KB;
⑹片外RAM的寻址范围为64KB;
⑺21个特殊功能寄存器(SFR);
⑻四个8位并行I/O接口(P0~P3),32根I/O口线;
⑼1个全双工UART串行口,可多级通信;
⑾具有5/6个中断源,可编程为两个优先级;
⑿有位寻址功能,适于布尔处理的位处理机;
⒀111条指令;
⒁片内采用单总线结构;
⒂用单一+5V电源。
2.1.2液晶显示
1602液晶模块内部的控制器共有11条控制指令,如表1所示
表1控制命令表
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
2
光标返回
*
3
置输入模式
I/D
S
4
显示开/关控制
D
C
B
5
光标或者字符移位
S/C
R/L
6
置功能
DL
N
F
7
字符发生贮存地址
字符发生存贮器地址
8
数据存贮器地址
显示数据存贮器地址
9
读忙标志或地址
BF
计数器地址
10
写数到CGRAM
要写的数据内容
11
从CGRAM读数
独出的数据内容
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
1为高电平、0为低电平)
1)指令1:
清显示,指令码01H,光标复位到地址00H位置。
2)指令2:
光标复位,光标返回到地址00H。
3)指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
4)指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
5)指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
6)指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
7)指令7:
字符发生器RAM地址设置。
8)指令8:
DDRAM地址设置。
9)指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
10)指令10:
写数据。
11)指令11:
读数据。
2.1.3系统框图
根据项目要求,确定该系统的设计方案,图3-1为该方案的硬件电路设计框图。
由6个部分组成,即单片机、时钟电路、复位电路、LED显示电路、A/D转换器和测量电压输入电路。
图1系统结构框图
图1系统框图
2.2系统设计
2.2.1整体电路
本系统的整体电路如下图2所示
图2系统的的整体电路图
2.2.2程序流程图
2.2.3系统的代码实现
程序代码
/******************adc0832****************************
sbitCLK=P3^4;
//时钟接口
sbitDI=P3^3;
//数据输入接口
sbitDO=P3^3;
//数据输出接口
sbitCS=P3^5;
//片选使能接口
0x02就是单通道0;
0x03就是单通道1;
0x00就是双通道ch0="
+"
;
ch0="
-"
0x01就是双通道ch0="
*****************************************************/
#include<
reg52.h>
intrins.h>
string.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitCS=P3^5;
sbitCLK=P3^4;
sbitDI=P3^3;
sbitDO=P3^3;
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^4;
ucharResult_ADC0832=0;
//转换结果变量
ucharDisplay_Buffer[2][16]={
{"
CurrentVoltage:
"
},
CH=0.00V"
}
};
//函数声明
ucharGet_Value_ADC0832();
//获取指定通道的A/D转换结果
voidRefesh_Disp_Buffer();
//刷新显示缓冲
voidLCD_Busy_Check();
//忙检查
voidLCD_Write_Command(ucharcmd);
//向LCD写入命令
voidWrite_LCD_Data(uchardat);
//向LCD写入数据
voidInitialize_LCD1602();
//液晶初始化函数
voidLCD_Display(ucharstr[]);
//在LCD上显示字符串
voidDelayMS(uintX);
//延时程序
ucharRead_State();
//读取LCD的状态
//--------------------------------------------------------------
//主程序
//-----------------------------------------------------------------
voidmain()
{
ucharj;
Initialize_LCD1602();
//液晶初始化函数
while
(1)
{
for(j=0;
j<
2;
j++)
{
Get_Value_ADC0832();
//通道0.1,A/D转换
Refesh_Disp_Buffer();
//刷新显示缓冲
if(j==0)
{
LCD_Write_Command(0x80);
//写LCD命令,设置从第0行位置开始显示
LCD_Display(Display_Buffer[j]);
//在LCD上显示字符串
}
else
{
LCD_Write_Command(0xC0);
//写LCD命令,设置从第1行位置开始显示
}
}
}
//---------------------------------------------------------------
ucharGet_Value_ADC0832()
{
uchari,dat1=0,dat2=0;
//起始控制位
CS=0;
_nop_();
CLK=0;
DI=1;
CLK=1;
//第一个下降沿之前,设置DI=1/0;
//选择单端/差分(SGL/DIF)模式中的单端输入模式
//第二个下降沿之前,设置DI=0/1;
选择CH0/CH1
DI=0;
//第三个下降沿之前,设置DI=1;
DI=1;
_nop_();
//第4-11个脉冲期间读数据(MSB->
LSB)
for(i=0;
i<
8;
i++)
dat1=dat1<
<
1|DO;
//第12-19个脉冲期间读数据(LSB->
MSB)
dat2=dat2|((uchar)(DO)<
i);
CLK=1;
_nop_();
CS=1;
//CLK=1;
returnResult_ADC0832=(dat1==dat2)?
dat1:
0;
//--------------------------------------------------------------------------
//刷新显示缓冲
//-------------------------------------------------------------------------
voidRefesh_Disp_Buffer()
uintt=(Result_ADC0832*500.0/255.0-0.86)/9.6;
//
Display_Buffer[1][7]=t/100+'
0'
;
//整数位
Display_Buffer[1][9]=t/10%10+'
//两个小数位
Display_Buffer[1][10]=t%10+'
//---------------------------------------------------
voidDelayMS(uintX)
uchari;
while(X--)for(i=0;
120;
i++);
//----------------------------------------------------
//-------------------------------------------------
ucharRead_State()
ucharstate;
RS=0;
RW=1;
E=1;
DelayMS
(1);
state=P0;
E=0;
returnstate;
//--------------------------------
//忙等待
//----------------------------------
voidLCD_Busy_Check()
while(Read_State()&
0x80!
=0x80);
DelayMS
(1);
//--------------------------------------------------
//-----------------------------------------------
voidLCD_Write_Command(ucharcmd)
LCD_Busy_Check();
RW=0;
P0=cmd;
//向LCD写入数据
//--------------------------------------
voidWrite_LCD_Data(uchardat)
RS=1;
P0=dat;
//LCD初始化
//-----------------------------------------------------------
voidInitialize_LCD1602()
LCD_Write_Command(0x38);
DelayMS
(1);
//功能设置,数据长度为8位,双行显示,5×
7点阵字体
LCD_Write_Command(0x0C);
//显示开,关光标
LCD_Write_Command(0x06);
//字符进入模式:
屏幕不动,字符后移
LCD_Write_Command(0x01);
//清屏
//-----------在LCD上显示字符串-----------------*/
voidLCD_Display(uchar*str)
uchark;
for(k=0;
k<
strlen(str);
k++)
Write_LCD_Data(str[k]);
DelayMS
(2);
3、设计总结或结论
本次课程设计我们做的是计算机辅助语言教学系统,通过此次课程设计,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。
发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。
同时,设计让我感触很深。
在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。
果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。
4、参考文献
[1]周元一.电机与电气控制.机械工业出版社.2006.8
[2]曹克澄.单片机原理及应用.机械工业出版社.2005.
[3]靳达编著.单片机应用系统开发实例导航.北京:
人民邮电出版社,2003
[4]南建辉、熊鸣、王军茹.MCS-51单片机原理及应用实例.清华大学出版社,2004
[5]万福君.单片微机原理系统设计与开发应用.中国科学出版社,1995
[6]张友德、赵志英等.单片机原理应用与实验.上海复旦大学出版社,1992
课程设计
评语
成绩
指导教师
(签字)
年月日
注:
此表必须在同一页面。