单片机实验考试.docx
- 文档编号:2456116
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:40
- 大小:24.93KB
单片机实验考试.docx
《单片机实验考试.docx》由会员分享,可在线阅读,更多相关《单片机实验考试.docx(40页珍藏版)》请在冰点文库上搜索。
单片机实验考试
1、利用实验箱MCU#3部分电路,完成流水灯程序设计。
#include
#include
sbitP14=P1^4;
voiddelay(unsignedcharx)
{
unsignedinta,b;
for(a=0;a<200;a++)
for(b=0;b } voidmain() { unsignedchard,i; while (1) { d=0xfe; for(i=0;i<8;i++) { P0=d; P14=1; P14=0; delay(50); d=_crol_(d,1); P0=0x00;//消影 } } } 2、在实验箱的MCU#3部分的数码管上显示自己的学号,格式为: “-05xxxxxx”。 #include sbitP1_2=P1^2; sbitP1_3=P1^3; codeledyang[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x84};//0~9,A~F codenumyang[8]={0xc0,0x92,0xc0,0xa4,0xf9,0xa4,0xa4,0xf8};//05021227 codescan_ledyang[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//位选 voiddelay(unsignedcharm) { unsignedchari,j; for(i=0;i for(j=0;j<10;j++); } voiddisplay_number() { unsignedchari; for(i=0;i<8;i++) { P0=numyang[i]; P1_3=1; P1_3=0; delay(20); P0=scan_ledyang[i]; P1_2=1; P1_2=0; delay(20); P0=0x00;//消影 P1_2=1; P1_2=0; } } voidmain() { while (1) { display_number(); } } 3、编写行列式按键的扫描程序,在数码管上显示按键的键值。 要求: 在数码管的最后一位显示按键的值(0—F),原来数码管上显示的数依次向左移动一位。 #include sbitP1_2=P1^2; sbitP1_3=P1^3; codeledyang[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0~9,A~F codescan_ledyang[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选 unsignedcharcounter[8]={0,0,0,0,0,0,0,0}; unsignedchark,c; delay(unsignedcharm) { unsignedchari,j; for(i=0;i for(j=0;j<20;j++); } voidgetch() { unsignedcharX,Y,Z,cc; P2=0xff; P2=0x0f;//行置1 if(P2! =0x0f)//可能有键按下 { delay(20); if(P2! =0x0f)//确实有键按下 { X=P2;//保存P2的值 P2=0xf0;//列置1 Y=P2; Z=X|Y;//取键盘值 c++;//标志位 if(c==17)c=0; switch(Z) { case0x7e: k=0;break; case0x7d: k=1;break; case0x7b: k=2;break; case0x77: k=3;break; case0xbe: k=4;break; case0xbd: k=5;break; case0xbb: k=6;break; case0xb7: k=7;break; case0xde: k=8;break; case0xdd: k=9;break; case0xdb: k=10;break; case0xd7: k=11;break; case0xee: k=12;break; case0xed: k=13;break; case0xeb: k=14;break; case0xe7: k=15;break; } for(cc=c;cc-1>0;cc--) counter[cc-1]=counter[cc-2]; counter[0]=k; while(P2! =0xf0);//检测案件是否弹起 } } } voiddisplay_number() { unsignedchari; for(i=0;i<8;i++) { P0=ledyang[counter[i]]; P1_3=1; delay(5); P1_3=0; delay(10); P0=scan_ledyang[i]; P1_2=1; delay(5); P1_2=0; delay(10); P0=0x00;//消影 P1_2=1; P1_2=0; } } voidmain(void) { while (1) { unsignedcharc=0; P2=0xff; getch(); display_number(); } } 4、利用定时/计数器完成一电子时钟程序设计,在数码管上显示格式为“12-00-00”。 #include sbitP1_2=P1^2; sbitP1_3=P1^3; codeledyang[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9 codescan_ledyang[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsignedcharcnt[8]={0,0,0,0,0,0,0,0}; unsignedchari,j; voiddelay(unsignedcharm) { unsignedchara,b; for(a=0;a for(b=0;b<5;b++); } voiddisplay_number() { P0=ledyang[cnt[i]]; P1_3=1; delay(5); P1_3=0; delay(10); P0=scan_ledyang[i]; P1_2=1; delay(5); P1_2=0; delay(10); i++; if(i==8)i=0; P0=0x00;//消影 P1_2=1; P1_2=0; } voidtimer0(void)interrupt1 { TR0=0; TL0=0xb0; TH0=0x3c; TR0=1; j++; if(j==20) { j=0; cnt[0]++; if(cnt[0]==10) { cnt[0]=0; cnt[1]++; if(cnt[1]==6) { cnt[1]=0; cnt[2]++; if(cnt[2]==10) { cnt[2]=0; cnt[3]++; if(cnt[3]==6) { cnt[3]=0; cnt[4]++; if(cnt[4]==10) { cnt[4]=0; cnt[5]++; } if((cnt[5]==2)&&(cnt[4]==4)) { cnt[4]=0; cnt[5]=0; } } } } } } } voidmain() { P1_3=1; P1_2=1; TMOD=0x01; TL0=0xb0; TH0=0x3c; TR0=1; ET0=1; EA=1; while (1) { display_number(); } } 5、利用BANK3部分的电路,编写外部中断按键程序。 要求: 在数码管的最后两位位显示一数字(00—99),按下INT0上接的按键,该数字加一,按下INT1上接的按键,该数字减一。 #include"at89x52.h" codeledyang[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; codescan[]={0x01,0x02}; unsignedchardatacounter[2]; unsignedchardatabegin=88; unsignedintm=0,n=0; delay(unsignedcharm) { unsignedchari,j; for(i=0;i for(j=0;j<20;j++); } voidadd(void)interrupt0 { begin++; if(m==1)begin=0; m=0; } voidsub(void)interrupt2 { begin--; if(n==1)begin=99; n=0; } voiddisplay() { unsignedchark,i; counter[1]=begin/10; counter[0]=begin%10; for(k=0;k<2;k++) { i=counter[k]; P0=ledyang[i]; P1_3=1; delay(5); P1_3=0; delay(10); P0=scan[k]; P1_2=1; delay(5); P1_2=0; delay(10); P0=0x00;//消影 P1_2=1; P1_2=0; } } voidmain() { IE=0x85; TCON=0x05; while (1) { if(begin==99)m=1; if(begin==0)n=1; display(); } } 6、利用BANK3部分电路设计一个频率计,用来检测该部分555脉冲发生器产生的脉冲的频率,将测量结果显示在数码管上。 #include sbitP1_2=P1^2; sbitP1_3=P1^3; codeledyang[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9 codescan[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsignedcharcnt[8]; unsignedchari=0,j=0,c; voiddelay(unsignedcharm) { unsignedchara,b; for(a=0;a for(b=0;b<5;b++); } voiddisplay_number() { P0=ledyang[cnt[i]]; P1_3=1; P1_3=0; delay(10); P0=scan[i]; P1_2=1; delay(5); P1_2=0; delay(10); i++; if(i==8)i=0; P0=0x00;//消影 P1_2=1; P1_2=0; } voidmain() { TMOD=0x15;//T1定时方式1,T0计数方式1 TH0=0x00; TL0=0x00;//初始化计数器T0 TH1=0x3c; TL1=0xb0;//初始化定时器T1 TR0=1;//开启计数器T0 TR1=1;//开启定时器T1 EA=1;//开启总中断 ET1=1;//开启外部中断T1 while (1) { cnt[2]=c/100; cnt[1]=(c%100)/10; cnt[0]=c%10; display_number(); } } voidtimer(void)interrupt3//定时1s { TL1=0xb0; TH1=0x3c; j++; if(j==20) { j=0; c=TL0; TL0=0;//初始化计数器T0 } } 7、利用BANK2部分的电路,控制8255PA端口所接发光二极管完成一流水灯程序 #include #include #include #definePA0xe000 #definePB0xe001 #definePC0xe002 #defineCW0xe003 voiddelay(unsignedcharm) { unsignedchari,j; for(i=0;i for(j=0;j<255;j++); } voidinit8255() { delay(10); XBYTE[CW]=0x8b; } voidmain() { unsignedchard,i; init8255(); while (1) { d=0xfe; for(i=0;i<8;i++) { XBYTE[PA]=d; d=_crol_(d,1); delay(200); } } } 8、利用BANK2部分电路,使8255PB端口所接拨码开关的位置情况在PA口上显示出来(当拨码开关置于上方时,对应LED亮;置于下方时,对应LED灭)。 #include #include #definePA0xe000 #definePB0xe001 #definePC0xe002 #defineCW0xe003 voiddelay(unsignedcharm) { unsignedchari,j; for(i=0;i for(j=0;j<10;j++); } voidinit8255() { delay(10); XBYTE[CW]=0x8b;//PA、PB工作在方式0 } voidmain() { unsignedchard; init8255(); while (1) { d=XBYTE[PB]; XBYTE[PA]=d; delay(10); } } 8、将自己的学号写如片外RAM指定单元,再将学号的后四位读出,显示在数码管上。 #include #include codeunsignedcharLedCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; codeunsignedcharPosit[]={0x08,0x04,0x02,0x01}; unsignedcharDisBuf[4];//定义显存空间 unsignedcharsts,loopnum=4; voidDelay(unsignedintDat) { unsignedinti; for(i=0;i } voidDisbufchange(unsignedcharDa) { DisBuf[0]=DisBuf[1]; DisBuf[1]=DisBuf[2]; DisBuf[2]=DisBuf[3]; DisBuf[3]=Da; } voidDisplay(void) { unsignedcharn; for(n=0;n<4;n++)//显示4个数据 { XBYTE[0xd000]=LedCode[DisBuf[n]];//将显存中的数据送入数码管段码端 XBYTE[0xc000]=Posit[n];//将对应该显存的数码管点亮 Delay(200);//显示延时 XBYTE[0xc000]=0x00;//消隐 } } voidmain(void) { unsignedchari; TMOD=(TMOD&0x0f)|0x10;//设置定时/计数器T1工作于方式1 TL1=(-50000);//设定定时/计数器初值 TH1=(-50000)>>8;//定时50ms TR1=1;//启动定时器 ET1=1;//开启定时器T1中断 EA=1;//开启总的中断 for(i=1;i<5;i++)//预置数1234入显存 { Disbufchange(i); } while (1) { Display();//循环显示 } } voidT1_int(void)interrupt3 { TL1=(-50000);//重新赋初值 TH1=(-50000)>>8; if(++sts>=20)//判断一秒时间是否到达 { if(++loopnum>=10)//判断移位数据是否超过10 loopnum=0; Disbufchange(loopnum);//移位显存空间里的内容 sts=0; } } 9、编写串口通信程序,让单片机接收PC机发送的数据,如果接收到的是小写字母,转换为大写字母回送给PC机。 #include unsignedcharch;//定义一个接收数据的临时变量 voidmain(void) { SCON=0x52;//设定串口的工作方式为方式一 TMOD=(TMOD&0x0f)|0x20;//设定T1作为波特率发生器使用,T1工作于方式2定时器模式 TH1=-11059200L/32/12/9600;//设定通信波特率对应的T1的初值 TL1=TH1; TR1=1;//启动T1 while (1) { if(RI==1)//判断是否有数据到来 { ch=SBUF;//如果有数据到来,将数据从接收缓冲器中取出 RI=0;//等待下一数据的到来 if(ch>='a'&&ch<='z')//判断数据是否是小写字母 { ch=ch-'a'+'A';//是小写字母,把小写字母变成大写字母 while(TI==0);//判断发送是否忙,如果忙则等待 SBUF=ch;//将要发送的数据送入发送缓冲器 TI=0; } elseif(ch>='A'&&ch<='Z')//判断数据是否是小写字母 { ch=ch-'A'+'a';//是大写字母,把大写字母变成小写字母 while(TI==0);//判断发送是否忙,如果忙则等待 SBUF=ch;//将要发送的数据送入发送缓冲器 TI=0; } else { while(TI==0); SBUF=ch; TI=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 考试
![提示](https://static.bingdoc.com/images/bang_tan.gif)