单片机实习报告

发布时间: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 画电路原理图,到代码的编写,我负责下位机程序,庞卡负责上位机的程序,经过我们的共同努力,加上各位老师的指导,终于在老师规定的时间内完成了单片机与上位机的通信。

 这次嵌入式系统实训,学习了嵌入式系统简单开发流程,加深所学知识的理解。

相关热词搜索:单片机 实习报告

版权所有 蒲公英文摘 www.zhaoqt.net