单片机实验总结.doc_第1页
单片机实验总结.doc_第2页
单片机实验总结.doc_第3页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序由410出品,与老师的不大一样,此处省去1万字-最终解释归410所有1.试编写程序。统计片内RAM 30H50H单元中FFH的个数,并将统计结果存51H。 mov r0,#30h /把30h赋给R0 mov r1,#00h /把00h赋给R1loop: cjne r0,#0ffh,next /把R0所指的地址里的数(地址30h中的数) 与0ffh比较 inc r1 /若为0ffh则R1加1(计算0ffh的个数)next: inc r0 /若不一样则R0加1(即把R0里的地址加1,R0将指向 下一个地址) cjne r0,#51h,loop /比较R0所存的地址与51h,若不等则跳回loop 继续执行 mov 51h,r1 /若相等(R0里的数就为51h,完成30h到50h的计 数)将R1里的值赋到地址51h里,即地址51h中 存储着0ffh的个数 sjmp $ /等待 end2、从片内RAM 30H单元开始存放着一组无符号数,其个数存在21H单元中。试编写程序,找出其中最小的数,并将其存入20H单元中。 mov r0,#30h /把30h赋给R0 mov a,r0 /把R0所指30H中的数赋给a(a中就是地址30h中的无 符号数) mov r1,21h /把21h中的数赋给R1loop: inc r0 /R0加1(即R0将指向下一个地址) mov 30h,r0 /把R0所指地址的数给到地址30h中 cjne a,30h,chk /比较a中的数与地址30h中的数的大小,若a中的数 30H中的数,则Cy=0;否则相反chk: jc lop /判断Cy是否为1,若是,则执行下面程序,否则跳至lop 继 续执行 mov a,r0 /把R0所指地址中的数给a,即把最小数赋给了alop: djnz r1,loop /R1减一,程序跳至loop继续执行,循环直至R1减到0 mov 20h,a /把a中的数赋到地址20h中 end3、设片外RAM 2000H单元中有一个8位二进制数,试编程将该数的低四位屏蔽掉,并送回原存储单元。 mov dptr,#2000h /将片外地址2000h给dptrmovx a,dptr /将片外地址2000h中的数赋给aanl a,#0f0h /将a中的数与0f0h与下,屏蔽低四位的数movx dptr,a /将屏蔽好的数送回到片外地址2000h中end 4、试编写程序,求出片内RAM20H单元中“1”的个数,并将结果存入21H单元。 mov 21h,#0h /将地址21h中置0(例如 20h中是01101000) mov r2,#08h /将8赋给R2(8个有效数) mov a,20h /将地址20h中的数赋给a lop: rlc a /带Cy左循环移位(即第一次移位变为11010000,Cy=0) jnc loop /判断Cy是否不等于1,若不等1,则程序跳至loop inc 21h /若Cy等于1,则地址21h中的数加1loop: djnz r2,lop /R2减1,程序跳至lop执行直至R2=0,才执行下面的 end5、试编一程序,分别统计在内部RAM的30H50H单元的数据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放在51H和52H单元中。 mov r0,#30h/把30h给R0 mov r1,#20h/把20h给R1 mov 51h,#0 mov 52h,#0/把地址51h,52h中的数置零 L1: mov b,#02h/把2h给b mov a,r0/把R0所指地址中的数给a div ab/a除以b,商给a,余数b mov a,b/把b的数给a cjne a,#0,L2/比较a与0的大小,若不等跳至L2 inc 52h/若相等地址52h中的数加一 jmp L3/跳至L3 L2: inc 51h/地址51h中的数加一 L3: inc r0/R0加一 djnz r1,L1/R1减一,跳至L1执行 jmp $/等待 end 6、在2000H2004H单元中,存有5个压缩的BCD码,试编程将它们转换成ASCII码,并存入2005H开始的连续单元中。 mov dph,#20h mov dpl,#00h mov r0,#5h mov r1,#0hlop: mov dpl,r1 movx a,dptr mov b,a anl a,#0fh orl a,#30h mov dpl,r0 movx dptr,a inc r0 xch a,b swap a anl a,#0fh orl a,#30h mov dpl,r0 movx dptr,a inc r0 inc r1 cjne r1,#5h,lop End7、 参考书中P109页,编写C语言和汇编语言的流水灯程序#includereg51.h#includeintrins.h#define uchar unsigned char#define uint unsigned intvoid delayms(t) uint i; for(;t0;t-) for(i=0;i120;i+);void main() uint i; while(1) P1=0xfe; for(i=0;i8;i+) P1=_crol_(P1,1); delayms(300); 8、使用89C51的P1连接到8颗LED,P1在正常状况下会输出跑马灯,然后通过用户触动外部按钮来中断INT0,当INT0引脚有低电位的脉冲出现时,8个LED会一闪一灭4次。#includereg51.h#includeintrins.h#define uchar unsigned char#define uint unsigned intvoid delayms(t) uint i; for(;t0;t-) for(i=0;i120;i+);void intx0_isr() interrupt 0 uint i; for(i=0;i4;i+) P1=0xff; delayms(200); P1=0x00; delayms(200); void main() uint i; IT0=1; EX0=1; EA=1; while(1) P1=0xfe; for(i=0;i8;i+) P1=_crol_(P1,1); delayms(300); 9、使用89C51的P1连接到8颗LED,使用外部中断方式,程序执行时, 当用户每按一次按钮的中断进行计数, 将其数值按二进制数在P1口驱动LED灯上显示出来,计数到9次之后又会恢复到0。(分别使用汇编语言和C51编程)#includereg51.h#define uchar unsigned char#define uint unsigned intuint j=255;void intx0_isr()interrupt 0 j-; P1=j; if(j=245) j=255; P1=255; void main() P1=255; IT0=1; EX0=1; EA=1; while(1);10、并行换串行输出#includereg51.h#includeintrins.h#define uchar unsigned char#define uint unsigned intsbit spl=P25;void delay(uint time) uint j=0; for(;time0;time-) for(j=0;j120;j+); void main() SCON=0x10; while(1) spl=0; spl=1; if(RI) RI=0; P0=SBUF; delay(100); 11、串行换并行输出#includereg51.h#includeintrins.h#define uchar unsigned char#define uint unsigned intsbit clk=P31;void delay(uint time) uint j=0; for(;time0;time-) for(j=0;j120;j+); void main() uint dataa=1; SCON=0; clk=1; while(1) unsigned int j; SBUF=dataa; if(TI) TI=0; dataa=_crol_(dataa,1); delay(500); 12、按键显示相应的数(数码管)#includereg51.h#define uint unsigned int#define uchar unsigned charuchar Pre=0xff,no=0xff;Uchar code DSY_CODE=0x3f,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6;void delay(uint ms) uchar i; while(ms-) for(i=0;i120;i+);void key() uchar tmp; P1=0xf0; delay(1); tmp=P10xf0; switch(tmp) case 0x10:no=0;break; case 0x20:no=1;break; case 0x40:no=2;break; case 0x80:no=3;break; default:no=16; P1=0x0f; delay(1); tmp=P10x0f; switch(tmp) case 2:no+=0;break; case 4:no+=4;break; case 8:no+=8;break; void main() P0=0x00; while(1) P1=0xf0; if(P1!=0xf0) key(); if(Pre!=no) P0=DSY_CODEno+1; Pre=no; delay(100); 13、 数码管循环显示(0F)#includereg51.h#define uchar unsigned char #define uint unsigned intuchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;void delay(t) uint i; while(t-) for(i=0;i121;i+);void main() uint j=0; while(1) j=+j%16; P0=tablej; delay(300); 14、甲机通过串口控制乙机LED闪烁甲机:#includereg51.h#define uchar unsigned char#define uint unsigned intsbit LED1=P00;sbit LED2=P03;sbit K1=P10;uchar Operation_No=0; /操作代码/延时void DelayMS(uint ms)uchar i;while(ms-) for(i=0;i120;i+);/向串口发送字符void Putc_to_SerialPort(uchar c)SBUF=c;while(TI=0);TI=0;/主程序void main()LED1=LED2=1;SCON=0x40; /串口模式1,允许接收TMOD=0x20; /T1工作模式2PCON=0x00; /波特率不倍增TH1=0xfd;TL1=0xfd;TI=0;TR1=1;while(1)DelayMS(100);if(K1=0) /按下K1时选择操作代码0,1,2,3while(K1=0);Operation_No=(Operation_No+1)%4;switch(Operation_No) /根据操作代码发送A/B/C或停止发送case 0: Putc_to_SerialPort(X);LED1=LED2=1;break;case 1: Putc_to_SerialPort(A);LED1=LED1;LED2=1;break;case 2: Putc_to_SerialPort(B);LED2=LED2;LED1=1;break;case 3: Putc_to_SerialPort(C);LED1=LED1;LED2=LED1;break;乙机:#includereg51.h#define uchar unsigned char#define uint unsigned intsbit LED1=P00;sbit LED2=P03;sbit K2=P10;uchar NumX=-1;/延时void DelayMS(uint ms)uchar i;while(ms-) for(i=0;i120;i+);/主程序void main()LED1=LED2=1;SCON=0x50; /串口模式1,允许接收TMOD=0x20; /T1工作模式2TH1=0xfd; /波特率9600TL1=0xfd;PCON=0x00; /波特率不倍增RI=0;TR1=1;while(1)DelayMS(100);if(RI) /如收到则LED则动作RI=0;switch(SBUF) /根据所收到的不同命令字符完成不同动作case X: LED1=LED2=1;break; /全灭case A: LED1=0;LED2=1;break; /LED1亮case B: LED2=0;LED1=1;break; /LED2亮case C: LED1=LED2=0; /全亮15、乙机通过串口控制甲机数码管显示 甲机:#includereg51.h#define uchar unsigned char#define uint unsigned intsbit LED1=P10;sbit LED2=P13;sbit K1=P17;uchar Operation_No=0; /操作代码/数码管代码uchar code DSY_CODE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/延时void DelayMS(uint ms)uchar i;while(ms-) for(i=0;i120;i+);/向串口发送字符void send(uchar c)SBUF=c;while(TI=0);TI=0;/主程序void main()LED1=LED2=1;P0=0x00;SCON=0x50; /串口模式1,允许接收TMOD=0x20; /T1工作模式2PCON=0x00; /波特率不倍增TH1=0xfd;TL1=0xfd;TI=RI=0;TR1=1;IE=0x90; /允许串口中断while(1)DelayMS(100);if(K1=0) /按下K1时选择操作代码0,1,2,3while(K1=0);Operation_No=(Operation_No+1)%4;switch(Operation_No) /根据操作代码发送A/B/C或停止发送case 0: send(X);LED1=LED2=1;break;case 1: send(A);LED1=LED1;LED2=1;break;case 2: send(B);LED2=LED2;LED1=1;break;case 3:send(C);LED1=LED1;LED2=LED1;break;/甲机串口接收中断函数void Serial_INT() interrupt 4if(RI)RI=0;if(SBUF=0SBUF=9) P0=DSY_CODESBUF;else P0=0x00;乙机:#includereg51.h#define uchar unsigned char#define uint unsigned intsbit LED1=P10;sbit LED2=P13;sbit K2=P17;uchar NumX=-1;/延时void DelayMS(uint ms)uchar i;while(ms-) for(i=0;i120;i+);/主程序void main()LED1=LED2=1;SCON=0x50; /串口模式1,允许接收TMOD=0x20; /T1工作模式2TH1=0xfd; /波特率9600TL1=0xfd;PCON=0x00; /波特率不倍增RI=TI=0;TR1=1;IE=0x90;while(1)DelayMS(100);if(K2=0)while(K2=0);NumX=+NumX%11; /产生010范围内的数字,其中10表示关闭SBUF=NumX;while(TI=0);TI=0;void Serial_IN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论