当前位置:文档之家› 单片机实验总结

单片机实验总结

单片机实验总结程序由410出品,与老师的不大一样,此处省去1万字-----最终解释归410所有1.试编写程序。

统计片内RAM 30H~50H单元中FFH的个数,并将统计结果存51H。

mov r0,#30h //把30h赋给R0mov 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赋给R0mov 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减到0mov 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中end4、试编写程序,求出片内RAM20H单元中“1”的个数,并将结果存入21H单元。

mov 21h,#0h //将地址21h中置0(例如20h中是01101000)mov r2,#08h //将8赋给R2(8个有效数)mov a,20h //将地址20h中的数赋给alop: rlc a //带Cy左循环移位(即第一次移位变为11010000,Cy=0) jnc loop //判断Cy是否不等于1,若不等1,则程序跳至loopinc 21h //若Cy等于1,则地址21h中的数加1loop: djnz r2,lop //R2减1,程序跳至lop执行直至R2=0,才执行下面的end5、试编一程序,分别统计在内部RAM的30H~50H单元的数据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放在51H和52H单元中。

mov r0,#30h //把30h给R0mov r1,#20h //把20h给R1mov 51h,#0mov 52h,#0 //把地址51h,52h中的数置零L1: mov b,#02h //把2h给bmov a,@r0 //把R0所指地址中的数给adiv ab //a除以b,商给a,余数bmov a,b //把b的数给acjne a,#0,L2 //比较a与0的大小,若不等跳至L2inc 52h //若相等地址52h中的数加一jmp L3 //跳至L3L2: inc 51h //地址51h中的数加一L3: inc r0 //R0加一djnz r1,L1 //R1减一,跳至L1执行jmp $ //等待end6、在2000H~2004H单元中,存有5个压缩的BCD码,试编程将它们转换成ASCII码,并存入2005H开始的连续单元中。

mov dph,#20hmov dpl,#00hmov r0,#5hmov r1,#0hlop: mov dpl,r1movx a,@dptrmov b,aanl a,#0fhorl a,#30hmov dpl,r0movx @dptr,ainc r0xch a,bswap aanl a,#0fhorl a,#30hmov dpl,r0movx @dptr,ainc r0inc r1cjne r1,#5h,lopEnd7、参考书中P109页,编写C语言和汇编语言的流水灯程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delayms(t){uint i;for(;t>0;t--)for(i=0;i<120;i++);}void main(){uint i;while(1){P1=0xfe;for(i=0;i<8;i++){P1=_crol_(P1,1);delayms(300);}}}8、使用89C51的P1连接到8颗LED,P1在正常状况下会输出跑马灯,然后通过用户触动外部按钮来中断INT0,当INT0引脚有低电位的脉冲出现时,8个LED 会一闪一灭4次。

#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delayms(t){uint i;for(;t>0;t--)for(i=0;i<120;i++);}void intx0_isr() interrupt 0{uint i;for(i=0;i<4;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;i<8;i++){P1=_crol_(P1,1);delayms(300);}}}9、使用89C51的P1连接到8颗LED,使用外部中断方式,程序执行时,当用户每按一次按钮的中断进行计数,将其数值按二进制数在P1口驱动LED灯上显示出来,计数到9次之后又会恢复到0。

(分别使用汇编语言和C51编程)#include<reg51.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、并行换串行输出#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit spl=P2^5;void delay(uint time){uint j=0;for(;time>0;time--){for(j=0;j<120;j++); }}void main(){SCON=0x10;while(1){spl=0;spl=1;if(RI)RI=0;P0=SBUF;delay(100);}}11、串行换并行输出#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit clk=P3^1;void delay(uint time){uint j=0;for(;time>0;time--){for(j=0;j<120;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、按键显示相应的数(数码管)#include<reg51.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;i<120;i++);}void key(){uchar tmp;P1=0xf0;delay(1);tmp=P1^0xf0;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=P1^0x0f;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_CODE[no+1];Pre=no;}delay(100);}}13、数码管循环显示(0~F)#include<reg51.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;i<121;i++);}void main(){uint j=0;while(1){j=++j%16;P0=table[j];delay(300);}}14、甲机通过串口控制乙机LED闪烁甲机:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED1=P0^0;sbit LED2=P0^3;sbit K1=P1^0;uchar Operation_No=0; //操作代码//延时void DelayMS(uint ms){uchar i;while(ms--) for(i=0;i<120;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,3{while(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;}}}}乙机:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED1=P0^0;sbit LED2=P0^3;sbit K2=P1^0;uchar NumX=-1;//延时void DelayMS(uint ms){uchar i;while(ms--) for(i=0;i<120;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、乙机通过串口控制甲机数码管显示甲机:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED1=P1^0;sbit LED2=P1^3;sbit K1=P1^7;uchar Operation_No=0; //操作代码//数码管代码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//延时void DelayMS(uint ms){while(ms--) for(i=0;i<120;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,3{while(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;case 3:send('C');LED1=~LED1;LED2=LED1;break;}}}}//甲机串口接收中断函数void Serial_INT() interrupt 4{if(RI){RI=0;if(SBUF>=0&&SBUF<=9) P0=DSY_CODE[SBUF]; else P0=0x00;}}乙机:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED1=P1^0;sbit LED2=P1^3;sbit K2=P1^7;uchar NumX=-1;//延时void DelayMS(uint ms){uchar i;while(ms--) for(i=0;i<120;i++);}//主程序void main(){LED1=LED2=1;SCON=0x50; //串口模式1,允许接收TMOD=0x20; //T1工作模式2TH1=0xfd; //波特率9600TL1=0xfd;PCON=0x00; //波特率不倍增RI=TI=0;IE=0x90;while(1){DelayMS(100);if(K2==0){while(K2==0);NumX=++NumX%11; //产生0~10范围内的数字,其中10表示关闭SBUF=NumX;while(TI==0);TI=0;}}}void Serial_INT() interrupt 4{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; //全亮}}}16、LCD显示#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit rs=P2^6;sbit rw=P2^5;sbit e=P2^7;uchar code table[]={""};void delayms(t){uint i;while(t--)for(i=0;i<121;i++);}void wr_com(uchar com){rs=0;rw=0;P0=com;e=1;e=0;}void wr_dat(uchar dat) {rs=1;rw=0;P0=dat;e=1;e=0;}void play(uchar *p) {while(*p!='\0') {wr_dat(*p); p++;delayms(1); }}void init(){delayms(15);wr_com(0x38);delayms(5);wr_com(0x01);delayms(5);wr_com(0x14);delayms(5);wr_com(0x06);delayms(5);wr_com(0x0c);delayms(5); }void main(){e=0;init();wr_com(0x80);play(table);delayms(1); }。

相关主题