一、 实验内容:
将RE0-RE5配置为输出,连接6个LED灯;编写程序,调试并运行,下载到实验板上,实现循环点亮。
二、 实验目的:
学习PIC单片机I/O端口功能及特点,了解I/O端口引脚及连线,控制寄存器。在开发板上实现循环点亮LED灯。
三、实验要求
1.了解掌握PIC单片机的结构和功能。
2.应熟练掌握MPLAB开发环境的使用方法。
3.熟练掌握PIC单片机的程序编写方法。
4.掌握MPLAB IDE硬件调试的技巧。
四、实验准备:
1、I/O引脚及连线:
I/O端口特点:
1、所有I/O 输入端口都是施密特触发器输入,以便增强抗干扰性。
2、外设复用:所有的器件引脚(除VDD、VSS、MCLR 和OSC1/CLKI之外),均为外设与I/O 端口所共用。
3、 如果外设使能,并且外设正在使用相关引脚时,该引脚将不再作为通用I/O 引脚使用。
4、优先级:I/O 与多个外设复用时I/O 引脚的名称定义了与该引脚相关的各个功能的优先级, 如:I/O 引脚与两个外设复用(“外设A”和“外设B”)外设A 对引脚的控制具有最高优先权,若外设A 和外设B 同时使能,外设A将控制I/O 引脚
5、电平变化通知引脚:电平变化通知引脚(CN)内接输入电平变化通知模块,使得dsPIC30F 器件能够向处理器发出中断请求,以响应所选输入引脚上的状态变化。
I/O端口控制寄存器:
所有的端口引脚,都有三个与端口引脚的操作直接相关的寄存器。
1TRISx:数据方向寄存器。决定各个引脚是输入引脚还是输出引脚。
–若某个I/O 引脚的TRIS 位为“1”,则该引脚是输入引脚。
–某个I/O 引脚的TRIS 位为“0”,则该引脚被配置为输出引脚。
–复位以后,所有端口引脚被定义为输入。
2PORTx:I/O端口寄存器。访问的是I/O引脚上的数据。读的是端口引脚值;写端口引脚,写的是端口数据锁存器(LATx )。
3LATx:I/O端口锁存寄存器。读的是数据锁存器里锁存的值;写锁存值,写的是端口数据锁存器(LATx )
五、 实验过程及结果:
实验源程序:
#include "p30f4011.h”
int main(void)
{
unsigned long int i=0;
PORTE=led;
while(1)
{
PORTE =led;
延时
led = led<<1; 当第6个LED灯亮后,重新从第1个LED灯点亮
if (led == 0x40)
led = 0x01;
}
return 0;
}
先编写程序,检验正确后,下载到实验板上并运行,实验板上6个LED灯开始循环点亮,通过修改程序,还可以改变延迟时间,即可控制LED灯点亮时间。
实验二 实现外部中断INT0
一、 实验内容:
学习PIC单片机的中断内容及其特性,了解中断请求、中断响应及中断服务原理。在实验板上实现外部中断INT0.
二、 实验目的:
掌握PIC单片机的中断内容,学会编程实现外部中断。
三、实验准备:
中断概述:
1、中断的定义:
中断是指如下过程:CPU与外设同时工作,CPU执行主程序,外设做准备工作,当外设准备好时向CPU发中断请求信号,若条件满足,则CPU终止主程序的执行,转去执行中断服务程序,在中断服务程序中CPU与外设交换信息,待中断服务程序执行完后,CPU再返回刚才终止的主程序继续执行。
2、中断源:
⑴中断源的定义:中断源是指引起中断请求的来源。
⑵中断源的分类: ①软中断和 ②硬中断
3、中断处理的全过程
中断处理的全过程分成3个阶段:中断请求、中断响应和中断服务。
4、多重中断与中断优先级
⑴ 当系统中有多个设备提出中断请求时,多个外设的中请信号要通过门电路送到CPU的中请输入端,使CPU能收到多个外设提出的中请。
⑵ CPU在收到多个外设的请求后,按优先级原则处理中断。
中断请求:
1.CPU都有中请输入线。
中请输入线有2类:非屏蔽中请输入线和可屏蔽中请输入线;
2.CPU的开、关中断。
CPU内有1个中断请求触发器IF,当IF=1时,称CPU开中断,此时CPU可以处理收到的可屏蔽中请;当IF=0时,称CPU关中断,虽然 CPU收到了可屏蔽中请,但不处理(响应)它。
3.CPU内有中断请求检测电路。
CPU每执行一条指令,其内的中断请求检测电路都要检测中断请求输入端的状态
中断服务:
中断服务子程序是由用户根据自己的需要编制的,编制时要注意如下问题:
1.保护现场:
目的是为了保护那些与主程序中有冲突的寄存器,如果中断服务子程序中所使用的寄存器与主程序中所使用的寄存器等没有冲突的话,这一步骤可以省略。
2.开/关中断:对相应中断位置1或置0实现。目的是为了能控制中断。
3.中断服务: 与中断源实现信息交换。
4.恢复现场:是与保护现场对应的,但要注意数据恢复的次序,以免混乱。
5.返回: 返回主程序
四、 实验过程及结果:
实验源程序:
#include "p30f4011.h”
unsigned int Led =0x01;
void Initializeint0()
{
IFS0bits.INT0IF = 0; 清除INT0的中断标志
IPC0bits.INT0IP = 7; 中断优先级为7
}
void __attribute__((__interrupt__)) _INT0Interrupt(void)
{
IFS0bits.INT0IF = 0; 清INT0中断标志
Led = Led<<1;
if(Led == 0x40)
Led = 1;
}
int main()
{
Initializeint0();
TRISE = 0x0100; 设置RE0~RE5为输出
Led=0x01;
PORTE = Led;
IEC0bits.INT0IE = 1; 使能中断
while(1)
{
PORTE = Led;
}
编写源程序,利用外部中断INT0实现中断,编译通过后下载到实验板中,编译并运行。实验中,当未按下按键时,LED灯循环点亮,当按下按键式,发出中断请求,LED灯全部点亮,并延迟一定时间,通过修改程序,可以延长或缩短LED全部点亮时间,当中断处理完成后,LED灯继续循环点亮。
实验三 定时器实验
一、 实验内容:
了解PIC单片机定时器的相关内容,了解其类型、工作模式,掌握定时器预分频器的结构功能。并利用定时器实现循环点亮LED灯,并设置时间间隔。
二、 实验目的:
通过学习定时器内容,掌握了解定时器结构功能,并学会应用于程序编写设计中,以实现相关功能。进一步了解掌握PIC单片机的结构和定时器功能,学习通过定时器寄存器的控制完成的定时/计数及中断响应的编程技巧,用C语言编写外部中断程序,并在MPLAB开发环境中对工程进行编译链接和进行调试。
三、实验准备:
工作模式:
(1)定时器模式
•定时器的输入时钟由内部系统时钟(FOSC/4)提供。
•当使能为该模式时,对于1:1 的预分频器设置,定时器的计数值在每个指令周期都会加1。
(2)使用外部时钟输入的同步计数器模式
•定时器的时钟源由外部提供
•所选的定时器在TxCK 引脚上的输入时钟的每个上升沿进行加1 计数。
对外部时钟高电平和低电平有最短时间的要求。通过在一个指令周期内的两个不同时间对外部时钟信号进行采样,可以实现外部时钟源与器件指令时钟的同步。
(3)使用外部时钟输入的A 类型定时器异步计数器模式
•通过使用连接到TxCK 引脚的外部时钟源, A 类型时基能够在异步计数模式下工作。
•外部时钟输入不与器件系统时钟源同步。该时基继续进行与内部器件时钟异步的递增计数。
(4)门控时间累加模式
当加在TxCK 引脚上的信号出现上升沿时,门控控制电路开始工作;当加在TxCK 引脚上的信号出现下降沿时,门控控制电路终止工作。当外部门控信号为高电平时,对应的定时器将进行递增计数。
引脚状态从高电平到低电平的转变会将TxIF 中断标志位置1。
定时中断:
•根据工作模式的不同, 16 位定时器可以在发生周期匹配或外部门控信号的下降沿出现时产生中断。 即TxIF 位置1。
•TxIF 位必须用软件清零。
•通过对应的定时器中断使能位TxIE,可以将定时器使能为中断源。
•为了使该定时器成为中断源,必须对中断优先级位(TxIP<2:0>)写入非零值
三、 实验过程及结果:
实验源程序:
#include unsigned int Led = 1; void InitializeTMR1() { TMR1 = 0; //定时器1计数寄存器TMR1=0 T1CON = 0x0030; //关闭定时器,使用内部时钟,预分频比为1:256 PR1 =0x1c20; //定时器Timer1周期寄存器值1s IFS0bits.T1IF = 0; //清除TMR1的中断标志 IPC0bits.T1IP = 7; //中断优先级为7 IEC0bits.T1IE = 1; //使能中断 } void __attribute__((__interrupt__)) _T1Interrupt(void) { TMR1=0; IFS0bits.T1IF = 0; //清定时器中断标志 Led = Led<<1; if(Led == 0x40) Led = 1; } int main() { InitializeTMR1(); TRISE = 0x00; T1CONbits.TON = 1; while(1) { PORTE =Led; } } 编写程序,编译通过兵在实验板上实现循环点亮LED灯,并设置时间间隔为1s,通过菜单Debuger>stopwatch调出秒表来观察执行时间,以验证设置时间间隔是否正确,试验中,我们还可以通过修改程序来修改所设置的时间间隔,以满足不同需求。 实验四 UART通用异步收发器实验 一、实验内容: 利用UART通用异步收发器实现数据的异步收发。 二、实现目的: 进步一掌握PIC单片机机构及UART通用异步收发器功能,学习通过UART异步收发器完成数据的异步发射与接收。用C语言编写外部程序,并在MPLAB开发环境中对工程进行编译链接和进行调试。 三、实验要求 •了解掌握PIC单片机的结构和UART异步收发器功能。 •应熟练掌握MPLAB开发环境的使用方法。 •熟练掌握PIC单片机的程序编写方法。 •掌握MPLAB IDE硬件调试的技巧。 三、实验准备: 数据传送的方向: ①单工 1)两端仅有发送器或接收器、一个通道 2)仅能进行一个方向的传送 ②半双工 1)两端具有发送器和接收器、但只有一个通道 2)同一时刻仅能进行一个方向的传送 3)可交替的进行双向数据传送 ③全双工 1)两端具有发送器和接收器、且具有两个通道 2)同一时刻能进行双向传送 数据传送的方式: 异步方式: 发送和接收只需短时间内同步的数据传送,传送单元较小(一般为一个Byte)。 同步方式: 发送和接收需长时间内同步的数据传送,传送单元较大(传送一个包)。 通用异步收发器(Universal Asynchronous Receiver Transmitter,UART ): 可以和外设(例如,个人电脑、RS-232 和RS-485 接口)通信的全双工异步系统。 UART 模块的主要特性: • 通过UxTX 和UxRX 引脚进行全双工8 位或9 位数据传输,由低向高发送 • 偶、奇或无奇偶校验选项(对于8 位数据) • 一或两个停止位 • 完全集成的具有16 位预分频器的波特率发生器 • 4 级深度先进先出(First-In-First-Out, FIFO)发送数据缓冲器 • 4 级深度FIFO 接收数据缓冲器 • 奇偶,帧和缓冲溢出错误检测 • 支持带地址检测的9 位模式(第9 位 = 1) • 发送和接收中断 • 用于诊断支持的环回模式 波特率发生器: •UART 模块包含一个专用的16 位波特率发生器(Baud Rate Generator, BRG)。 •UxBRG 寄存器控制一个自由运行的16 位定时器的周期。 四、实验过程及结果: 实验程序: #include unsigned int recdata,txdata; // 接收数据寄存器 void Uart_Initial() { IFS0bits.U1TXIF=0; //复位发送中断标志位 IFS0bits.U1RXIF=0; //复位接收中断标志位 IPC2bits.U1RXIP=1; //收中断优先级:1级 IPC2bits.U1TXIP=1; U1MODE=0x8040; //UART使能,8位数据,无奇偶校验 ,环回 U1STA=0x0000; //当一个字符被传输到发送移位寄存器(发送缓冲器中至少还有一 //个字符)产生中断,当接收到一个字符时,中断标志位置位 U1BRG=0X34; //U1BRG=Fcy/(16*波特率)-1,此处波特率为9600 } void __attribute__((__interrupt__)) _U1TXInterrupt() { while(U1STAbits.TRMT==0); //当为0时,表明移位寄存器没空 IFS0bits.U1TXIF=0; } void __attribute__((__interrupt__)) _U1RXInterrupt() { while(U1STAbits.URXDA==1) { recdata=U1RXREG; // 接收数据并存储 txdata=recdata<<1; U1TXREG=txdata; // 返送接收到的数据 } IFS0bits.U1RXIF=0; // 清接收中断标志 } main() { Uart_Initial(); // 串行通讯初始化子程序 IEC0bits.U1RXIE=1; //UART1收使能 IEC0bits.U1TXIE=1; //UART1发送使能 U1STAbits.UTXEN=1; //UART1使能 U1TXREG=0x01; // 发送初始数据 while(1) {;} // 等待中断,用户也可编写其他应用程序 编写程序,调试编译通过并下载到实验板中,通过菜单来观察实验数据的发出与接收 并返送过程。