资源描述
考
生
信息
栏
院(系) 班级 姓名 学号
………………………………………………装……………………订……………………线……………………………………
2007 — 2008学年 第 2 学期
物理与机电工程学院 05级 电子信息(本)专业
《微机原理与接口技术》期末试卷(B)
试卷类别:开卷( )闭卷( √ )
考试用时: 120 分钟
考试时间:2008 年 7 月 1 日 下 午
考试地点: 文203
题号
分数
一
二
三
四
五
注意事项
1、学生的院(系)别、专业、班级、姓名、学号必须填写在考生信息栏内指定的位置。
2、学生在考试之前必须填写考试时间和地点。
3、答题字迹要清楚,并保持卷面清洁。
总分
评卷人
复核人
考生考试诚信承诺书
在我填写考生信息后,表示我已阅读和理解《龙岩学院考试纪律与违纪处分办法》的有关规定,承诺在考试中自觉遵规守纪,如有违反将接受处理;我保证在本科目考试中,本人所提供的个人信息是真实、准确的。
考生签名:
考
生
信息
栏
院(系) 班级 姓名 学号
………………………………………………装……………………订……………………线……………………………………
一、 填空题(每空1分,共20分)
1、程序控制下的数据传送,通过CPU执行程序中的I/O指令来完成数据传送,分为 、 和中断传送 。
2、通用微型计算机的硬件是由中央处理器(CPU)、 、 存储器 、输入输出设备及 其组成的。
3、设异步传输时的波特率为115200bps,若每个字符对应一位起始位,七位有效数据位,一位偶校验位,一位停止位,则每秒钟传输的最大字符数是 。
4、中断系统的作用实现 操作、处理异常事故、 。
5、计算机基本接口部件主要有 、 、 、串行通信等。
二、简答题(共10分)
1、为个么要进行按键消除抖动的处理,在软件上通常采用什么样方法消除抖动?(5分)
2、在LPC2138中属于串行通信的部件有哪些?说明它们各自的主要用途。(5分)
二、 设计与应用(共10题,每题10分,任选题目,满分50分)(部分子程序被省略)
1、请对下面程序添加注释(3分),说明其程序功能(3分),并根据你的想法对程序的功能进行部分修改,说明修改后程序功能的变化(4分)。
#include "config.h"
/* LED8~LED1 8个LED分别由P1.25~P1.18控制P1[25:18]控制LED8~LED1,低电平点亮*/
const uint32 LEDS8 = (0xFF << 18);
void DelayNS (uint32 dly)
{ uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<50000; i++);
}
int main (void)
{ uint8 i;
PINSEL2 = PINSEL2 & (~0x08);
IO1DIR = LEDS8;
while (1)
{ for (i=0; i<8; i++)
{ IO1SET = ~(LEDS8 & (7 << (18+i)));
DelayNS(20);
IO1CLR = LEDS8 & (7 << (18+i));
DelayNS(20);
}
}
return 0;}
考
生
信息
栏
院(系) 班级 姓名 学号
………………………………………………装……………………订……………………线……………………………………
2、请对下面程序添加注释(3分),说明其程序功能(3分),画出程序流程图(4分)。
#include "config.h"
uint8 rcv_buf[8]; // UART0数据接收缓冲区
volatile uint8 rcv_new; // 接收新数据标志
void __irq IRQ_UART0 (void)
{ uint8 i;
if ((U0IIR & 0x0F) == 0x04)
rcv_new = 1;
for (i=0; i<8; i++)
{ rcv_buf[i] = U0RBR;
}
VICVectAddr = 0x00;
}
int main (void)
{ UARTMODE set;
set.datab = 8;
set.stopb = 1;
set.parity = 0;
rcv_new = 0;
PINSEL0 = 0x00000005; // 设置I/O连接到UART0
UART0_Init(115200, set);
U0FCR = 0x81; // 使能FIFO,并设置触发点为8字节
U0IER = 0x01; // 允许RBR中断,即接收中断
IRQEnable();
VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断
VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0
VICVectAddr0 = (uint32)IRQ_UART0;
VICIntEnable = 1 << 0x06;
while (1)
{
if (rcv_new == 1)
{ rcv_new =0;
UART0_SendBuf();
}
}
return 0;
}
3、请对下面程序添加注释(3分),说明其程序功能(3分),并根据你的想法对程序的功能进行部分修改,说明修改后程序功能的变化(4分)。
#include "config.h"
#define CAT1025 0xA0 /* CAT1025器件从机地址 */
#define BEEP 1 << 7 /* 蜂鸣器BEEP控制口,P0.7,低电平蜂鸣 */
int main (void)
{ uint8 i;
uint8 data_buf[32];
PINSEL0 = 0x00000000;
PINSEL1 = 0x00000000;
IO0DIR = BEEP;
IO0SET = BEEP;
IRQEnable();
I2C1Init(100000);// I2C初始化,100K
for (i=0; i<10; i++)
data_buf[i] = i + '0';
/* 往起始地址0x00开始写入10个数据 */
I2C_WriteNByte(CAT1025, ONE_BYTE_SUBA, 0x00, data_buf, 10);
//I2C_WriteNByte(CAT1025, 0, 0x00, &i, 1);
DelayNS(10);
for (i=0; i<10; i++)
data_buf[i] = 0;
/* 读回刚才写入的数据 */
I2C_ReadNByte(CAT1025, ONE_BYTE_SUBA, 0x00, data_buf, 10);
for (i=0; i<10; i++)
{if (data_buf[i] != (i + '0'))
{ while (1)
{
IO0SET = BEEP;
DelayNS(20);
IO0CLR = BEEP;
DelayNS(20);
}
}
}
IO0CLR = BEEP;
DelayNS(50);
IO0SET = BEEP;
while (1);
return 0;
}
4、面程序添加注释(3分),说明其程序功能(3分),并根据你的想法对程序的功能进行部分修改,说明修改后程序功能的变化(4分)。
#include "config.h"
#define HC595_CS (1 << 29) // P0.29口为74HC595的片选
uint8 MSPI_SendData(uint8 data)
{ //略
}
/* 此表为LED0~F以及L、P的字模 */
uint8 const DISP_TAB[19] = {
// 0 1 2 3 4 5 6 7 8 9
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,
// A b C d E F
0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E,
// L P C
0xC7, 0x8C,0xC6 };
/* 此表为LPC2131字模 */
// L P C 2 1 3 1
uint8 const LPC2131[7] = { 0xC7, 0x8C, 0xC6, 0xA4, 0xF9, 0xB0, 0xF9};
uint8 rcv_data;
int main (void)
{ uint8 i;
PINSEL0 = 0x00005500; // 设置SPI管脚连接
PINSEL1 = 0x00000000;
IODIR = HC595_CS;
MSPI_Init(); // 初始化SPI接口
while(1)
{ for(i=0; i<16; i++)
{
rcv_data = MSPI_SendData(DISP_TAB[i]); // 发送显示数据
DelayNS(80); // 延时
}
for(i=0; i<7; i++)
{
rcv_data = MSPI_SendData(LPC2131[i]); // 发送显示数据
DelayNS(80); // 延时
}
}
return 0;
}
5、下面程序添加注释(3分),说明其程序功能(3分),并根据你的想法对程序的功能进行部分修改,说明修改后程序功能的变化(4分)。
#include "config.h"
int main (void)
{
PINSEL0 = 2 << 24; // P0.12连接匹配1.0
T1PR = 99; // 分频
T1MCR = 0x02; // 设置T1MR0匹配后将T1TC复位
T1EMR = 0x30; // T1MR0匹配后MAT1.0输出翻转
T1MR0 = 110592/10; // 输出频率周期控制
T1TCR = 0x03; // 启动并复位T1TC
T1TCR = 0x01;
while (1);
return 0;
}
6、下面程序添加注释(3分),说明其程序功能(3分),并根据你的想法对程序的功能进行部分修改,说明修改后程序功能的变化(4分)。
#include "config.h"
#include "music.h"
/* 歌曲曲谱 - 虹彩妹妹*/
const uint32 HCMM[] =
{//略
};
/* 歌曲节拍 */
const uint32 HCMM_L[] =
{//略
};
int main (void)
{ uint8 i;
PINSEL0 = 0x02 << 14; // P0.7选择PWM2功能
PWMPR = 0x00; // 不分频,计数频率为Fpclk
PWMMCR = 0x02; // 设置PWMMR0匹配时复位PWMTC
PWMPCR = 0x0400; // 允许PWM2输出,单边PWM
PWMMR0 = Fpclk / 1000;
PWMMR2 = PWMMR0 / 2; // 50%占空比
PWMLER = 0x05; // PWM0和PWM2匹配锁存
PWMTCR = 0x02; // 复位PWMTC
PWMTCR = 0x09; // 启动PWM输出
while(1)
{
for(i = 0; i < sizeof(HCMM); i++)
{
PWMMR0 = Fpclk / HCMM[i]; // 设置输出频率
PWMLER = 0x05; // 更新匹配值后,必须锁存
Delay(HCMM_L[i]); // 延时,控制播放速度
}
}
return 0;
}
7、下面程序添加注释(3分),说明其程序功能(3分),并根据你的想法对程序的功能进行部分修改,说明修改后程序功能的变化(4分)。
#include "config.h"
int main (void)
{ uint32 ADC_Data;
char str[20];
PINSEL0 = 0x00000005; // 管脚连接串口
PINSEL1 = 1 << 28; // P0.30连接到AD0.3
UART0_Init();
/* 进行ADC模块设置 */
AD0CR = (1 << 3) | // SEL=8,选择通道3
((Fpclk / 1000000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
(0 << 16) | // BURST=0,软件控制转换操作
(0 << 17) | // CLKS=0, 使用11clock转换
(1 << 21) | // PDN=1,正常工作模式
(0 << 22) | // TEST1:0=00,正常工作模式
(1 << 24) | // START=1,直接启动ADC转换
(0 << 27); // 直接启动ADC转换时,此位无效
DelayNS(10);
ADC_Data = AD0DR; // 读取ADC结果,并清除DONE标志位
while (1)
{
AD0CR |= 1 << 24; // 进行第一次转换
while ((ADDR & 0x80000000) == 0); // 等待转换结束
AD0CR |= 1 << 24;
while ((AD0DR & 0x80000000) == 0);
ADC_Data = AD0DR;
ADC_Data = (ADC_Data >> 6) & 0x3ff;
ADC_Data = ADC_Data * 2480; // 参考电压经过3/4分压
ADC_Data = ADC_Data / 1024;
sprintf(str, "%4d mV VIN3", ADC_Data);
ISendStr(0,0,0x30,str);
}
return 0;
}
8、下面程序添加注释(3分),说明其程序功能(3分),并根据你的想法对程序的功能进行部分修改,说明修改后程序功能的变化(4分)。
#include "config.h"
#define BEEP 1 << 7 // P0.7控制蜂鸣器
void __irq RTC_Int(void)
{
if((IO0SET & BEEP) == 0) IO0SET = BEEP;
else IO0CLR = BEEP;
ILR = 0x01; // 清除RTC增量中断标志
VICVectAddr = 0; // 向量中断结束
}
int main (void)
{
IO0DIR = BEEP;
IO0SET = BEEP;
IRQEnable();
/* RTC初始化 */
PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
CIIR = 0x01; // 设置秒值的增量产生一次中断
ILR = 0x03; // 清除RTC增量和报警中断标志
CCR = 0x01; // 启动RTC
VICIntSelect = 0x00; // 设置所有中断连接IRQ中断
VICVectCntl0 = 0x20 | 13; // 分配通道0
VICVectAddr0 = (int)RTC_Int; // 设置中断服务程序地址
VICIntEnable = (1 << 13); // 使能RTC中断
while(1); // 等待中断
return 0;
}
9、下面程序添加注释(3分),说明其程序功能(3分),并根据你的想法对程序的功能进行部分修改,说明修改后程序功能的变化(4分)。
#include "config.h"
#define LED1 1 << 18 // P0.18控制LED1
#define KEY1 1 << 16 // P0.16
#define KEY2 1 << 17 // P0.17
#define BEEP 1 << 7 // P0.7控制蜂鸣器
int main(void)
{ uint32 i,j;
PINSEL0 = 0x00000000;
PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]连接GPIO
IO0DIR = BEEP;
IO1DIR = LED1;
IO0SET = BEEP;
while(( WDMOD & 0x04 ) == 0x04) // 判断看门狗超时标志
{
for(j = 0; j < 0xFFFFF; j++);
if((IO0SET & BEEP) == 0)
{ IO0SET = BEEP;
if((IO0PIN & KEY2) == 0)
WDMOD = 0x00; // 如果KEY2按下,则软件清零看门狗超时标志位
}
else IO0CLR = BEEP; // 蜂鸣器鸣叫
}
/* 如果没有发生看门狗复位或者看门狗超时标志已经清除,则初始化看门狗 */
WDTC = 0xff000; // 设置看门狗定时器参数
WDMOD = 0x03; // 设置看门狗模式:中断且复位
WDFEED = 0xAA; // 第一次喂狗启动WDT
WDFEED = 0x55;
/* 正常情况下,闪烁LED1 */
while(1)
{ /* 用按键模拟导致无法周期性喂狗的意外情况 */
while((IO0PIN & KEY1) == 0); // 如果按键1按下,就停止喂狗
for(j = 0; j < 0xFF; j++) // LED1闪烁周期
{
for(i = 0; i < 0x0FFF; i++); // 喂狗周期
WDFEED = 0xAA; // 喂狗时序
WDFEED = 0x55;
}
/* 闪烁LED1 */
if((IO1SET & LED1) == 0) IO1SET = LED1;
else IO1CLR = LED1;
}
return 0;
}
10、下面程序添加注释(3分),说明其程序功能(3分),并根据你的想法对程序的功能进行部分修改,说明修改后程序功能的变化(4分)。
#include "config.h"
#define BEEP 1 << 7 // P0.7控制蜂鸣器
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :演示外部中断唤醒掉电的CPU,但不产生中断
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
int main (void)
{ PINSEL0 = 0x00000000; // 管脚连接GPIO
PINSEL1 = 0x00000001; // P0.16连接EINT0
IO0DIR = BEEP; // 设置BEEP控制口为输出,其余输入
EXTWAKE = 0x01; // 外部中断0唤醒芯片
EXTINT = 0x01; // 清除EINT0中断标志
IO0SET = BEEP;
while (1)
{
PCONP = 0x00; // 关闭定时器、RTC、UART等功能部件
PCON = 0x02; // 系统进入掉电模式
/* 当系统被唤醒后,取反BEEP控制 */
if ((IO0SET & BEEP) == 0) IO0SET = BEEP;
else IO0CLR = BEEP;
EXTINT = 0x01; // 清除EINT0中断标志
}
return (0);
}
三、 综合设计(满分30分)
要求:1、在该综合设计项目中必需包含3种以上接口部件,项目由自己确定。
评分:方案设计(含必要的电路图)10分,流程图10分,程序10分。
4、考
生
信息
栏
院(系) 班级 姓名 学号
………………………………………………装……………………订……………………线……………………………………
展开阅读全文