山东大学单片机试题教学文案.docx

上传人:b****6 文档编号:5143082 上传时间:2022-12-13 格式:DOCX 页数:15 大小:18.43KB
下载 相关 举报
山东大学单片机试题教学文案.docx_第1页
第1页 / 共15页
山东大学单片机试题教学文案.docx_第2页
第2页 / 共15页
山东大学单片机试题教学文案.docx_第3页
第3页 / 共15页
山东大学单片机试题教学文案.docx_第4页
第4页 / 共15页
山东大学单片机试题教学文案.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

山东大学单片机试题教学文案.docx

《山东大学单片机试题教学文案.docx》由会员分享,可在线阅读,更多相关《山东大学单片机试题教学文案.docx(15页珍藏版)》请在冰豆网上搜索。

山东大学单片机试题教学文案.docx

山东大学单片机试题教学文案

 

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分

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1