哈理工科研训练10.docx
- 文档编号:4400990
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:22
- 大小:463.63KB
哈理工科研训练10.docx
《哈理工科研训练10.docx》由会员分享,可在线阅读,更多相关《哈理工科研训练10.docx(22页珍藏版)》请在冰豆网上搜索。
哈理工科研训练10
哈尔滨理工大学
科研训练报告
设计题目:
基于单片机的数据采集系统
学院:
自动化学院
专业:
电子信息科学与技术
班级:
电技12-3班
姓名(学号):
李成龙(1212020309)
同组学生:
王开元(1212020320)
指导教师:
徐军马静
成绩:
2015年12月26日
目录
摘要
目录I
第1章绪论2
1.1项目的应用背景2
1.2项目研究的目的和意义2
第2章数据采集系统设计思路3
2.1总体方案设计3
2.1.1原理分析3
2.1.2方案设计3
第3章硬件原理图和PCB的绘制4
3.1系统硬件设计4
3.1.1控制器设计4
第4章程序的编写与调试6
4.1C语言程序的编写6
4.1.1显示程序和时钟程序6
总结14
参考文献15
附录A(实物图片)16
附录B(元器件清单)18
第1章绪论
1.1项目的应用背景
数据采集,又称数据获取,是利用一种装置,从系统外部采集数据并输入到系统内部的一个接口。
数据采集技术广泛应用在各个领域。
近年来,数据采集及其应用受到了人们越来越广泛的关注,数据采集系统也有了迅速的发展,它可以广泛的应用于各种领域。
数据采集技术是信息科学的重要分支之一,它研究信息数据的采集、存储、处理以及控制等问题。
它是对传感器信号的测量与处理, 以微型计算机等高技术为基础而形成的一门综合应用技术。
数据采集也是从一个或多个信号获取对象信息的过程。
随着微型计算机技术的飞速发展和普及,数据采集监测已成为日益重要的检测技术,广泛应用于工农业等需要同时监控温度、湿度和压力等场合。
数据采集是工业控制等系统中的重要环节,通常采用一些功能相对独立的单片机系统来实现,作为测控系统不可缺少的部分,数据采集的性能特点直接影响到整个系统。
1.2项目研究的目的和意义
20世纪90年代至今,在国际上技术先进的国家,数据采集系统已成功的用到军事、航空电子设备及宇航技术、工业等领域。
由于集成电路制造技术的不断提高,出现了高性能、高可靠的单片机数据采集系统(DAS)。
数据采集技术已经成为一种专门的技术,在工业领域得到了广泛的应用。
该阶段的数据采集系统采用模块式结构,根据不同的应用要求,通过简单的增加和更改模块,并结合系统编程,就可扩展或修改系统,迅速组成一个新的系统。
数据采集系统的应用领域十分广泛。
随着科学技术的发展,对有用的信号进行数据采集,分析,计算,提取等有较好的应用。
一般数据采集系统主要应用于:
1.生物医学信号处。
2.多媒体技术与人机交互。
3.导航与现代通信技术。
4.遥感,遥测的应用.5.人工智能与模式识别,计算机技术与可视化。
6.雷达,声纳信号处理。
7.微弱信号处理技术。
随着数据采集系统被广泛应用,在特定的行业中要获得较精确的数据,都需要对该系统进行特殊的要求:
如工业现场环境恶劣,很多设备都是对数据采集产生很大的干扰源,而且一般的采集器都有多路的信号输入,他们的地线相连会导致干扰通过地线进入正在采集的信号,使得数据采集不准确,因此数据采集的抗干扰设计十分重要。
所以,在数据采集系统的发展过程中,为满足特定的要求,数据采集系统的发展前景主要有:
1.系统抗干扰性。
保证获得的数据更准确。
2.实时通信。
保证数据处理单元能较快的得到需要处理的数据,提高主机的运行效率。
3.高速数据采集。
一般数字信号的获取需要通过对模拟信号进行采集,这就需要高速,高性能的A/D转换器。
4.低功耗性。
适合于电池供电和空间受限的工作环境以及便携式场合。
第2章数据采集系统设计思路
2.1总体方案设计
数据采集系统主要由硬件和软件两部分组成,依据这个设计的要求,设计了如下的方案:
硬件部分主要是用来实现对8路数据的采集和显示功能,包括AT89C52单片机、RS-485、时钟芯片8563、LCD12864等芯片;软件部分主要是通过C语言来编写单片机对数据的采集及传送LCD液晶显示屏显示的相关操作程序。
2.1.1原理分析
数据采集系统一般由数据输入系统,数据存储与管理,数据处理,数据输出及显示这四个部分组成。
输入通道要实现对被测对象的检测,采样和信号转换工作。
数据存储与管理要用存储器把采集到的数据存储起来,建立相应的数据库,并进行管理和调用。
数据处理就是从采集到的原始数据中,删除有关干扰噪声,无关信息和必要的信息,提取出反映被测对象特征的重要信息。
另外,就是对数据进行统计分析,以便于检索;或者把数据恢复成原来的物理量形式,以可输出的形态在输出设备上输出,例如打印,显示,绘图等。
数据输出及显示就是把数据以适当的形式进行输出和显示。
本系统的硬件的组成部分分为数据采集模块、处理与控制模块、键盘模块、显示模块四部分,采用AT89C52作为本设计的核心,对各个模块的信号进行处理分析。
数据采集系统通过对多路数据进行采集,并通过AT89C52单片机进行处理和分析,最后将数据显示在LCD显示器上。
本设计正是通过这个方案对数据进行采集、处理、显示,以达到数据采集的目的。
对于软件这个部分,关键是怎样通过软件来实现数据采集系统的各种功能。
因此,从软件的角度来讲,需要找到一种算法,以便于能利用该算法实现对所有数据流的采集、处理与传输,从而能使该系统能兼容所有的数据采集流。
2.1.2
电源模块
方案设计
数据量的采集
通信模块
AT89C52单片机
LCD显示
第3章硬件原理图和PCB的绘制
3.1系统硬件设计
主控制器是本系统的核心部分,它负责数据的采集及处理。
在本系统中主控制器我选择了单片机,单片机控制功能强,性价比优异,体积小巧,适用于本数据采集系统。
3.1.1控制器设计
原理图(图一)和PCB设计(图二):
图一
图二
第4章程序的编写与调试
4.1C语言程序的编写
主要编写了显示程序和时钟程序,分别实现了显示字符和时钟的功能。
4.1.1显示程序和时钟程序
12864标准字库液晶演示数据p0,控制p2
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
#defineSTART_8563sda=1;\
scl=1;\
delayNOP();\
sda=0;\
delayNOP();
#defineSTOP_8563sda=0;\
scl=1;\
delayNOP();\
sda=1;\
delayNOP();
#defineWRITE_8563_BYTE(BYTE)write_byte(BYTE);\
respons();
#defineINIT_8563write_add(0x00,0x08);\
write_add(0x01,0x01);\
write_add(0x0d,0x83);\
write_add(0x0e,0x82);\
write_add(0x0f,0x01);\
write_add(0x02,0x00);\
write_add(0x03,0x17);\
write_add(0x04,0x15);
/*************12864LCD引脚定义*************/
#defineLCD_dataP0//数据口
uchardate=0x00;
sbitLCD_RS=P2^3;//寄存器选择输入
sbitLCD_RW=P2^4;//液晶读/写控制
sbitLCD_EN=P2^5;//液晶使能控制
sbitLCD_PSB=P2^6;//串/并方式控制
sbitLCD_RST=P2^7;//液晶复位端口
/*********************************************************/
/*****************************************************/
sbitscl=P2^2;
sbitsda=P2^1;
ucharnum[10]={
0x30,
0x31,
0x32,
0x33,
0x34,
0x35,
0x36,
0x37,
0x38,
0x39
};
ucharcodeDIS1[]={"李成龙1212020309"};
ucharcodeDIS2[]={"王开元1212020320"};
ucharcodeDIS3[]={""};
ucharcodeDIS4[]={""};
ucharcodeDIS5[]={"2015-12-24星期四"};/***********************************************************************/
/*************************pcf8563程序***********************************/
voidrespons()
{
uchari=0;
scl=1;
while((sda==1)&&(i<250))i++;
scl=0;
}
voidwrite_byte(ucharucbyte)
{
uchari;
scl=0;
for(i=0;i<8;i++)
{
sda=(bit)(ucbyte&0x80);//先写入高位
scl=1;
delayNOP();
scl=0;
ucbyte<<=1;
}
sda=1;//释放数据线
}
ucharread_byte(void)
{
uchari,ucbyte;
scl=0;
for(i=0;i<8;i++)
{
ucbyte<<=1;
if(sda)
ucbyte++;
scl=1;
delayNOP();
scl=0;
}
returnucbyte;
}
voidwrite_add(ucharaddress,uchardate)//指定地址写一个字节
{
START_8563
WRITE_8563_BYTE(0xa2)//器件地址
WRITE_8563_BYTE(address)
WRITE_8563_BYTE(date)
STOP_8563
}
ucharread_add(ucharaddress)
{
uchardate;
START_8563
WRITE_8563_BYTE(0xa2)
WRITE_8563_BYTE(address)
START_8563
WRITE_8563_BYTE(0xa3)
date=read_byte();
STOP_8563
returndate;
}
unsignedcharReverseChar(unsignedcharold_char)
{
unsignedcharnew_char=0;
unsignedchari;
for(i=0;i<8;i++)
{
new_char=new_char<<1;
if(old_char%2==1)
new_char=new_char+1;
else;
old_char=old_char>>1;
}
returnnew_char;
}
/*******************************************************************/
/**/
/*延时函数*/
/**/
/*******************************************************************/
voiddelay(intms)
{
while(ms--)
{
uchari;
for(i=0;i<150;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/**/
/*延时函数*/
/**/
/*******************************************************************/
voiddelay1(intms)
{
while(ms--)
{
uchary;
for(y=0;y<100;y++);
}
}
/*******************************************************************/
/**/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/
/**/
/*******************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&ReverseChar(0x80));
LCD_EN=0;
return(result);
}
/*******************************************************************/
/**/
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/
/**/
/*******************************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=ReverseChar(cmd);
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*******************************************************************/
/**/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/
/**/
/*******************************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=ReverseChar(dat);
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*******************************************************************/
/**/
/*LCD初始化设定*/
/**/
/*******************************************************************/
voidlcd_init()
{
LCD_PSB=1;//并口方式
LCD_RST=0;//液晶复位
delay(3);
LCD_RST=1;
delay(3);
lcd_wcmd(0x34);//扩充指令操作
delay(5);
lcd_wcmd(0x30);//基本指令操作
delay(5);
lcd_wcmd(0x0C);//显示开,关光标
delay(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay(5);
}
/*********************************************************/
/**/
/*设定显示位置*/
/**/
/*********************************************************/
voidlcd_pos(ucharX,ucharY)
{
ucharpos;
if(X==1)
{X=0x80;}
elseif(X==2)
{X=0x90;}
elseif(X==3)
{X=0x88;}
elseif(X==4)
{X=0x98;}
pos=X+Y;
lcd_wcmd(pos);//显示地址
}
/*********************************************************
*清屏函数*
*********************************************************/
voidclr_screen()
{
lcd_wcmd(0x34);//扩充指令操作
delay(5);
lcd_wcmd(0x30);//基本指令操作
delay(5);
lcd_wcmd(0x01);//清屏
delay(5);
}
int
bcd_to_dec(ucharbcd,intmask){
inthigh=0;
intlow=0;
intt=0;
intj=0;
inti=0;
bcd=bcd&mask;
for(i=0;i<4;i++){
t=bcd%2;
for(j=0;j
t*=2;
bcd=bcd>>1;
low+=t;
}
for(i=0;i<4;i++){
t=bcd%2;
for(j=0;j
t*=2;
bcd=bcd>>1;
high+=t;
}
returnhigh*10+low;
}
/********************************************************
*主函数*
*********************************************************/
void
main()
{
uchari,sec,min,hou;
ucharres[8];
delay(100);//上电,等待稳定
lcd_init();//初始化LCD
INIT_8563
lcd_pos(1,0);//设置显示位置为第一行
for(i=0;i<16;i++)
{
lcd_wdat(DIS1[i]);
delay(100);
}
lcd_pos(2,0);//设置显示位置为第二行
for(i=0;i<16;i++)
{
lcd_wdat(DIS2[i]);
delay(100);
}
lcd_pos(3,0);//设置显示位置为第三行
for(i=0;i<16;i++)
{
lcd_wdat(DIS3[i]);
delay(100);
}
lcd_pos(4,0);//设置显示位置为第四行
for(i=0;i<16;i++)
{
lcd_wdat(DIS4[i]);
delay(100);
}
delay(100);
clr_screen();
while
(1){
sec=bcd_to_dec(read_add(0x02),0x7f);
min=bcd_to_dec(read_add(0x03),0x7f);
hou=bcd_to_dec(read_add(0x04),0x3f);
res[0]=num[hou/10];
res[1]=num[hou%10];
res[2]=':
';
res[3]=num[min/10];
res[4]=num[min%10];
res[5]=':
';
res[6]=num[sec/10];
res[7]=num[sec%10];
lcd_pos(1,0);
for(i=0;i<8;i++)
lcd_wdat(res[i]);
delay(100);
lcd_pos(3,0);
for(i=0;i<16;i++)
{
lcd_wdat(DIS5[i]);
//delay(100);
}
}
}
总结
通过对单片机这门课的学习,使我对单片机系统有了更深入的了解,明白了单片机的重要性和强大的应用性。
通过学习,我对单片机系统整体框架有了更清晰的认识。
其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。
通过本次课程设计,我进一步巩固了课本的理论知识,增强了动手能力,同时也增强了我通过检索资料来获取相关专业信息以及利用检索到的信息来解决面临问题的能力。
本次设计使我深刻认识到自己软件编程方面的知识薄弱,同时也使我体会到软件编程在实际硬件电路连接中的重要作用,软件编程的使用是硬件开销大大减少,同时也使设计更加的简洁易于控制。
在今后的学习我要加强软件编程方面知识的积累和运用。
次外,通过本次设计,我对单片机仿真软件Keil4也有了一定的认识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 理工 科研 训练 10