接口技术实验大全.docx
- 文档编号:15797533
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:27
- 大小:118.52KB
接口技术实验大全.docx
《接口技术实验大全.docx》由会员分享,可在线阅读,更多相关《接口技术实验大全.docx(27页珍藏版)》请在冰点文库上搜索。
接口技术实验大全
1、I/O接口实验:
用某个端口的一个引脚连接小灯,一个引脚连接开关(也可以是另一个端口的引脚),通过开关开合通过MCU控制小灯亮暗。
用B口的19号引脚连接小灯,用E口的5号引脚连接开关,开关通过MCU控制小灯,开关向上拨,小灯亮,开关向下拨,小灯暗,放在主循环中,则形成开关随时开,小灯随时亮的效果。
C/C++语言设计:
#include"include.h"//包含总头文件
intmain(void)
{
//
(1)计算给出PORTB19、PORTE5的引脚控制寄存器地址
//POTB端口的引脚控制寄存器基地址为0x4004A000u(后缀u表示无符号数)
//POTE端口的引脚控制寄存器基地址为0x4004D000u(后缀u表示无符号数)
volatileuint_32*portB_ptr=(uint_32*)0x4004A000u;
//PORTB19、PORTE5的引脚控制寄存器地址=基地址+偏移量
volatileuint_32*portB_PCR_19=portB_ptr+19;
volatileuint_32*portE_PCR_5=portB_ptr+5;
//
(2)计算给出PORTB的数据方向寄存器、输出反转寄存器地址
//POTB端口(作为GPIO功能)的基地址为0x400FF040u
//POTE端口(作为GPIO功能)的基地址为0x400FF100u
volatileuint_32*gpioB_ptr=(uint_32*)0x400FF040u;
//PORTB的数据方向寄存器地址=基地址+偏移量
volatileuint_32*portB_PDDR=gpioB_ptr+5;
//PORTB的输出寄存器地址=基地址+偏移量
volatileuint_32*portB_PDOR=gpioB_ptr+0;
//PORTB的数据输入寄存器地址=基地址+偏移量
volatileuint_32*gpioE_ptr=(uint_32*)0x400FF100u;
volatileuint_32*portE_PDDR=gpioE_ptr+5;
volatileuint_32*portE_PDIR=gpioE_ptr+4;
//(3)设置PORTB19、PORTE5引脚为GPIO引脚,即令相应引脚控制寄存器的10-8位(MUX)字段为001
*portB_PCR_19=0x00000100;
*portE_PCR_5=0x00000100;
//(4)通过PORTB的方向寄存器,定义PORTE5为输入、PORTB19引脚输出
*portE_PDIR&=~(1<<5);//初始化为低电平0
*portB_PDDR|=(1<<19);//定义此引脚为输出引脚
for(;;)
{
if(BGET(5,*portE_PDI)==0){*portB_PDO&=~(1<<19);}
else{*portB_PDO|=(1<<19);}
}
return0;
}
2.TTL转USB串口通信实验
在演示实验的基础上,利用串口调试程序发送“1”,小灯亮,发送“0”,小灯暗。
小灯的连接是用B口的9号引脚和一个小灯接口连接。
#include "includes.h"//包含总头文件
int main(void)
{
//1.声明主函数使用的局部变量
uint_32run_counter;//主循环次数计数器
//2.关总中断
enter_critical();//进入临界区
//3.初始化模块
light_init(LIGHT_PORT,LIGHT_PIN_BLUE,LIGHT_ON);//蓝灯初始化
uart_init(UART_1,BUSCLK,9600);//串口1、2使用总线时钟24000Khz
uart_send_string(UART_1,"HelloUart_1!
\r\n");//串口发送初始化提示
//4.全局变量及主函数局部变量赋初值
run_counter=0;//运行计数器
//5.使能模块中断及总中断
uart_enable_re_int(UART_1);//使能串口1接收中断
init_critical();//开总中断
//进入主循环
//主循环开始
============================================================= for(;;)
{
run_counter++;//主循环次数计数器+1
if(run_counter>RUN_COUNTER_MAX)
{
run_counter=0;//主循环次数计数器清0
}
//主循环结束=============================================================
return0;
}
//========================中断函数服务例程===============================
//串口1接收中断服务例程
void isr_uart1_re(void)
{
uint_8ch;
uint_8flag=1;
enter_critical();
ch=uart_re1(UART_1,&flag);
if(0==flag)
{
uart_send1(UART_1,ch);}
if(ch=='1')light_control(LIGHT_PORT,LIGHT_PIN_BLUE,LIGHT_ON);
if(ch=='0')light_control(LIGHT_PORT,LIGHT_PIN_BLUE,LIGHT_OFF);
exit_critical();
}
3.串口中断接收通信实验
发送数据用于控制实验箱中的一个小灯,如:
发送“OPEN”,小灯亮,发送“CLOS”,小灯暗。
(或者利用串口调试程序发送发送“OPEN”,小灯亮,发送“CLOS”,小灯暗)
小灯的连接是用B口的9号引脚和一个小灯接口连接。
实验一:
不使用中断
重要代码《main.c》:
#include"includes.h"//包含总头文件
intmain(void)
{
//1.声明主函数使用的局部变量
uint_32run_counter;//主循环次数计数器
//2.关总中断
enter_critical();//进入临界区
//3.初始化模块
light_init(LIGHT_PORT,LIGHT_PIN_BLUE,LIGHT_ON);//蓝灯初始化
uart_init(UART_0,MCGIRCLK,9600);//串口0时钟MCGIRCLK(4000Khz)
uart_init(UART_1,BUSCLK,9600);//串口1、2使用总线时钟24000Khz
uart_init(UART_2,BUSCLK,9600);//波特率使用9600
uart_send_string(UART_0,"HelloUart_0!
\r\n");//串口发送初始化提示
uart_send_string(UART_1,"HelloUart_1!
\r\n");
uart_send_string(UART_2,"HelloUart_2!
\r\n");
//4.全局变量及主函数局部变量赋初值
run_counter=0;//运行计数器
//5.使能模块中断及总中断
//uart_enable_re_int(UART_0);//使能串口0接收中断!
!
//uart_enable_re_int(UART_1);//使能串口1接收中断!
!
//uart_enable_re_int(UART_2);//使能串口2接收中断!
!
/////////////////////////////////////////////////////////////////////将模块中断给关掉,这样就可以不调用中断函数,那么就是在主函数中
进行调用字符和发送函数进行字符的接收和发送/////////////////////////////////////////////////////////////////////////////////////////
init_critical();//开总中断
//进入主循环
//主循环开始=============================================================
for(;;)
{
uint_8fp=0;
uint_8ch;
run_counter++;//主循环次数计数器+1
ch=uart_re1(UART_1,&fp);//////调用串行接收字符来接收一个字节
if(0==fp)//////对接收字符来进行判断,控制MCU板上的小灯的亮暗
{
if(ch=='1')
light_control(LIGHT_PORT,LIGHT_PIN_BLUE,LIGHT_ON);
else
light_control(LIGHT_PORT,LIGHT_PIN_BLUE,LIGHT_OFF);
uart_send1(UART_1,ch);//////对接收的字符进行发送
//////这个是终态
}
//主循环结束=============================================================
return0;
}
实验二:
发送字符串
在中断程序中的串口中断的操作:
//串口1接收中断服务例程
voidisr_uart1_re(void)
{
uint_8a[4];//通过数组来接收字节
uint_8flag=1;
staticuint_8index=0;//收到的个数
enter_critical();
if(index>3)index=0;//四个字节进行一次接收。
a[index]=uart_re1(UART_1,&flag);//接收的字节存放到数组中
if(0==flag)
{uart_send1(UART_1,a[index]);//进行字节的发送
index++;
}
if(a[0]=='o'&&a[1]=='p'&&a[2]=='e'&&a[3]=='n')
{//判断每接收的四个字节是否满足亮灯的条件。
light_control(LIGHT_PORT,LIGHT_PIN_BLUE,LIGHT_ON);
}elseif(a[0]=='c'&&a[1]=='l'&&a[2]=='o'&&a[3]=='s'){
light_control(LIGHT_PORT,LIGHT_PIN_BLUE,LIGHT_OFF);
}
exit_critical();
}
4.键盘中断实验
要求按下的一个键的键值和键面定义值(键的ASCII码值)通过串口在PC方软件界面显示。
当键值被按下时,高端虚拟键盘被按下,或者在高端PC机中显示对应按键值。
键盘的数据线分别接在MCUG口的0-4号引脚、D口的2/3/7号引脚。
3、实验代码
I、主程序(main函数)
#include"includes.h"//包涵总头文件
intmain(void)
{
//1.声明主函数使用的局部变量
uint_8*g_DispalyInit;
//2.关总中断
enter_critical();
//3.初始化串口模块
//uart_init(UART_0,MCGIRCLK,9600);//串口0时钟MCGIRCLK(4000Khz)
//uart_init(UART_1,BUSCLK,9600);//串口1、2使用总线时钟24000Khz
uart_init(UART_2,BUSCLK,9600);//波特率使用9600
//uart_send_string(UART_0,"HelloUart_0!
\r\n");//串口发送初始化提示
//uart_send_string(UART_1,"HelloUart_1!
\r\n");
uart_send_string(UART_2,"HelloUart_2!
\r\n");
//全局变量及主函数局部变量赋初值
//run_counter=0;//运行计数器
//使能模块中断及总中断
//uart_enable_re_int(UART_0);//使能串口0接收中断
//uart_enable_re_int(UART_1);//使能串口1接收中断
uart_enable_re_int(UART_2);//使能串口2接收中断
//4.初始化底层模块
LEDInit();//LED初始化
LCDInit();//LCD初始化
KBInit();//键盘初始化
tpm_init(TPM0,TPM_CLKSRC_PLL,1000);//初始化TPM模块,1ms中断一次
//5.缓冲区赋值
g_DispalyInit=(uint_8*)"WaitReceiving..Soochow2013.01.";
//6.开中断
tpm_enable_int(0);
init_critical();
//7.lcd显示初始字符
LCDShow(g_DispalyInit);
//===========================================================================
for(;;)
{
}
//===========================================================================
return0;
}
II、键盘中断程序
#include"includes.h"
voidtpm0_isr(void)
{
staticuint_32TPMCounter=0;//计时器
uint_8value;//键盘变量
staticuint_8LEDindex=0;//位选口声明
uint_8LEDDataBuffer[4];//LED显示缓冲区
uint_8i;
//LED缓冲区赋值
LEDDataBuffer[0]='0';
LEDDataBuffer[1]='2';
LEDDataBuffer[2]='3';
LEDDataBuffer[3]='5';
//LCD显示缓冲区,其中.表示按下的数字
uint_8kbv[32]="Thekeyboardyoujustinputis.";
if((TPM_SC_REG(TPM0_BASE_PTR)&TPM_SC_TOF_MASK)==TPM_SC_TOF_MASK)
{
TPMCounter++;
}
BSET(TPM_SC_TOF_SHIFT,TPM_SC_REG(TPM0_BASE_PTR));//中断置标志位写1清0
//处理LED部分
LEDindex++;//位选位+1
if(LEDindex>=4)LEDindex=0;//大于4位选口置0
i=LEDchangeCode(LEDDataBuffer[LEDindex]-'0');//转码
LEDshow1(LEDindex,i);//显示LED
if(TPMCounter>100)
{
TPMCounter=0;
//键盘得到扫描值
value=KBScanN
(2);
//扫描键值,存于value中
if(KBDef(value)!
=0xff)//发送键值
{
//修改.成为按键值
kbv[31]=KBDef(value);
uart_send1(UART_1,kbv[31]);
//通过LCD显示出来
LCDShow(kbv);
}
}
}
5.数码管(LED)实验
1、用高端虚拟LED界面接收MCU返回的数据,与LED硬件同步显示数字。
且可以通过高端程序发送数字来修改LED所显示的数字。
2、结合定时器实验,数码管显示分钟和秒,一共四位数,每隔1秒进行变化,同时送至PC机器进行显示。
且可以通过高端程序发送数字来修改时间。
LED的数据线接在MCUG口的0_4号引脚,位选线分别接在D口的2/3/7号引脚。
3.编程
I、Main主函数
//说明见工程文件夹下的Doc文件夹内Readme.txt文件
#include"includes.h"//包涵总头文件
intmain(void)
{
//初始化时间数组,时分秒。
。
time[0]=0;
time[1]=0;
time[2]=0;
//1.声明主函数使用的局部变量
uint_8*g_DispalyInit;
//2.关总中断
enter_critical();
//4.初始化底层模块
LEDInit();//LED初始化
LCDInit();//LCD初始化
KBInit();//键盘初始化
tpm_init(TPM0,TPM_CLKSRC_PLL,1000);//初始化TPM模块,1ms中断一次
//每隔1ms就调用一次中断函数isr.c文件。
。
。
/////////////
//5.缓冲区赋值
g_DispalyInit=(uint_8*)"WaitReceiving..Soochow2013.01.";
//6.开中断
tpm_enable_int(0);
init_critical();
//7.lcd显示初始字符
LCDShow(g_DispalyInit);
//=====================================================================
for(;;)
{
}
//=====================================================================
return0;
}
II、Isr.c文件
//=====================================================================
//文件名称:
isr.c
//功能概要:
中断底层驱动构件源文件
//版权所有:
苏州大学飞思卡尔嵌入式中心()
//更新记录:
2013-03-12V1.2
//=====================================================================
#include"includes.h"
voidtpm0_isr(void)
{
staticuint_32TPMCounter=0;//计时器
//uint_8value;//键盘变量
staticuint_8LEDindex=0;//位选口声明
uint_8LEDDataBuffer[4];//LED显示缓冲区
uint_8i;
staticuint_8num=0;
//LED缓冲区赋值
if(num==0){
LEDDataBuffer[0]='0';
LEDDataBuffer[1]='0';
LEDDataBuffer[2]='0';
LEDDataBuffer[3]='0';
}
//LCD显示缓冲区,其中.表示按下的数字
//uint_8kbv[32]="Thekeyboardyoujustinputis.";
if((TPM_SC_REG(TPM0_BASE_PTR)&TPM_SC_TOF_MASK)==TPM_SC_TOF_MASK)
{
TPMCounter++;
}
BSET(TPM_SC_TOF_SHIFT,TPM_SC_REG(TPM0_BASE_PTR));//中断置标志位写1清0
//处理LED部分
if(TPMCounter>1000)
{
TPMCounter=0;
time[0]++;
if(time[0]>60)
{
time[0]=0;
time[1]+=1;
if(time[1]>60)
{
time[1]=0;
time[2]+=1;
}
}
LEDDataBuffer[3]=time[0]%10;
LEDDataBuffer[2]=time[0]/10;
LEDDataBuffer[1]=time[1]%10;
LEDDataBuffer[0]=time[1]/10;
}
//要不断的进行LED的显示数值的刷新。
。
LEDindex++;//位选位+1
if(LEDindex>=4)LEDindex=0;//大于4位选口置0
i=LEDchangeCode(LEDDataBuffer[LEDindex]-'0');//转码
LEDshow1(LEDindex,i);//显示LED
num++;
/*if(TPMCounter>100)
{
TPMCounter=0;
//键盘得到扫描值
value=KBScanN
(2);
//扫描键值,存于value中
if(KBDef(value)!
=0xff)//发送键值
{
//修改.成为按键值
kbv[31]=KBDef(value);
uart_send1(UART_1,kbv[31]);
//通过LCD显示出来
LCDShow(kbv);
}
}*/
}
6.液晶LCD显示实验
接在MCU的LCD上显示PC当前时间,格式形如“时:
分:
秒”。
时间通过串口SCI通信取PC方的时间来显示。
1、软件设计
编程:
(1)main
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 接口 技术 实验 大全