资源描述
试 题 答 案
2006 ——2007 学年第 1 学期
课程名称:单片机及其应用 使用班级:电子、通信、控制2004级
命题系别:电子基础教学实验中心 命题人:赵建
一、分析简答题(17分)
2、0XA000或A000H
二、程序分析题(8分)
①、定时方式2 (4分)
②、400us或0.4ms (4分)
三、编程题(75分)
1、
①、程序初始化正确(设置I/O口的初值)
②、程序结构正确(基本的程序框架正确合理)
③、程序结果正确(循环的结果——灯亮灭的情况正确)
2.1、
①、程序初始化正确(中断的设置等正确)
②、按键检测正确(中断服务程序书写正确)
③、数码管结果正确(总线扩展数码管操作正确)
④、整体结果正确(程序结构及加减数据正确)
2.2、
①、程序初始化正确(中断的设置等正确)
②、按键检测正确(中断服务程序书写正确)
③、数码管结果正确(I/O口扩展数码管操作正确)
④、整体结果正确(程序结构及加减数据正确)
3、
①、定时器初始化正确(TMOD,中断,定时器初值正确)
②、程序结构正确(程序结构,中断服务程序编写正确)
③、程序结果及数据存放正确(频率算法和结构存放的地址正确)
4、
①、程序初始化正确(总线地址正确)
②、ADC0804操作正确(启动AD转换数据正确)
③、程序结果及数据存放正确(转换结束检测数据存放地址正确)
5、
①、程序初始化正确(定时器及串口初始化正确)
②、数据发送操作正确(发送数据出正确)
③、程序结果整体正确(程序框架正确合理)
附:程序范例,只做评分参考使用,由于思维方式不同,所以,程序的判分以上面的评分细则为准,只要功能正确,就判为正确程序。
1、
#include<reg52.h>
void Delay()
{
unsigned int i=100;
while(i--);
}
void main()
{
unsigned char Dat = 0x7f;
unsigned char i = 8;
P0 = 0x0ff;
while(1)
{
if(i--)
{
P0 = Dat;
Delay();
Dat >>= 1;
Dat += 0x80;
}
else
{
Dat = 0x7f;
i = 8;
}
}
}
2、(1)
#include<reg52.h>
#include<absacc.h>
/*******************************
总线地址定义区
********************************/
#define LED_DIG XBYTE[0x9000] //定义数码管的段选总线地址
#define LED_SEL XBYTE[0x8000] //定义数码管的位选总线地址
/*******************************
全局变量定义区
********************************/
unsigned char code DisCode[] = {0x0C0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0xFF};
//共阳极数码管码表,定位在ROM中
unsigned char Counter = 30; //定义一全局变量
/********************************
显示延时
*********************************/
void Delay()
{
unsigned char i = 10;
while(i--);
}
/********************************
带参数传递的显示程序
*********************************/
void Display(unsigned char *Dat)
{
LED_DIG = DisCode[*Dat]; //送段选
LED_SEL = 0x01; //选通第一个数码管
Delay();
LED_SEL = 0; //消隐
LED_DIG = DisCode[*(Dat+1)];
LED_SEL = 0x02; //选通第二个数码管
Delay();
LED_SEL = 0;
}
/********************************
主函数
*********************************/
void main(void)
{
unsigned char Disbuf[] = {0,3}; //存放欲显示的数据
IT0 = IT1 = 1; //开中断
EX0 = EX1 = 1;
EA = 1;
while(1)
{
Disbuf[0] = Counter%10; //十六进制数分解成十进制数进行显示
Disbuf[1] = Counter/10;
Display(Disbuf);
}
}
/********************************
外部中断0的中断服务子程序
*********************************/
void INT0_Ser() interrupt 0 //循环加操作
{
if(Counter++>=59)
Counter = 0;
}
/********************************
外部中断1的中断服务子程序
*********************************/
void INT1_Ser() interrupt 2 //循环减操作
{
if(Counter--<=0)
Counter = 59;
}
(2)
#include<reg52.h>
/*******************************
总线地址定义区
********************************/
sbit LED_DIG = P1^3;
sbit LED_COM = P1^2;
unsigned char code DisCode[] = {0x0C0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0xFF};
//共阳极数码管码表,定位在ROM中
unsigned char Counter = 30;
/********************************
显示延时
*********************************/
void Delay(void)
{
unsigned char i = 10;
while(i--);
}
/********************************
带参数传递的显示程序
*********************************/
void Display(unsigned char Dat[2])
{
static unsigned char i = 0;
unsigned LED_Posit = 0x10;
for(i = 0;i<2;i++)
{
P0 = DisCode[Dat[i]]; //送段选
LED_DIG = 1;
LED_DIG = 0;
P0 = LED_Posit; //选通一个数码管
LED_COM = 1;
LED_COM = 0;
Delay();
P0 = 0; //消隐
LED_COM = 1;
LED_COM = 0;
LED_Posit<<=1;
}
}
/********************************
主函数
*********************************/
void main(void)
{
unsigned char Disbuf[] = {0,3}; //存放欲显示的数据
IT0 = IT1 = 1; //开中断
EX0 = EX1 = 1;
EA = 1;
while(1)
{
Disbuf[0] = Counter%10; //十六进制数分解成十进制数进行显示
Disbuf[1] = Counter/10;
Display(Disbuf);
}
}
/********************************
外部中断0的中断服务子程序
*********************************/
void INT0_Ser() interrupt 0 //循环加操作
{
if(Counter++>=59)
Counter = 0;
}
/********************************
外部中断1的中断服务子程序
*********************************/
void INT1_Ser() interrupt 2 //循环减操作
{
if(Counter--<=0)
Counter = 59;
}
3、#include<reg52.h>
unsigned char counter = 0;
unsigned char FRQU = 0;
/********************************
主函数
*********************************/
void main()
{
TMOD = 0x51;
TH0 = 50000>>8; //一次定时50ms
TL0 = 50000;
TL1 = 0;
TR0 = TR1 =ET0 = EA = 1;
while(1);
}
/********************************
T0中断服务子函数
*********************************/
void T0_SR() interrupt 1
{
TH0 = 50000>>8; //一次定时50ms
TL0 = 50000;
if(counter++==20) //定时一秒
{
counter = 0;
TR1 = 0;
FRQU = TL1; //读取本次所测频率值
TL1 = 0;
TR1 = 1;
}
}
4、
#include<reg52.h>
#include<absacc.h>
/*******************************
总线地址定义区
********************************/
#define ADC0804 XBYTE[0xB000] //定义ADC0804的总线地址
sbit ADC_INT = P3^2;
/*******************************
全局变量定义区
********************************/
unsigned char ADCTemp = 0; //定义一全局变量
/********************************
延时
*********************************/
void Delay(void)
{
unsigned char i = 30;
while(i--);
}
/********************************
主函数
*********************************/
void main(void)
{
while(1)
{
ADC0804 = 0xFF; //启动A/D转换
Delay();
while ( ADC_INT ); //等待A/D转换完毕
ADCTemp = ADC0804; //读取A/D转换结果
Delay();
}
}
5、
#include<reg52.h>
/***************************
发送数组,只能一个一个的发
****************************/
void Send()
{
unsigned char j;
unsigned char Dat[]={1,2,3,4};
for(j=0;j<4;j++)
{
SBUF = Dat[j];
while(TI==0);
TI = 0;
}
}
/************************************/
void main(void)
{
unsigned char i=0;
TMOD = 0x20;
TH1 = TL1 = -11059200L/12/32/4800;
TR1 = 1;
SCON = 0x50;
Send();
while(1);
}
- 9 -
展开阅读全文