资源描述
通信工程专业课程设计
实验报告
班级:
姓名:
指导老师:
时间: 2014年10月15
目录
一、实验目的 4
1.实验内容简介 4
2实验主要目的 4
二 实验设备 4
三 实验原理 4
1.LED工作原理 4
2.蜂鸣器工作原理 5
3. 键盘工作原理 6
4. 实验原理及过程 7
四、实验现象 8
五、代码说明 9
1、重要变量和函数的定义 9
2、系统初始化程序 10
3、按键中断函数 10
4、时间生成函数 11
5、LED显示 13
6、蜂鸣器 16
7、按键与LED的链接 16
一、 实验内容
1. 实验内容
利用软件编程实验设计一个数字计时器,完成00:00:00到23:59:59的计时功能,具有保持计数,以及清零的功能。
2. 实验目的
1. 了解并熟练应用ADS v1.2软件;
2. 学会ARM中C语言编程方法;
3. 熟悉微处理器SEP3203的GE01开发板硬件平台,并掌握SEP3203各功能模块的使用及配置方法;
4. 实现数字钟功能,并下载至开发板上进行硬件实现
二、 实验原理
1. 键盘工作原理
如图所示:
该矩阵键盘工作过程如下:
通过软件设置GPIO的PORTE使Pe4-Pe2循环输出为(110,101,011),每次保证只有一位输出为0,Pe7-Pe5配置为中断输入;
无键按下时,Pe7-Pe5=111,Pe4-Pe2=000,此时无中断。
当有键按下时,设5号键按下,此时,B线和F线相连,当Pe4-Pe2的输出为101时,Pe6位输入为低,其他位为高,则GPIO口有中断从Pe6输入,判断为有键按下。
2. 数字钟实验原理
1. 数字钟原理框图:
2. 系统时钟程序流程图:
3. 实现功能说明:
1. 完成00:00:00到23:59:59的计时功能,
2. enter键为计时的停止及启动键;
3. 按下enter键后再按下“*”键后可数据清零;
三、 程序语言说明
1. 定义变量及说明:
定义了3个static变量:key_code,time_value,Enter_Flag , U8 key_code;
U8 Enter_Flag; U8 time_value[8]={0};
key_code:接收键盘的键值;
time_value[8]:用于存储数字钟的时间值;
Enter_Flag:键盘中断的标志位,为1时正常计时,为0时计时停止,等待键盘的相应操作;
2. 使用函数说明:
ModuleRtc():时钟计时函数;
keyhandler():键盘中断处理函数,通过按键控制计时;
LedDisPlay():LED显示函数,主函数中调用;
LedDisPlay(time_value); 用于在数码管上显示时间。
3. 程序语言说明
① 初始化程序
system_init();
keyboardinit();
GPIO_init(); //初始化管脚
ModuleStepMotor();
② counter函数
while(1)
{ int i;
for(i=0;i<5000000;i++);
if(Enter_Flag==0)
ge++;
if(ge>=10)
{ ge=0;
shi++;
if(shi>=6)
{
shi=0;
bai++;
if(bai>=10)
{
bai=0;
qian++;
if(qian>=6)
{
qian=0;
wan++;
if((shiwan!=2)&&(wan>=10))
{
wan=0;
shiwan++;
}
if((shiwan==2)&&(wan>=4))
{
wan=0;
shiwan=0;
}
}
}
}
}
Zhuan_Shu[0]=ge;
Zhuan_Shu[1]=shi;
Zhuan_Shu[2]=16;
Zhuan_Shu[3]=bai;
Zhuan_Shu[4]=qian;
Zhuan_Shu[5]=16;
Zhuan_Shu[6]=wan;
Zhuan_Shu[7]=shiwan;
③ LED display程序
void LedDisPlay(U8 data[])
{
U8* SegData;
Hex2Seg(data, SegData); // 十六进制数字翻译成7段译码值
LedOut(SegData, 1); // 在led上显示
}
void GPIO_Init()
{
*(RP)PORTD_SEL = 0x7; // 设定GPIO口 PD0/1/2 为通用口
*(RP)PORTD_DIR = 0x0; // 设定GPIO口 PD0/1/2 为数据输出
}
void Hex2Seg (U8 hexdata[], U8 * p)
{
int i;
for (i=0;i<8;i++)
{
*p++ = SEGMENT[hexdata[i]]; // 将要显示的数值,通过查找7段译码表翻译成码值
}
}
void LedOut(U8 data[], U32 times)
{
int Segment_i,Bit_i,i;
U8 Segment_Data;
U8 tempData;
for (Bit_i = 0; Bit_i < 8 ;Bit_i++) // 依次串行导入八个led的显示内容
{
Segment_Data=*(data + Bit_i); // 获得一个led显示的码值
for (Segment_i = 0; Segment_i < 8; Segment_i++)// 将7段译码值依次串行输入到GPIO口中
{
tempData=(Segment_Data>>Segment_i) & 0x1; // 得到一段发光管的译码值
*(RP)PORTD_DATA = tempData; // 写入74HC595的输入端,同时拉低PD3
tempData |= 0x04;
*(RP)PORTD_DATA = tempData; // 拉高PD3,触发74HC595,移位寄存
}
//delay(0x100000);
// LedUpdate(); // 显示到LED上
}
LedUpdate(); // 显示到LED上
}
void LedUpdate(void) // 74HC595锁存锁存输出,即led显示使能
{
*(RP)PORTD_DATA |= 0x2;
}
void delay(int cycle)
{
int j = 0;
for(j = 0; j < cycle; j++);
return;
}
④ Interrupt程序
if (key_code) { //排除无效按键
wucb(0x5a, 0); //所有的列线置0
while (((rucb(0x5a)) & intstatus) == 0) { //按键还未抬起
int i;
if (dly++ == 0) {
for (i = 0; i < KEYTIME; i ++);
if(key_code=='E')
Enter_Flag^=1;
if((Enter_Flag==1)&&(key_code=='+'))
{count++;
if(count==2)
count++;
if(count==5)
count++;
if(count>=8)
count=0;
}
}
else {
for(i = 0; i < KEYTIME2; i ++);
printf("key = %c\n", key_code);
}
wucb(0x5a,0x0); // 下一次的判断周期
}
}
⑤ LED与按键的链接
void change_shu(void)
{
if((Enter_Flag==1)&&(key_code!='E')&&(key_code!='*'))
{
switch(count)
{
case 0:
{
ge=key_code;
Zhuan_Shu[0]=ge;
printf("ge = %c\n", ge+'0');
}
break;
case 1:
{
shi=key_code;
Zhuan_Shu[1]=shi;
printf("shi = %c\n", shi+'0');
}
break;
case 2:
break;
case 3:
{
bai=key_code;
Zhuan_Shu[3]=bai;
printf("bai = %c\n", bai+'0');
}
break;
case 4:
{
qian=key_code;
Zhuan_Shu[4]=qian;
printf("qian = %c\n", qian+'0');
}
break;
case 5:
break;
case 6:
{
wan=key_code;
Zhuan_Shu[6]=wan;
printf("wan = %c\n", wan+'0');
}
break;
case 7:
{
shiwan=key_code;
Zhuan_Shu[7]=shiwan;
printf("shiwan = %c\n", shiwan+'0');
}
break;
}
}
if((Enter_Flag==1)&&(key_code=='*'))
{
ge=0;shi=0;bai=0;qian=0;count=0;wan=0;shiwan=0;
Zhuan_Shu[0]=ge;
Zhuan_Shu[1]=shi;
Zhuan_Shu[2]=16;
Zhuan_Shu[3]=bai;
Zhuan_Shu[4]=qian;
Zhuan_Shu[5]=16;
Zhuan_Shu[6]=wan;
Zhuan_Shu[7]=shiwan;
}
}
四、 实验总结
通过我们小组成员的共同努力,这次试验还是达到了理想的效果。这次试验提供了实验参考书里面最基本的程序,要求我们看懂实验程序的整个设计过程的基础上研究编程语言,并设计完成自己的实验。我们开始两天把实验参考书上面的实验都逐个研究,运行了,有成功的也有很多失败的。最后我们确定了实验的设计,选择做数字钟实验。开始我们只是想在计时的基础上加入一个按键控制启动的功能,后来因为程序的编写的错误,没有实现。通过我们认真研究键盘中断实验参考书,以及实验源程序,并尝试修改了实验程序,最后成功实现这个功能,并加上清零的功能。
15
展开阅读全文