嵌入式实验报告3

  |  

文章导航

大三上嵌入式实验报告3

(一)实验目的

通过对各接口模块参考示例程序的学习,了解其工作原理,并能根据实验要求修改或扩充示例程序及功能,掌握处理器各接口模块的使用和编程方法。

(二)实验要求

在前两周工程的基础上,学习并调通例程文件夹里Sample_Buzzle_100LG和Sample_Timer& LED_100LG例程,然后在第2次实验内容基础上添加秒表功能,在数码管上设计显示秒表,通过键盘实现“启动”、从1开始记到10(数码管LED上依次显示1~10),计时到10时启动蜂鸣器,停止计时,数码管LED上显示10;实验后写好实验报告下次实验提交(电子版),实验报告包括实验步骤(必要时截图),附上所添程序段并标明位置,运行结果拍图或视频、工程文件。

(三)程序分析

1.定时中断

A.定时子程序

1
2
3
4
5
6
7
8
9
10
R_TAU0_Create();         //创建定时器
R_TAU0_Channel0_Start(); //Channel 0通道开始计时
R_TAU0_Channel0_Stop(); //Channel 0通道结束计时
在R_TAU0_Create();中,通过修改参数改变分频的倍数,实现不同间隔的定时。
void R_TAU0_Create(void)
{
TAU0EN = 1U; /* supplies input clock */
TPS0 = _0005_TAU_CKM0_FCLK_5 | _0000_TAU_CKM1_FCLK_0 | _0000_TAU_CKM2_FCLK_1 | _0000_TAU_CKM3_FCLK_8;

_0005_TAU_CKM0_FCLK_5中,5时实现1秒定时,6时实现2秒定时。

B.在timer_user中写入中断程序:

1
2
3
4
5
6
7
8
__interrupt static void r_tau0_channel0_interrupt(void)
{
/* Start user code. Do not edit comment generated here */
num = num+1;
if(num>100) num=100;
WDTE = 0xAC;
/* End user code. Do not edit comment generated here */
}

C. 在主循环中,当按下14号键时,开始计时

1
2
3
4
5
 if(num_keyboard==14){sflag=1;}
if(sflag==1)num_10 = num/10;
else {num=0;num_10=0;}
if(bflag==0 && num_10==10)
{ R_PCLBUZ0_Start(); bflag=1; delaya();R_PCLBUZ0_Stop();}

D. 按下13号键时,重新归零

1
if(num_keyboard==13){bflag=0; num=0;num_keyboard=0;sflag=0;}

2.蜂鸣器

A.蜂鸣器子程序

1
2
3
4
R_PCLBUZ0_Start();  //开始鸣响
for(i=0;i<2000;i++) //延时
for(j=0;j<1000;j++);
R_PCLBUZ0_Stop(); //结束鸣响

B.主循环中,按下14号键,计时结束后进行蜂鸣器鸣响,delaya()为一个自定义延时函数,让蜂鸣器鸣响一段时间以指示计时结束。

1
2
3
4
5
if(num_keyboard==14){sflag=1;}
if(sflag==1)num_10 = num/10;
else {num=0;num_10=0;}
if(bflag==0 && num_10==10)
{ R_PCLBUZ0_Start(); bflag=1; delaya();R_PCLBUZ0_Stop();}

C.delaya()子函数

1
2
3
4
5
6
void delaya(void)
{
int i,j;
for(i=0;i<800;i++)
for(j=0;j<800;j++);
}

3.数码管显示

如实验一中的数码管显示,定义leddispaly()函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void leddispaly(void)
{
array_key[0]=num_10%10; //the second char
array_key[1]=num_10/10; //the front char
if(count<2)
{
if(count==0)bit_control=1; //from bit4 to bit1
if(count==1)bit_control=0;
//testvalue1 = Getcode(array_key[count]);
//DIGTAL_PORT = testvalue1;
DIGTAL_LED_D4 = ~bit_control;
DIGTAL_LED_D3 = ~bit_control;


DIGTAL_PORT = Getcode(array_key[count]);

DIGTAL_LED_D4 = bit_control;
DIGTAL_LED_D3 = ~bit_control;
count++;
}
else
{
count=0;

}
}

4.Lcd显示屏、键盘扫描同前两次实验

5.主函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void main(void)
{
hdwinit();
R_PCLBUZ0_Create();
R_TAU0_Create();
R_TAU0_Channel0_Start();
R_MAIN_UserInit();
lcd_init();
num_keyboard=0;
/* Start user code. Do not edit comment generated here */
while (1U)
{
lcd_display(0," 任泽华 "
" 自动化71班 "
" 2171411498 ");
lcd_display(48,date);
Keyboard_scan();
if(num_keyboard==14){sflag=1;}
if(sflag==1)num_10 = num/10;
else {num=0;num_10=0;}
if(bflag==0 && num_10==10){ R_PCLBUZ0_Start(); bflag=1; delaya();R_PCLBUZ0_Stop();}

if(num_keyboard==13){bflag=0; num=0;num_keyboard=0;sflag=0;}

if(num_keyboard!=0)
display();
if(num_keyboard==13){bflag=0; num=0;num_keyboard=0;sflag=0;}
leddispaly();
NOP();
WDTE = 0xAC;
}
/* End user code. Do not edit comment generated here */
}

(四)实验效果(详见视频)

(五)实验总结

这次实验实现了要求的功能,对于中断、定时有了初步的认识。利用中断和定时功能可以完成计时。同时也可以利用蜂鸣器来提醒计时结束。这次实验也修复了之前实验中代码的一些bug,让程序可执行性更好。对于端口的配置进行了学习,时间原因没有做得更加完善,没有通过端口定义来生成代码实现功能,不过新的工程已经在完善当中,相信下一次可以通过自己新建工程来实现功能,而不是拷贝例程的端口代码到自己的端口文件。

另外,在自己的电脑上运行cubesuite+时发现代码生成器丢失了,经过查阅老师提供的学习资料了解到需要在一开始进行设置。在接上板子以后,发现提示要安装驱动,在与同学的交流中也找到了解决方案。这说明善于通过各种方式学习是很重要的,有时候想不明白的问题多看相关资料,多与老师同学交流,才能达到更好的效果。

第三次视频

第三次改进

本站总访问量 您是第位访客