1、山东大学单片机试题教学文案2012山东大学单片机试题一、试将下面的8051单片机的汇编语言程序转换为实现同样功能的C语言程序。(15分) ORG 0000H LJMP MAIN ORG 001BH LJMP INT_T1 ORG 0100HMAIN: MOV SP,#70H MOV TMOD,#10H MOV TL1,#58H MOV TH1,#9EH MOV A,#30 SETB ET1 SETB EA; SETB TR1 SJMP $INT_T1 : MOV TL1,#58H MOV TH1,#9EH DEC A CJNE A,#15,NOT15 MOV P2,#15H LJMP T1_E
2、NDNOT15: CJNE A,#10,NOT10 MOV P2,#10H LJMP T1_ENDNOT10: CJNE A,#5,NOT5 MOV P2,#05H LJMP T1_ENDNOT5: CJNE A,#0,T1_END MOV P2,#00H MOV A,#30T1_END: RETI END二、利用中断技术设计一个故障检测系统。当出现故障1时,线路1上出现上升沿;当出现故障2时,线路2上出现下降沿;当出现故障3时,线路3上出现上升沿。没有故障时,线路1和线路3为低电平,线路2为高电平,对应故障源的故障指示灯全熄灭。出现故障时,对应故障源的故障指示灯闪烁(闪烁周期定为1秒钟,亮0
3、.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个数据发送给从机
4、,并将数据块校验值(将各个数据进行异或,取最后的异或值作为校验值)发给从机。从机接收数据并进行数据块的校验,若校验正确,则从机发送00H给主机,否则发送0FFH给主机,主机重新发送数据。(在适当的地方加程序注释)。(20分) 五、利用MSC1211的A/D构成数据采集系统。使用模拟通道0对010mV的信号进行连续数据采集,采集16次后取得平均值,存放到预先分配好的30个内存单元中,这30个单元存满后,再从第一个单元进行覆盖保存。写出完整的程序清单(在适当的地方加程序注释)。(15分)六、阐述学习“单片机原理及应用”课程的心得体会。(10分)山东大学 2011-2012 学年 2 学期 单片机原
5、理及应用 课程试卷 (A)参考答案 一. (15分)#include reg51.h /2分unsigned char i;void main (void) TMOD=0x10; /2分 TL1=0x58; TH1=0x9E; /2分 i=30; ET1=1; EA = 1; /2分 TR1=1; while(1);void T1_ISR (void) interrupt 3 /2分 TL1=0x58; TH1=0x9E; i-; switch(i) /4分 case 15: P2=0x15; break; /1分 case 10: P2=0x10; break; case 5: P2=0x5
6、; break; case 0: i=50; P2=0; break; default: P2=0xff; break; 二.(20分,电路图5分,主程序5分,外部中断函数5分,定时器中断函数5分)#include REG51.Hsbit P10=P10;sbit P11=P11;sbit P12=P12;sbit P13=P13;sbit P14=P14;sbit P15=P15;unsigned char i; /声明计数变量。unsigned char FLASH1=0;unsigned char FLASH3=0;unsigned char FLASH5=0; void T0_ISR
7、(void) interrupt 1 /定时器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; /重新给计数变量赋值 void extern0_ISR(void) interrupt 0 /外部中断函数 if(P10=1) FLASH1=1; if(P12=0) FLASH3=1; if(P14=1) FLASH5=1;
8、void main(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 #define uchar unsigned char#define uint unsigned int sbit led=P10;sbit sw=P11;bit flag1
9、,flag2;uchar count,cnt; void main() 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 void timer0_isr
10、() interrupt 1 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 #define uchar unsigned char#define uint unsigned int uchar dat10=0,1,2,3,4,5,6,7,8,9;/自定义10个要
11、发送的数据uchar i=0;uchar temp;uchar rx;bit flag_rx,flag_tx;/接收完成、发送完成标志 sbit green=P10;/指示灯sbit red=P11; void main() uchar n; 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;n10;n+
12、) temp=datn; /对10个要发送的数据异或,准备好要发送的第11个数据temp SBUF=dat0;/启动发送第一个数据,进入发送中断 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) /发送失败,绿灯灭,红灯亮,并
13、且从头重新发送 red=0; green=1; SBUF=dat0; void serial_isr() interrupt 4 if(TI) TI=0; i+; if(i=10) /判断:如果前10个数据发送完毕,则发送第11个数据,即校验和temp i=0; SBUF=temp; flag_tx=1;/为了防止反复进入发送中断而多次发送11个数据,设置发送完成标志位 else SBUF=dati; if(RI) RI=0; flag_rx=1;/接收完从机发来的一个数据后,置位接收标志位flag_rx rx=SBUF; 从机#include #define uchar unsigned c
14、har#define uint unsigned int uchar buffer11=0;uchar i;bit flag; void main() uchar tmp; uchar n; 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;n8)&0x07;ADCON1=0x01; /双极性for(k=0;k4;k+) /校准 while(!(AIE&0x20); j=bipolar();while(1) SSCON=0; /清零求和寄存器 SSCON=0xDB; /16次取平均 /5分 while(!(AIE&0x40); resultnum=(unsigned long int)SUMR324)+ (unsigned long int)SUMR216)+ (unsigned long int)SUMR18)+ (unsigned long int)SUMR0; /3分 num+ if(num=30) /已采集完30个 num=0; /从头开始 /2分
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1