山东大学单片机试题教学文案.docx
《山东大学单片机试题教学文案.docx》由会员分享,可在线阅读,更多相关《山东大学单片机试题教学文案.docx(15页珍藏版)》请在冰豆网上搜索。
![山东大学单片机试题教学文案.docx](https://file1.bdocx.com/fileroot1/2022-12/13/64aab04b-0f42-41a1-a96b-f7610845e7b8/64aab04b-0f42-41a1-a96b-f7610845e7b81.gif)
山东大学单片机试题教学文案
2012山东大学单片机试题
一、试将下面的8051单片机的汇编语言程序转换为实现同样功能的C语言程序。
(15分)
ORG0000H
LJMPMAIN
ORG001BH
LJMPINT_T1
ORG0100H
MAIN:
MOVSP,#70H
MOVTMOD,#10H
MOVTL1,#58H
MOVTH1,#9EH
MOVA,#30
SETBET1
SETBEA;
SETBTR1
SJMP$
INT_T1:
MOVTL1,#58H
MOVTH1,#9EH
DECA
CJNEA,#15,NOT15
MOVP2,#15H
LJMPT1_END
NOT15:
CJNEA,#10,NOT10
MOVP2,#10H
LJMPT1_END
NOT10:
CJNEA,#5,NOT5
MOVP2,#05H
LJMPT1_END
NOT5:
CJNEA,#0,T1_END
MOVP2,#00H
MOVA,#30
T1_END:
RETI
END
二、利用中断技术设计一个故障检测系统。
当出现故障1时,线路1上出现上升沿;当出现故障2时,线路2上出现下降沿;当出现故障3时,线路3上出现上升沿。
没有故障时,线路1和线路3为低电平,线路2为高电平,对应故障源的故障指示灯全熄灭。
出现故障时,对应故障源的故障指示灯闪烁(闪烁周期定为1秒钟,亮0.5秒,灭0.5秒)。
故障消失后,指示灯熄灭。
试用8051单片机和必要的数字逻辑电路实现该故障检测功能,画出电路原理图,并写出相应程序。
(假设单片机外接12MHz的晶体)。
(20分)
三、飞机夜间飞行时,机翼上安装有一个信号灯闪烁,有两种闪烁方式,用一个方式设置开关进行设置,一种是指示灯亮0.1秒,灭0.4秒;另外一种方式是亮0.2秒,灭0.8秒。
试用单片机实现,画出电路图,并编写相应的程序(假设晶振频率为11.0592MHz)(20分)
四、利用8051单片机设计应答方式的通信程序。
通讯参数:
晶振为11.0592MHz,9600,n,8,1。
通讯过程如下:
主机将内存单元中的10个数据发送给从机,并将数据块校验值(将各个数据进行异或,取最后的异或值作为校验值)发给从机。
从机接收数据并进行数据块的校验,若校验正确,则从机发送00H给主机,否则发送0FFH给主机,主机重新发送数据。
(在适当的地方加程序注释)。
(20分)
五、利用MSC1211的A/D构成数据采集系统。
使用模拟通道0对0~10mV的信号进行连续数据采集,采集16次后取得平均值,存放到预先分配好的30个内存单元中,这30个单元存满后,再从第一个单元进行覆盖保存。
写出完整的程序清单(在适当的地方加程序注释)。
(15分)
六、阐述学习“单片机原理及应用”课程的心得体会。
(10分)
山东大学2011-2012学年2学期《单片机原理及应用》课程试卷(A)
参考答案
一.(15分)
#include"reg51.h"//2分
unsignedchari;
voidmain(void)
{
TMOD=0x10;//2分
TL1=0x58;
TH1=0x9E;//2分
i=30;
ET1=1;
EA=1;//2分
TR1=1;
while
(1);
}
voidT1_ISR(void)interrupt3//2分
{
TL1=0x58;
TH1=0x9E;
i--;
switch(i)//4分
{
case15:
P2=0x15;
break;//1分
case10:
P2=0x10;
break;
case5:
P2=0x5;
break;
case0:
i=50;
P2=0;
break;
default:
P2=0xff;
break;
}
}
二.(20分,电路图5分,主程序5分,外部中断函数5分,定时器中断函数5分)
#include"REG51.H"
sbitP10=P1^0;
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;
sbitP14=P1^4;
sbitP15=P1^5;
unsignedchari;//声明计数变量。
unsignedcharFLASH1=0;
unsignedcharFLASH3=0;
unsignedcharFLASH5=0;
voidT0_ISR(void)interrupt1//定时器T0中断函数
{
TL0=0xB0;//重新装入时间常数
TH0=0x3C;
i--;//计数变量减1
if(i==0)
{
if(FLASH1)
P11=~P11;
else
P11=1;
if(FLASH3)
P13=~P13;
else
P13=1;
if(FLASH5)
P15=~P15;
else
P15=1;
i=10;//重新给计数变量赋值
}
}
voidextern0_ISR(void)interrupt0//外部中断函数
{
if(P10==1)
FLASH1=1;
if(P12==0)
FLASH3=1;
if(P14==1)
FLASH5=1;
}
voidmain(void)
{
TMOD=0x01;
TL0=0xB0;
TH0=0x3C;
i=10;//计数变量赋初值
TR0=1;//启动T0计数
IT0=1;//外部中断0为边沿触发方式
EX0=1;//允许外部中断0
ET0=1;//允许T0中断
EA=1;//开放总的中断
P1=0XEE;
while
(1);
}
三.(20分,电路5分;主程序10分:
其中初始化5分,开关判断5分;定时器中断5分)
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitled=P1^0;
sbitsw=P1^1;
bitflag1,flag2;
ucharcount,cnt;
voidmain()
{
sw=1;//置1作为输入口
TMOD=0x01;
TL0=0x00;
TH0=0x4C;//11.0592M,定时50ms
TR0=1;
EA=1;
ET0=1;
flag1=0;//方式一标志位
flag2=0;//方式二标志位
led=1;
while
(1)
{
if(sw==0)//开关按下,方式一
{
if(flag1)
{
led=1;//灭0.4s
}
else
{
led=0;//亮0.1s
}
}
else//开关未按下,方式二
{
if(flag2)
{
led=1;//灭0.8s
}
else
{
led=0;//亮0.2s
}
}
}
}
voidtimer0_isr()interrupt1
{
TL0=0x00;
TH0=0x4C;
count++;
if(count==2)
{
flag1=1;
}
if(count==10)
{
count=0;
flag1=0;
}
cnt++;
if(cnt==4)
{
flag2=1;
}
if(cnt==20)
{
cnt=0;
flag2=0;
}
}
四.(20分,主机10分:
主程序5分,中断服务程序5分;从机10分:
主程序5分,中断服务程序5分)
主机
#include
#defineucharunsignedchar
#defineuintunsignedint
uchardat[10]={0,1,2,3,4,5,6,7,8,9};//自定义10个要发送的数据
uchari=0;
uchartemp;
ucharrx;
bitflag_rx,flag_tx;//接收完成、发送完成标志
sbitgreen=P1^0;//指示灯
sbitred=P1^1;
voidmain()
{
ucharn;
SCON=0x50;//方式一,使能接收
TMOD=0x20;//定时器1工作在方式二
TH1=0xfd;//波特率9600,自动重装载
TL1=0xfd;
TR1=1;
EA=1;
ES=1;//使能串口中断
temp=0x00;
flag_rx=0;
flag_tx=0;
green=1;//指示灯初始状态全灭
red=1;
for(n=0;n<10;n++)
{
temp^=dat[n];//对10个要发送的数据异或,准备好要发送的第11个数据temp
}
SBUF=dat[0];//启动发送第一个数据,进入发送中断
while
(1)
{
if(flag_tx==1)
{
flag_tx=0;
EA=0;//关中断
while(TI!
=1);//查询方式,等待校验和temp发送完毕
TI=0;
EA=1;//重新开放中断,以使能接收中断,接收从机发送来的数据
}
if(flag_rx==1)//主机接收完成,则进入判断环节
{
flag_rx=0;
if(rx==0x00)//发送正确,绿灯亮,红灯灭
{
green=0;
red=1;
}
if(rx==0xff)//发送失败,绿灯灭,红灯亮,并且从头重新发送
{
red=0;
green=1;
SBUF=dat[0];
}
}
}
}
voidserial_isr()interrupt4
{
if(TI)
{
TI=0;
i++;
if(i==10)//判断:
如果前10个数据发送完毕,则发送第11个数据,即校验和temp
{
i=0;
SBUF=temp;
flag_tx=1;//为了防止反复进入发送中断而多次发送11个数据,设置发送完成标志位
}
else
{
SBUF=dat[i];
}
}
if(RI)
{
RI=0;
flag_rx=1;//接收完从机发来的一个数据后,置位接收标志位flag_rx
rx=SBUF;
}
}
从机
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharbuffer[11]={0};
uchari;
bitflag;
voidmain()
{
uchartmp;
ucharn;
SCON=0x50;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
i=0;
flag=0;
tmp=0;
while
(1)
{
if(flag==1)//在循环程序中轮询接收完成标志位flag,如果为1,则表明从机已经接受完11个数据,可以进入判断环节
{
flag=0;
for(n=0;n<10;n++)
{
tmp^=buffer[n];//异或接收到的前10个数据,存入tmp中
}
if(tmp==buffer[10])
//校验和tmp与接收到的第11个数据buffer[10](主机发送的校验和)比较
{
SBUF=0x00;//校验正确,发送0x00
}
else
{
SBUF=0xff;//校验失败,发送0xff
}
}
}
}
voidserial_isr()interrupt4
{
if(RI)
{
RI=0;
buffer[i]=SBUF;//接收从机发送过来的11个数据,包括校验和数据
i++;
if(i==11)
{
i=0;
flag=1;//置位接收完成标志位
}
}
if(TI)
{
TI=0;
}
}
五.(15分)
#include”re1211.h”
#include
#include
#include
#defineLSB298.0232e-9
externlongbipolar(void);
voidmain(void)
{
intdecimation;
unsignedcharnum=0;//数组计数
unsignedlongintresult[30];
unsignedchark;
unsignedlongintj;
decimation=1728;
CKCON=0;
USEC=10;
ACLK=9;
ADMUX=0x08;//AINO输入,AINCOM做地
DDCON&=0xf7;//启动AD电源
ADCON0=0x37;//PGA=128,VREP=2.5V//5分
ADCON2=decimation&0xff;
ADCON3=(decimation>>8)&0x07;
ADCON1=0x01;//双极性
for(k=0;k<4;k++)//校准
{
while(!
(AIE&0x20));
j=bipolar();
}
while
(1)
{
SSCON=0;//清零求和寄存器
SSCON=0xDB;//16次取平均//5分
while(!
(AIE&0x40));
result[num]=((unsignedlongint)SUMR3<<24)+
((unsignedlongint)SUMR2<<16)+
((unsignedlongint)SUMR1<<8)+
(unsignedlongint)SUMR0;//3分
num++
if(num==30)//已采集完30个
num=0;//从头开始//2分
}
}