单片机原理及接口技术
(实验教程)
动力装置电控所 编
哈尔滨工程大学
前言
单片机是一款功能强大的实用工具,其本身的性质就决定了学习单片机最为有效的途径—实践。而实践的缺乏同时也是造成大多数人学习单片机比较困难的主要原因。本实验课程设置的目的旨在部分解决上述问题,为同学们提供相关实验设备,通过实践的方式解决理论学习中存在的疑惑,以期达到整个课程设置的目的:帮助同学们完成单片机入门知识的学习。
实验预习及实验步骤请参考第一章实验手册
实验课程分数分配请参考第二章考核方式
相关软件以及驱动安装请参考第三章实验箱使用说明
第一章 实验手册
实验一 单片机通用输入输出端口应用实验
(一)实验目的
1、熟悉实验箱的组成与使用。
2、掌握程序的下载与调试的基本流程。
3、了解单片机通用端口工作的基本原理。
(二)实验器材
主机 试验箱组件 接插线
(三)实验说明
本实验旨在通过使用GPIO(通用输入输出端口)检测拨码开关状态和点亮LED小灯的形式使学生了解单片机工作的基本原理。
(四)实验原理
1、LED原理
如下图所示,8个LED(D1—D8)一端接VCC5,另一端接三极管(RQ1—RQ8)的集电结。三极管发射结接地,基区经电阻(RD1—RD8)接插孔D-JK。16个插孔每两个一组,分别对应8个LED,同组的两个插孔等价。由三极管的工作原理可知。将插孔,即三极管的基区电压接低。使得三极管集电节反相偏置,LED正向导通后点亮。
图1-1 LED原理图
2、拨码开关原理
如图所示四个拨码开关(K1—K4),“1”脚接地,“3”脚悬空,“2”脚一方面经1K电阻与VCC-Input连接,另一方面与插孔K-JK相连。通过拨动拨码开关改变插孔K-JK的输出电平。当“2”脚与“1”脚连接时,插孔K-JK被拉低。当“2”脚与“3”脚连接时,插孔K-JK被置高。
图1-2 拨码开关原理图
(五)实验步骤
1、安装CodeWarrior5.0(上课前务必安装好)。
2、由实验指导老师介绍实验原理,注意事项。
3、连接下载器与主机,参考本教程第三章第二节的步骤3、4安装下载器的相关驱动。
5、将子版上PB端口的8个插针分别与8个调试小灯(D-JK)相连,将拨码开关K4与子板上PA的第0端口相连。
图1-3 实物连线图
5、连接烧写器与目标板。
7、经指导老师检测无误后上电。
8、在CodeWarrior开发环境中打开实验资料/程序/CodeWarrior5.0编写
/Project01GPIO,并将编译无误的程序烧写到目标板中。
9、点击全速运行按钮后拨动拨码开关,观察LED灯亮灭变化。
12、修改代码改变LED灯的点亮逻辑,诸如左边四个与右边四个交替点亮,或是8个灯交叉点亮。
10、关掉电源,从子板上拔掉下载器。
11、重新上电,拨动拨码开关,再次观察实验现象。
(六)程序流程图
图1-5 程序流程图
(七)源程序代码
void main(void) {
/* put your own code here */
byte k=0, temp=0;
int i=0, j=0; //变量声明
//配置端口方向寄存器
DDRB = 0xFF; //PortB全为输出
DDRA = 0xFE; //PortA的第0端口为输入
EnableInterrupts;
for(;;)
{
if((PORTA & 0x01) > 0)//如果PortA的第0端口为高
{
for(i=0; i
for(j=0; j
PORTB = ~PORTB; //将PortB端口数据寄存器值按位取反
}
else//如果PortA的第0端口为低
{
for(k=0; k
{
temp = 0x01
PORTB = temp; //赋值PortB端口数据寄存器
for(i=0; i
for(j=0; j
}
}
} /* wait forever */
/* please make sure that you never leave this function */
}
实验二 输入捕捉和PWM输出模块编程实验
(一)实验目的
1、了解TIM(ECT)与PWM模块的基本工作原理。
2、熟悉并掌握对输入捕捉模块的控制与使用。
3、能够进行输入捕捉技术的C语言编程。
(二)实验器材
主机 试验箱组件 接插线
(三)实验说明
本实验完成PWM模块和输入捕捉模块的使用,在程序中使用PWM模块产生矩形波,其中PWMPER0寄存器用于设置PWM的周期,PWMDTY0寄存器用于设置PWM的占空比,PWM模块的运行频率是总线时钟16分频,即1MHz,如果PWMPER0=200,相当于PWM模块输出波形的周期为PWM模块运行周期的200倍,周期为200μs。将PWM模块的输出与输入捕捉模块相连,输入捕捉用于PWM周期检测,程序中设置的输入捕捉进行下降沿捕捉,由于输入捕捉模块的运行频率(即自由定时器频率)为总线频率(16MHz),那么捕获周期为200μs波形,捕获值应该为200*16。所以程序中输入捕捉捕捉到的值(PeriodTIM)应该为PWMPER0的16倍。修改PWMPER0的值(不能太小,建议大于50,同时修改相应的PWMDTY0,保证PWMDTY0小于PWMPER0),检查PeriodTIM是否是PWMPER0的16倍。
(四)实验原理
1、PWM输出方波原理
PWM
输出
图2-1 PWM原理图
PWM模块的计时频率为f1=1MHz。如上图所示,通过寄存器PWMPER0设置方波的周期T= PWMPER0*(1/ f1)。通过寄存器PWMDTY0设置方波的高电平维
持的时间TH = PWMDTY0*(1/ f1),以此来输出周期与占空比可调的方波。
2、ECT输入捕捉原理
PWM
输出
ECT主
定时器TimeExTimeNow
图2-2 ECT输入捕捉原理图
主定时器按照预先设定的频率f2=16MHz循环计数(0—65535)。所谓输入捕捉就是在触发条件到来时(预先设定的触发边沿)记录当前主定时器的值。如上图所示,在某连续的两个上升沿记录的主定时器值分别为TimeEx和TimeNow。因此,通过ECT输入捕捉计算方波的周期为:
PeriodTIM= TimeNow-TimeEx (2.1)
T = PeriodTIM *(1/f2) (2.2)
由PWM输出方波的原理可知:T= PWMPER0*(1/ f1)。因此有:
PWMPER0*(1/ f1)= PeriodTIM *(1/f2) (2.3)
即
PeriodTIM =PWMPER0*16 (2.4)
所以,PWM和ECT各自模块的计数频率一旦设定。通过ECT输入捕捉所计算的PeriodTIM值总是PWMPER0得16倍。即改变PWMPER0的值,通过在线观测到的PeriodTIM一定是PWMPER0的16倍。
3、ECT输入捕捉溢出计算原理
PWM
输出
ECT主
定时器TimeEXPeriodTIM
图2-3 ECT捕捉溢出原理图
原理2中,为说明方便特意将连续的两次捕捉放在主定时器的某一循环内。然而实际情况不止如此,倘若PWM输出方波的周期很大,ECT两次连续的捕捉将跨越一次甚至多次主定时器的溢出。此时计算连续的两次捕捉之间的主定时器计数值就要考虑溢出次数的影响:
PeriodTIM= TimeNow+65536* FlowNum –TimeEx (2.4)
(五)实验步骤
1、检测实验箱电源开关是否为关,请务必保证开关处于关的位置。
2、由实验指导老师介绍实验原理。
3、连接主机、烧写器与目标板。
4、将实验箱核心板上PP端口的0端口(PWM的0通道)与核心板上PT的0端口(TIM的0通道)相连。
图2-4 实物连线图
5、经实验指导老师确认连线无误后方可上电。
5、在CodeWarrior开发环境中打开实验资料/程序/CodeWarrior5.0编写/ Project02ECT_PWM,并将编译无误的程序烧写到目标板中。
6、运行目标板,在线观察PeriodTIM是否为PWMPER0的16倍,
7、修改PWMPER0的值(不能太小,建议大于50,同时修改相应的PWMDTY0,保证PWMDTY0小于PWMPER0),并重新下载程序,再次观察。
(六)程序流程图
图2-5 溢出中断(左)与输入捕捉中断(右)流程图
图2-4 主程序流程图
(七)源程序代码
/*头文件*/
#include
#include "derivative.h"
/*全局变量*/
unsigned int TimeEx=0; //前一次下降沿时定时器计数值 unsigned int TimeNow=0; //当前下降沿定时器计数值 long int PeriodTIM=0; //计算得到的周期值
long int FlowNum=0; //记载自由运行定时器溢出次数 /*总线时钟设置:外部晶振16MHz,单片机总线时钟也设置为16MHz*/ void Busclock_Init(void)
{
CLKSEL = 0x00; //将PLL锁相环脱离系统从而进行配置
PLLCTL_PLLON = 1; //打开PLL锁相环
SYNR = 0x00;
REFDV = 0xC0;
POSTDIV = 0x00;
while(!(CRGFLG_LOCK==1)); //等待PLL锁相环稳定
CLKSEL_PLLSEL = 1; //在系统中使用PLL锁相环 }
/*TIM初始化*/
void TIM_Init(void)
{
/*配置自由运行定时器的分频系数*/
TSCR2_TOI = 1; //定时器溢出中断使能
TSCR2 = TSCR2&0xF8; //预分频系数为1,即定时器频率为总
//线频率
TSCR1_TEN = 1; //开启自由运行定时器
/*输入捕捉相关寄存器设置*/
TIOS_IOS0 = 0; //通道0设置为输入捕捉功能
TCTL4 = TCTL4&0xFC|0x02; //通道0下降沿捕捉
TIE_C0I = 1; //通道0输入捕捉/输出比较中断允许 }
/*PWM初始化*/
void PWM_Init(void)
{
PWMPOL = 0x01; //通道0先输出高电平
PWMCLK_PCLK0 = 0; //0通道使用A时钟源
PWMPRCLK = 0x04; //A时钟频率为总线时钟16分频 PWMCAE = 0x00; //左对齐输出
PWMCTL = 0x00; //各通道8位PWM输出 PWMPER0 = 200; //PWM0周期
PWMDTY0 = 100; //PWM0占空比
PWMSDN = 0x00;
PWME_PWME0 = 0; //0通道禁止
}
/*主程序*/
void main(void)
{
Busclock_Init(); //调用总线时钟设置函数
TIM_Init(); //调用TIM初始化函数
PWM_Init(); //调用PWM初始化函数
PWMDTY0 = 100; // PWM0周期
PWMPER0 = 250; // PWM0占空比
EnableInterrupts; //全局中断使能
PWME_PWME0 = 1; //PWM的0通道使能
for(;;); //永久循环
}
/*中断服务程序*/
#pragma CODE_SEG NON_BANKED
/*自由运行定时器溢出中断服务程序进行溢出次数计算*/
void interrupt 16 TIMOVFISR(void)//TIM自由定时器计时溢出中断向
//量号为16
{
FlowNum++;
TFLG2_TOF = 1;
}
/*通道0输入捕捉中断服务程序完成周期的计算*/
void interrupt 8 TIMCH0ISR(void) //输入捕捉通道0的中断向量号
//为8
{
TimeNow = TC0;
PeriodTIM = TimeNow +FlowNum*65536-TimeEx;
TimeEx = TimeNow;
FlowNum = 0; //
TFLG1_C0F = 1; //
} 每计算一次周期后需要将FlowNum清零 清除中断标识位
实验三 单片机串行通信实验
(一)实验目的
1、了解串口通信的基本工作原理。
2、熟悉并掌握对SCI模块的控制与使用。
3、能够进行SCI串口通信的C语言编程。
(二)实验器材
主机 试验箱组件 接插线 USB转串口线
(三)实验说明
本实验通过RS232串口通信实现电脑和单片机的通信,其中单片机部分通过SCI模块进行数据传输。本实验程序完成如下功能:初始化单片机后,单片机向电脑发送字符串“OK”,在电脑端通过串口通信助手向单片机发送字符,单片机会将接收到的字符回发给电脑。
(四)实验步骤
1、检测实验箱电源开关是否为关,请务必保证开关处于关的位置。
2、由实验指导老师介绍实验原理。
3、连接主机、烧写器与目标板。
4、通过USB转串口线(或串口线)将实验箱中“串口通信”部分的DB9端口与计算机相连。
图3-1 USB转串口线
图3-2 实物连线图
5、在CodeWarrior开发环境中打开实验资料/程序/CodeWarrior5.0编写/ Project03SCI,并将编译无误的程序烧写到目标板中。
6、在电脑上打开串口调试工具(试验资料/串口调试工具),选择正在使
,用的串口号,方法是右击我的电脑/管理/设备管理器/端口(COM和LPT)
并将串口调试工具的波特率设置为9600。
7、运行程序,串口调试工具中的接收区将会收到字符串“OK”,在串口调试工具的发送区输入字符或字符串,按下“手动发送”按钮发送字符或字符串,目标板接收到字符后会将字符再回发给电脑,在串口调试工具的接收区显示。
(五)程序流程图
图3-3 程序流程图
(六)源程序代码
/*头文件*/
#include
#include "derivative.h"
/*总线时钟设置,设置为16MHz*/
void Busclock_Init(void)
{
CLKSEL=0x00; //将PLL锁相环脱离系统从而进行配置 PLLCTL_PLLON=1; //打开PLL锁相环
SYNR=0x00;
REFDV=0xC0;
POSTDIV = 0x00;
while(!(CRGFLG_LOCK==1)); //等待PLL锁相环稳定
CLKSEL_PLLSEL =1; //在系统中使用PLL锁相环 }
/*SCI模块的初始化*/
void SCI_Init(void)
{
SCI0BD = 104; //设置波特率,波特率为:16000000/(16*104),
//约9600bit/s
SCI0CR1 = 0x00; //普通操作模式;SCI在等待模式下使能; 1
//位起始位 8位数据位, 1位停止位;PE=0,
//禁止奇偶校验
SCI0CR2 = 0x0C; //发送器和接收器使能,相关中断禁止
}
/*单片机发送一个字节*/
void SCI_Char_Send (unsigned char ch)
{
while(!(SCI0SR1&0x80)) ; //等待发送数据寄存器空,为空跳出循//
进行数据发送
SCI0DRL=ch;
}
/*单片机接收一个字节*/
unsigned char SCI_Char_Get(void)
{
return SCI0DRL;
}
/*主程序*/
void main(void)
{
char GetChar = 0; //用于保存接收到的字符 Busclock_Init(); //调用时钟总线初始化函数 SCI_Init(); //调用SCI初始化函
DisableInterrupts; //全局中断禁止
SCI_Char_Send ('O');
SCI_Char_Send ('K');
SCI_Char_Send (‘\n’); //发送换行符
for(;;) //进入大循环
{
if(SCI0SR1&0x20) //RDRF置位,即接收数据寄存器满 {
GetChar = SCI_Char_Get(); //读取接收到的数据
SCI_Char_Send (GetChar); //
SCI_Char_Send (‘/’); //
}
}
} 将接收到的数据发送给PC机 每个字符之间用’/’隔开
实验四 模/数转换实验
(一)实验目的
1、了解AD转换的原理。
2、熟悉并掌握对模数转换(AD)模块的使用。
3、能够进行模数转换模块的C语言编程。
(二)实验器材
主机 试验箱组件 接插线
(三)实验说明
本实验完成AD模块的数据采集,将变阻器的一端与单片机的AD模块的0端口相连,旋转变阻器即改变输入到单片机引脚的电压,AD模块采集电压值,并将其转化为8位数字值,再通过8个LED显示数字值的二进制值,灯亮代表1,灯灭代表0,旋转变阻器,可以看见8个LED相应变化。
(四)实验原理
AD转换原理请参考教材或其他资料,在此简单说明电位器原理。
图4-1 电位器原理图
如上图所示,电位器实际上就是滑动电阻,V1的3脚接5V(VCC-Input),1脚接地。旋转电位器改变1-2和2-3之间的电阻值,从而改变2端口的输出电压。2端口与三个插孔(ADV1-JK)相连。三个插孔等价,V2同V1。
(五)实验步骤
1、检测实验箱电源开关是否为关,请务必保证开关处于关的位置。
2、由实验指导老师介绍实验原理。
3、连接主机、烧写器与目标板。
4、将子版上PB端口的8个插针分别与8个调试小灯(D-JK)相连,将变阻器ADV1-JK或ADV2-JK的任意一个接口与子板上PAD的第0端口相连。
图4-2 实物连线图
2、在CodeWarrior开发环境中打开实验资料/程序/CodeWarrior5.0编写/ Project04AD,并将编译无误的程序烧写到目标板中。
3、运行目标板,旋转变阻器,观察变量ADResult 以及LED的显示。
4、改变采样精度,重新编译并下载程序。旋转变阻器,观察AD转换结果。
(六)程序流程图
图4-3 AD转换流程图
(七)源程序代码
/*头文件*/
#include
#include "derivative.h"
/*AD模块0初始化*/
void ATD0_Init(void)
{
ATD0CTL1 = 0x00; //8位采样精度
ATD0CTL2 = 0x40; //AD模块上电,标志快速清除,禁止外部触发 ATD0CTL3 = 0x88; //每个转换序列完成1次转换,非先入先出模式 ATD0CTL4 = 0x87; //采样时间为2个AD时钟,AD时钟为总线时
//钟16分频
ATD0CTL5 = 0x20; //对通道0单通道连续采样,转换结果右对齐
//无符号数
}
/*PTB端口初始化函数*/
void PortB_Init(void)
{
DDRB = 0xFF; //定义PORTB端口为输出口
PORTB = 0xFF; //关闭所有LED灯
}
/*主程序*/
void main(void)
{
unsigned char ADResult=0; //定义变量,存储A/D转换结果
ATD0_Init(); //调用AD模块初始化函数
PortB_Init(); //调用PTB端口初始化函数
DisableInterrupts; //全局中断禁止
for(;;)
{
while(!ATD0STAT2_CCF0); //等待A/D转换结束
ADResult=ATD0DR0L;
PORTB = ~ADResult;
}
}
第二章 考核方式
实验课程占整个课程的20分,考核方式分为基础分数和附加分数两部分,而实验课总成绩并不等于两者之和,具体详述如下。
一、基础部分(必做)
A实验过程 ○
按照实验手册实验步骤,能观察到实验现象。
B实验报告 ○
实验报告包括两部分内容:抄写源程序(0.8分);关键词叙述(1.2分)。
1) 抄写(手写)每次实验的源程序(包括程序注释)。
2) 每次实验课后由助教给出备选关键词,要求每位同学就其中的至少 一个关键词的相关知识进行搜集、总结、理解并用自己的语言予以表述。当然也可以自己查找与单片机软硬件相关的任何关键词予以描述。
3) 纸张要求A4纸,实验报告封皮由学委统一发放,实验指导老师填 写理论课授课老师名字。每做完一个实验后,下次上实验课时由学委收集交于助教处。除以上要求外无任何排版格式、字体以及书写方式的要求。
C课程反馈 ○
该项目设置的目的旨在完善我们的单片机教学课程,就课程相关的所有方面都可以提出自己的意见或是存在的问题。大致包括以下内容:
1) 教学相关
教材、课件、实验手册的编排;课程的考核方式;教师的授课方式等。
2) 知识点相关
教材以及实验遗漏的知识点;教材以及实验错误讲解的知识点;反复思考不得其解的难点;对某一内容有自己更为深入的理解以及叙述方式的知识点;教材及实验手册存在的错别字以及标点符号等。
3) 其他相关
课程反馈的内容不局限于以上两者,凡是旨在完善课程的所有意见及问
题都可以进行反馈。每反馈一条意见给予0.5分,凡提出4条意见及以上者给予课程反馈部分满分分值(2分)。
二、附加部分(选做)
该部分内容具有一定的难度,可依据个人兴趣选做。表现杰出者在保证四次实验课出勤以及完成四份实验报告的前提下将直接获得18-20分的实验课程分(不管基础部分分值是多少)。
具体内容包括以下两个选项:
软件设计及实现
飞思卡尔单片机资源丰富,要求能利用单片机资源进行自主程序设计并予以代码实现。
主题叙述
就单片机相关的某一项主题给出具体的叙述。包括该主题涉及的原理以及在工业领域中的实际应用。
三、交流途径
课程反馈请发送邮件至邮箱[email protected],并注明班级、学号及姓名。
有意从事附加部分选做内容的同学可以通过邮件或是现场交流的方式寻求额外指导。
第三章 实验箱实用说明
一、认识试验箱
依次查看实验资料/照片/01-04。
试验箱组件:电路板、下载器(写入器、烧写器)、电源适配器。 电路板组成:扩展板(母版)、核心板(子板)。
结合本文档附图(扩展板布局图)和照片04,依次识别各个模块的电路实图。
二、PC与试验箱的连接以及驱动的安装
1、CodeWarrior5.0安装过程一路默认即可。
2、如照片实验资料/照片/05所示
电源适配器一端接插座,另一端接位于电路板左上角的电源模块。下载器一端接PC的USB端口,另一端(6针插头)接电路板子板的写入端口。
3、当PC首次连接下载器时会提示安装驱动,选择“从列表或指定位置安装”, 点击下一步。
浏览实验资料/S08-S12-ColdFire_BDM_PC-Driver安装下载器的驱动程序,点击下一步。
完成安装。
4、此外还需要将实验资料/ S08-S12-ColdFire_BDM_DLL/tbdml.dll文件拷贝到X/Program Files/Freescale/CodeWarrior for HCS12 V4.7/Prog/gdi文件夹下,完成运行库的安装。(X为CodeWarrior4.7的安装盘符,通常为C或D盘)
三、试验箱使用注意事项
1、仔细观察实验资料/照片/06下载器与电路板子板下入端口的连接,六针插口的方向切勿插反。
2、在实验过程中还要涉及到其他连线,上电前务必先请实验指导老师检查线路连接,确认无误后方可上电。保证连线和拆线过程是在断电的情况下进行的。
3、试验箱使用过程中请勿用手触摸电路板,以防静电损坏。
四、备注
有关试验箱的详细资料请浏览:
实验资料/苏州大学通用开发套件(实验箱)用户手册3.0(201006).pdf
扩展板布局图