单片机实习报告
发布时间:2020-11-06 来源: 调研报告 点击:
实
习
报
告
实习名称 :
嵌入式系统 实习
系部名称 :
信科院
专业班级:
:
计本 08 -5
学生姓名:
:
陈鹏任
学
号:
:
3080417907
指导教师:
:
陈小琴 金红 杨光杰
日 日
期:
2010.12.18
一. 引言
目前,嵌入式技术已成为通信和消费类产品的共同发展方向。嵌入式系统几乎包括了生活中的所有电器设备,如掌上PDA、移动计算设备、电视机顶盒、手机上网、数字电视、多媒体、汽车、微波炉、数字相机、家庭自动化系统、电梯、空调、安全系统、自动售货机、蜂窝式电话、消费电子设备、工业自动化仪表与医疗仪器等。
嵌入式系统是先进的计算机技术、半导体技术、电子技术和各个行业的具体应用相结合的产物,这就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。嵌入式系统一般指非PC系统。它是以应用为中心、软硬件可裁减的、能适应应用系统对功能、可靠性、成本、体积、功耗等综合性要求的专用计算机系统。简单地说,嵌入式系统是集系统的应用软件与硬件于一体,类似于PC中BIOS的工作方式,具有软件代码小、高度自动化、响应速度快等特点,因此特别适合于要求实时和多任务的系统。嵌入式系统主要由嵌入式处理器、相关支撑硬件、嵌入式操作系统及应用软件系统等组成。
通过这次实训,老师让我们了解最基本的嵌入式系统设计,开发的流程,结合掌握所学的知识,做出一个单片机与上位机通信的简单嵌入式系统。
二.课题设计 1 .基本原理
MCS-51 单片机串行口发送/接收数据时,通过 2 个串行缓冲器 SBUF 进行,这 2 个缓冲器采用一个地址(98H),但在物理上是独立的。其中接收缓冲器只能读出不能写入,发送缓冲器只能写入不能读出。
① 发送过程,由指令 MOV SBUF,A 启动,此时待传送的数据由 A 累加器传入串行发送缓冲器 SBUF,由硬件自动在发送字符的始、末加上起始位(低电平)、停止位(高电子)及其它控制位(如奇偶位等),而后在移位脉冲的控制下,低位在前,高位在后,逐位从 TXD 端(方式 0 除外)发出。
② 接收过程,串行口的接收与否受制于允许接收位 REN 的状态,当 REN 被软件置“1”后,允许接收器接收。串口的接收器以所选波特率的 16 倍速对 RXD线进行监视。当“1”到“0”跳变时,检测器连续采样到 RXD 线上低电平时。便认定 RXD 端出现起始位,继而接收控制器开始工作。在每位传送时间的第 7、8、9 三个脉冲状态采样 RXD 线,决定所接收的值为“0”或“1”。当接收完停止位后,控制电路使中断标志 R1 置为“1”,此时程序可通过 MOV
A,SBUF指令将接收到的字符从 SBUF 送入累加器 A,从而完成一帧数据的接收工作。
2. 原理框架
3. 硬件电路原理 图,对各模块进行分别介绍
单
片
机 LCD 显示电路 复位电路 时钟电路 电源电路 串行口通信电路
3.1 液晶显示模块
1602LCD 采用标准的 14 脚(无背光)或 16 脚(带背光)接口,各引脚接口如下所示
接口信号说明 编号 符号 引脚说明 编号 符号 引脚说明 1 VSS 电源地 9 D2 Data I/O 2 VDD 电源正极 10 D3 Data I/O 3 VL 液晶显示偏压信号 11 D4 Data I/O 4 RS 数据/命令选择端(H/L)
12 D5 Data I/O 5 R/W 读/写选择端(H/L)
13 D6 Data I/O 6 E 使能信号 14 D7 Data I/O 7 D0 Data I/O 15 BLA 背光源正极 8 D1 Data I/O 16 BLK 背光源负极 用 LCD1602 液晶显示模块显示字符或字符串之前必须对其进行初始化,LCD1602 液晶显示模块的初始化流程如下:
? 5.0 初始化过程(复位过程)
? 5.1 延时 15ms ? 5.2 写指令 38H(不检测忙信号)
? 5.3 延时 5ms ? 5.4 写指令 38H(不检测忙信号)
? 5.5 延时 5ms ? 5.6 写指令 38H(不检测忙信号)
? 5.7(以后每次写指令、读/写数据之前均需检测忙信号)
? 5.8 写指令 38H:显示模式设置 ? 5.9 写指令 38H:显示关闭 ? 5.10 写指令 01H:显示清屏 ? 5.11 写指令 06H:显示光标移动设置 ? 5.12 写指令 0CH:显示开关及光标位置
表 8 LCD1602 液晶模块内部的控制器控制指令 指令 指令码
说明
RS
R/W D0
D1
D2
D3
D4
D5
D6
D7
清屏
0 0 0 0 0 0 0 0 0 1 清显示,光标回位
光标返回
0 0 0 0 0 0 0 0 1 * ADD=0 时,回原位
输入方式
0 0 0 0 0 0 0 1 I/D S 决定是否移动以及移动方向
显示开关
0 0 0 0 0 0 1 D C B D-显示,C-光标,B-光标闪烁
移位
0 0 0 0 0 1 S/C R/L * * 移动光标及整体显示
功能设置
0 0 0 0 1 DL N F * * DL-数据位数,L-行数,F-字体
CGRAM 地址设置
0 0 0 1 A5 A4 A3 A2 A1 A0 设置 CGRAM 的地址 DDRAM 地址设置
0 0 1 A6 A5 A4 A3 A2 A1 A0 设置 DDRAM 的地址 忙标志/读地址计数器
0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 读出忙标志位(BF)及 AC 值 CGRAM/DDRAM 数据写
1 0 写数据 将内容写入 RAM 中 CGRAM/DDRAM 数据读
1 1 读数据 将内容从 RAM 中读出
LCD1602 液晶显示模块可以和单片机 AT89C51 直接接口,电路如下图所示。
RP110KGND1VDD2VO3RS4RW5E6DB07DB18DB29DB310DB411DB512DB613DB714BL115BL216U2LCD1620X119X218RESET9RD17WR16INT012INT113T014T115P101P112P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSEN29ALE/P30TXD11RXD10GND20VCC40EA/VP31nPSENRXDTXDALEU1AT89S51P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7+5VP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7RWRSE+5VnWRVCCnWRnRD
AT89S52 和 LCD1602 液晶模块连接电路 液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表 9 是 LCD1602 的内部显示地址。即第 1 行的显示地址应为 80H+显示位置,第 2 行的显示地址应为 40H+显示位置。
表 9
LCD1602 的内部显示地址
3.2 串口通信模块 RS-232C 标准(协议)的全称是 EIA-RS-232C 标准,其中 EIA(Electronic Industry Association)代表美国电子工业协会,RS(recommended standard)代表推荐标准,232 是标识号,C 代表 RS232 的最新一次修改,在这之前,有 RS232B、RS232A,它规定连接电缆和机械、电气特性、信号功能及传送过程。RS-232C 适合于数据传输速率在 0~20000b/s 范围内的通信。
PC 机常用 DB-9 连接器作为提供多功能 I/O 卡或主板上 COM1 和 COM2 两个串行接口的连接器,它只提供异步通信的 9 个信号,9 针串口功能见表 10,并且对电缆长度也有要求:
RS-232C 标准规定,若不使用 MODEM,在码元畸变小于 4%的情况下,DTE 和 DCE 之间最大传输距离为 15m(50 英尺)。可见这个最大的距离是在码元畸变小于 4%的前提下给出的,为了保证码元畸变小于 4%的要求,接口标准在电气特性中规定,驱动器的负载电容应小于 2500pF。
表 10
9 针串口功能一览表 针脚 功能 针脚 功能 1 载波检测 6 数据准备完成 2 接收数据 7 发送请求 3 发送数据 8 发送清除 4 数据终端准备完成 9 振铃指示 5 信号地线
本方案对 RS-232-C 接口采用 3 线制(RXD、TXD、GND)软握手的零 MODEM 方式进行单片机和 PC 之间的数据通信,即 PC 机和单片机的发送数据线(TXD)与接收数据(RXD)交叉连接,二者的地线(GND)直接相连,其它信号线如握手信号线均不用,而采用软件握手。但由于 RS-232-C 的逻辑电对地是对称的,与 TTL、MOS 逻辑电平完全不同,逻辑 0 电平规定为+5~ +15V 之间,逻辑 1 是电平为-5~ -15V 之间,因此利用 MAX232芯片进行电平转换,电路连接如图 11。
C1-3V+2C2+4C2-5V-6R209D2110VCC16GND15D1014R1113R1012D1111R218D207C1+1IC2MAX232C13C12C11C10VCC162738495J232DB9 图 RS-232-C 通信连接电路
3.3 电源模块 +220PFC5C60.1uFS12Vin+5VGNDU37805R81.5KD0LED123POWCON3SPD2
充电电路
4. 软件设计 ( (1 )流程图
( (2 )代码附录 //示 接收电脑送过来的数据,并且显示 16 进制数,并将数据回传到电脑 脑 #include <reg52.h> //LCD 的口线 sbit E=P2^5; sbit RW=P3^6; sbit RS=P2^6; unsigned char recdata[28];//定义 RS232 数组 unsigned char recv_p; unsigned char bdata myflag; sbit recokbit = myflag^0; void Delay(unsigned int t); void SendCommandByte(unsigned char ch);//传送命令 void SendDataByte(unsigned char ch);//传送数据 void InitLcd(void);//LCD 显示 void disprec(void); //显示 void rs232(void); void main(void)//主函数 {
InitLcd();//初始化 LCD
myflag=0x00;//标志痊
SendCommandByte(0x80);//调用发送命令
Delay(2);
SendDataByte("c"); //初始化显示 CPR:
SendDataByte("p");
SendDataByte("r");
SendDataByte(":");
TMOD=0x20;//定时器的设置
TH1=0xf3;//计时器
TL1=0xf3;
SCON=0x50;//设定串行工作方式
TR1=1;
REN=1;//允许中断
IE=0x90;//中断允许标志
while(1)
{
if(recokbit==1)//接收数据
{
recokbit=0;
disprec();
}
} }
//以下为串口中断程序 void rs232(void) interrupt 4//中断串行口
{
if(RI==1)//控制电路使中断标志 R1 置为“1 此时程序可通过 MOV
A,SBUF 指令将接收到的字符从 SBUF 送入累加器 A,从而完成一帧数据的接收工作
{
RI=0;
recdata[recv_p]=SBUF;
SBUF=recdata[recv_p];
recv_p++; if(recv_p>27) recv_p=0;//
recokbit=1;//接受完成
}
} void Delay(unsigned int t)
// delay 40us {
for(;t!=0;t--); } //============================================= void SendCommandByte(unsigned char ch) {
RS=0;
RW=0;
P0=ch;
E=1;//使能端口为 1,接收命令
Delay(1);
E=0;
Delay(100);
//delay 40us }
//=============================================
//------------------------------------------------------- void SendDataByte(unsigned char ch) {
TI=0;//开始发送数据
SBUF=ch;
while(!TI);
RS=1;//输入数据
RW=0;//为 0 时写,1 时读
P0=ch;
E=1;
Delay(1);
E=0;//使能信号为 0 时,不能输入
Delay(100); //delay 40us } //------------------------------------------------- void InitLcd(void) { unsigned char i; for(i=0;i<28;i++) recdata[i]=0x30;//初始化数组 0 recv_p=0;
SendCommandByte(0x30);
SendCommandByte(0x30);
SendCommandByte(0x30);
SendCommandByte(0x38); //设置工作方式
SendCommandByte(0x0c); //显示状态设置
SendCommandByte(0x01); //清屏
SendCommandByte(0x06); //输入方式设置 } void disprec(void) {
unsigned char i;
for(i=0;i<12;i++)
{
SendCommandByte(0x84+i);
SendDataByte(recdata[i]);
}
for(i=0;i<16;i++)
{
SendCommandByte(0xc0+i);
SendDataByte(recdata[i+12]);
}
}
5. 调试过程 ( (1 )测试数据
采用 RS232 把 PC 机与单片机连接起来,运行上位机程序如下图所示:
向单片机发送信息时,PC 机显示信息重复了。
( (2)
)
数据分析
PC 机发送的数据给单片机能正常显示,但单片机返回给 PC 机的信息重复了,经过反复检查,原来是 recdata[recv_p]=SBUF; SBUF=recdata[recv_p];这语句重写了,删了,就恢复正常通信显示了。
三. 结论 经过这次嵌入式系统实训,熟悉了单片机设计,开发的流程,在杨琴老师,金红老师,杨光杰老师的辛勤指导下,在和组员庞卡努力下,从最初的元件领取,电路焊接,利用 PROTEL99 画电路原理图,到代码的编写,我负责下位机程序,庞卡负责上位机的程序,经过我们的共同努力,加上各位老师的指导,终于在老师规定的时间内完成了单片机与上位机的通信。
这次嵌入式系统实训,学习了嵌入式系统简单开发流程,加深所学知识的理解。
热点文章阅读