1、 通信工程专业课程设计 实验报告 班级: 姓名: 指导老师: 时间: 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
2、的链接 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循环输出
3、为(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. 实现功能说明:
4、 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时计时停止,等待键盘
5、的相应操作; 2. 使用函数说明: ModuleRtc():时钟计时函数; keyhandler():键盘中断处理函数,通过按键控制计时; LedDisPlay():LED显示函数,主函数中调用; LedDisPlay(time_value); 用于在数码管上显示时间。 3. 程序语言说明 ① 初始化程序 system_init(); keyboardinit(); GPIO_init(); //初始化管脚 ModuleStepMotor(); ② counter函数 while(1) { int i; for(i=0;i<50000
6、00;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;
7、 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]=
8、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 为数据输出 }
9、 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的显示内容 {
10、 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 = tempD
11、ata; // 拉高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;
12、} ④ 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((E
13、nter_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(
14、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'); } br
15、eak; 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
16、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: {
17、 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[
18、2]=16; Zhuan_Shu[3]=bai; Zhuan_Shu[4]=qian; Zhuan_Shu[5]=16; Zhuan_Shu[6]=wan; Zhuan_Shu[7]=shiwan; } } 四、 实验总结 通过我们小组成员的共同努力,这次试验还是达到了理想的效果。这次试验提供了实验参考书里面最基本的程序,要求我们看懂实验程序的整个设计过程的基础上研究编程语言,并设计完成自己的实验。我们开始两天把实验参考书上面的实验都逐个研究,运行了,有成功的也有很多失败的。最后我们确定了实验的设计,选择做数字钟实验。开始我们只是想在计时的基础上加入一个按键控制启动的功能,后来因为程序的编写的错误,没有实现。通过我们认真研究键盘中断实验参考书,以及实验源程序,并尝试修改了实验程序,最后成功实现这个功能,并加上清零的功能。 15






