昆明理工大学信息工程与自动化学院学生实验报告
( 2011 —2012 学年第 2 学期)
课程名称:嵌入式技术基础与实验 开课实验室:信自楼234 2012 年 5 月 10 日
注:报告内容按实验须知中七点要求进行。
一、实验目的
通过该实验实习,进一步熟悉CodeWarrior嵌入式开发系统环境、汇编和C语言以及调试方式;加强串口通信(SCI)基本原理及编程原理;理解课本中的程序代码;分别运用查询方式、中断方式实现通信。
二、实验原理及基本技术路线图(方框原理图)
AW60 MCU的SCI有2个,能接收其他设备信息供MCU处理,也能将MCU内部的信号输出给外部设备,显示数据或者控制对象。SCI的使用涉及波特率寄存器、控制寄存器、状态寄存器和数据寄存器。接收方和发送方必须在相同的波特率和模式的条件下接收和发送信息。引脚连接图如图4-1所示。
图4-1 SCI的连接图
三、所用仪器、材料(设备名称、型号、规格等)
飞思卡尔试验箱
四、实验方法、步骤
1、资源使用
SCI连接图雷同演示实验,即MCU的SCI发送引脚E口的1号引脚接MAX232的TTL电平接收引脚11号,MCU的SCI接收引脚E口的0号引脚接MAX232的TTL电平发送引脚12号。
另外,要讲SCI线一头接PC的COM1,一头接实验箱的COM1或COM2,小灯的连接是用D口的1号引脚和一个小灯接口连接。
波特率为19200bps,计算波特率寄存器的值,计算过程:
公式为
SCI1BD=fsys/(波特率*16)(其中fsys=sysclk*1000000)
SCI1BD=20000000/(19200*16)=65
然后将其结果供后语句使用。
SCI1BDH=0x00;
SCI1BDL=0x41;
2、硬件设计
先阅读源程序,查看相应的端口的宏定义,再根据端口号来接线。
3、软件设计(主要的程序流程图)
MCU端程序流程图
4、编程(关键性程序段)
串行通信中断方式的主程序部分代码:
//-------------------------------------------------------------------------*
#include "Includes.h"
void main(void)
{
//1 关总中断
DisableInterrupt(); //禁止总中断
//2 芯片初始化
MCUInit();
//3 模块初始化
//3.1 指示灯初始化
Light_Init(Light_Run_PORT,Light_Run,Light_OFF);
//3.2 串行口初始化
//使用SCI1模块,使用系统时钟作为SCI的时钟源
//波特率为38400
SCIInit(SCI_NUM_1,SYSTEM_CLOCK,38400);
//4 开放中断
EnableSCIReInt(); //开放SCI接收中断
EnableInterrupt(); //开放总中断
//5 主循环
while (1)
{
}
}
2)、串行中断方式子程序部分代码:
interrupt void SCI1_Recv(void)
{
uint8 i;
uint8 SerialBuff[1]; //存放接收数据的数组
DisableInterrupt(); //禁止总中断
i = SCIReN(SCI_NUM_1,1,SerialBuff); //等待接收1个数据
if (i == 0) SCISendN(SCI_NUM_1,1,SerialBuff);//发送接到的数据
if (SerialBuff[0]=='1')
Light_Control(Light_Run_PORT,Light_Run,Light_ON);
if (SerialBuff[0]=='0')
Light_Control(Light_Run_PORT,Light_Run,Light_OFF);
EnableInterrupt(); //开放总中断
}
五、实验过程原始记录(数据、图表、计算等)
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸)
本次实验虽属简单小型实验,却着实遇到不少问题,通过实验,我也进一步发现了自己在动手能力和自学能力方面的不足,当然对本实验所涉及到的东西也算是有了不少兴趣,感觉越来越有意思了。同时也对rs232串口的发送与接收信息有了进一步的了解,初步认识了MODBUS协议传输数据的原理,相信本实验对我日后的进一步学习有莫大帮助。
第二篇:基于RS232串口通信实验
基于RS232串口通信实验
一、实验目的
1. 通过串口实现单片机与PC机的数据通信。
2. 了解下位机与上位机通讯过程。
二、实验内容
使用串口实现单片机与PC机的数据通信。要求按下单片机系统板上中断INT0时,单片机向PC机发送0-9这十个数字,并用“串口调试助手”接收显示。在“串口调试助手”上发送0-9中任何一个数字时,单片机用8个发光二极管显示对应的ASCII码值。
三、实验环境
1、编程软件keil
2、仿真软件proteus
四、实验原理
单片机与PC机之间通信原理图如图1所示。S3键接P3.2,作为外部中断INT0输入端,当S3按下,产生中断,执行中断程序发送0-9这十个数字,在PC机上接收并显示。
图1 单片机与PC机之间通信
五、 实验过程
1、实现实验要求
#include<reg51.h>
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e};//7段数码管共阳极0-9
unsigned char shu[]={0x30,0x31,0x32,0x33,0x34,0x35,
0x36,0x37,0x38,0x39}; //0—9的ASCLL码
unsigned char a,i=0; //定义变量
void main()
{ ES=EX0=EA=1; //开启中断
IT0=1; //使得外部方式0为边沿触发
TMOD=0x20; //T1定时器工作方式2
SCON=0X50; //使用串行接口方式一
TH1=0XFD; //设置T1的初始值,使得波特率为9600
TL1=0XFD;
TR1=1; //启动T1定时器
P0=0xff; //给P0 赋值
while(1); //主程序死循环
}
void intr1() interrupt 0 //外部中断0
{ ES=0; //关闭串口中断
for (i=0;i<10;i++) //循环发送0-9
{SBUF=shu[i]; //传送0-9的ASCLL码
while(!TI); //等待发送
TI=0; //发送标志位置0
}ES=1; //打开串口中断
}
void intr() interrupt 4 //串口中断
{
a=SBUF-'0'; //将ASCLL码转化为字符型
P0=tab[a]; //给P0口赋值
RI=0; //接收标志位置0
}
2、仿真图
六、 实验结论
这次试验被卡住了,其实程序并不怎么难写,第一个写出来,第二个就没问题,主要就是仿真不行,首先就是不知怎么用上虚拟串口,后用上VSPR后,多连接了RS232,其实虚拟串口就是一个RS232,无需再加。最后就是串口助手中收到的都是乱码,应将单片机的晶振改为11.0592MHz而不是12MHz。