原创说明:此随笔为单片机(AT89C51、AT89C52)实验
前三个实验类型为汇编编程,难度较大,重在思路和细节的把握。
后四个实验为动手较强的单片机实验,编程相对简单。
考查点:
1.对单片机汇编基本编程把握
2.单片机的中断,包括外部中断、定时计数、串口通信
3.对单片机的结构、工作原理,各个端口的特点使用把握
4.会使用proteus仿真软件的使用,以及与keil的联调使用
单片机实验(一)
一、实验题目: 试编写一段程序,其功能为将21H单元的内容8位分别依次存放到从22H开始的8单元中。 (21H)0→(22H),(21H)1→(23H)...
二、实验目的:
1、掌握Keil软件的使用方法。
2、掌握51单片机汇编语言程序设计的方法。
三、实验要求:
1、独立完成实验内容。
2、掌握在Keil中调试程序的方法。
3、掌握在Keil中建立存储器窗口的方法(C、D、X)
四、实验代码
1 org 0000h 2 ljmp start 3 org 0100h 4 start: 5 mov 21h,#0xff 6 mov r7,#0 7 mov r1,#22h 8 mov a,21h 9 loop: 10 rrc a 11 jc k0 12 mov @r1,#0 13 jmp k1 14 k0: 15 mov @r1,#1 16 k1: 17 inc r1 18 inc r7 19 cjne r7,#8,loop 20 jmp $ 21 end
单片机实验 (二)
一、实验题目: 若0-5号键的键值分别是:EEH、DEH、BEH、7EH、EDH、DDH。设键值存放在内部RAM 20H单元中,编程实现根据2OH中的键值分别使程序转移到PR0-PR4程序段。要求当以上程序段的功能完成后,都采用RET指令,指定返回到程序的初始入口START标号处。
要求:PR0 :教材75页习题7 PR1 :同上 习题9题 PR2:同上 习题10 其余入口,只需完成空操作就返回。
二、实验目的
1、掌握散转的编程方法。
2、掌握指定放回的编程方法。
三、实验要求:
1、独立完成实验内容。
2、掌握在Keil中调试程序的方法。
3、掌握在Keil中建立存储器窗口的方法(C、D、X)
提示:
1 ORG 0000H 2 LJMP START 3 ORG 0100H 4 START: 5 PR0: 6 PR1: 7 PR2: 8 PR3: 9 NOP 10 PR4: 11 NOP 12 PR5: 13 NOP 14 ORG 0E00H 15 TAB DB PR0,PR1,PR2,PR3,PR4,PR5
四、实验代码
1 org 0000h 2 ljmp start 3 org 0100h 4 start: 5 mov 20h,#0xbe 6 mov dptr,#key_vaule 7 mov a,#0 8 loop: 9 push acc 10 movc a,@a+dptr 11 cjne a,20h,agan 12 pop acc 13 14 mov dptr,#func 15 rl a 16 jmp @a+dptr 17 agan: 18 pop acc 19 inc acc 20 cjne a,#6,loop 21 sjmp $ 22 func: 23 ajmp PR0 24 ajmp PR1 25 ajmp PR2 26 ajmp PR3 27 ajmp PR4 28 ajmp PR5 29 30 SJMP $ 31 32 PR0: 33 mov 30h,#44h 34 mov 3fh,#0f1h 35 mov r0,#30h 36 mov r1,#50h 37 loop0: 38 mov a,@r0 39 jnb acc.7,not_z 40 inc r5 //负数 41 mov @r1,a 42 inc r1 43 continue: 44 inc r0 45 cjne r0,#40h,loop0 46 not_z: 47 cjne a,#00,not_roze 48 inc r6 49 jmp continue 50 not_roze: //正数 51 inc r4 52 mov 60h,r0 53 push acc 54 mov a,#50h 55 add a,r4 56 dec a 57 mov r0,a 58 pop acc 59 mov @r0,a 60 mov r0,60h 61 sjmp loop0 62 63 ret 64 PR1: 65 mov 40h,#0f3h 66 mov 41h,#34h 67 mov 42h,#45h 68 mov 43h,#56h 69 70 mov r1,#44h 71 mov r0,#40h 72 mov a,@r0 73 cpl a 74 addc a,1 75 mov @r1,a 76 inc r1 77 inc r0 78 loop1: 79 mov a,@r0 80 cpl a 81 addc a,#0 82 mov @r1,a 83 inc r0 84 inc r1 85 cjne r0,#44h,loop1 86 ret 87 PR2: 88 mov a,#0xff 89 mov r0,#0 90 mov P2,#0 91 mov b,#16 92 mov r2,#16 //i 93 mov r1,#buf1 94 movx @r1,a 95 clr c 96 loop2: 97 clr c 98 movx a,@r1 99 add a,r0 100 mov r0,a 101 inc r1 102 dec r2 103 cjne r2,#0,loop2 104 105 div ab 106 mov r0,#buf2 107 movx @r0,a 108 mov r0,#buf 109 mov a,b 110 movx @r0,a 111 ret 112 PR3: 113 NOP 114 ret 115 PR4: 116 NOP 117 ret 118 PR5: 119 NOP 120 ret 121 ORG 0E00H 122 buf1 equ 200 123 buf2 equ 123 124 buf equ 220 125 key_vaule: db 0xee,0xde,0xbe,0x7e,0xed,0xdd 126 end
单片机实验 (三)
一、实验题目: 使用C语言完成,实验一,实验二
二、实验目的
1.掌握Keil C使用方法
三、实验要求:
1、独立完成实验内容。
2、掌握无仿真器,程序调试的方法。
四、实验代码
1 #pragma small 2 3 #include<reg52.h> 4 #define uchar unsigned char 5 6 void main() 7 { 8 char *p=0x21; 9 char *q=0x29; 10 uchar i; 11 *p=0xfe; 12 for(i=0;i<8;i++) 13 { 14 15 *(q--)=*p>>i&0x01; 16 } 17 } 18 19 20 #include<reg52.h> 21 #include<math.h> 22 #include<stdio.h> 23 #define uchar unsigned char 24 #define uint unsigned int 25 #define buf1 0x80 26 #define buf2 0x90 27 #define buf 0x72 28 #define data1 0x30 29 uchar key_value[6]={0xee,0xde,0xbe,0x7e,0xed,0xdd}; 30 void pr0() 31 { 32 uchar i=0,r4=0,r5=0,r6=0; 33 char table[16]={1,2,3,4,5,6,0,0,-1,-2,-3,-4,-5,-6,-7,-8},*pz=0x40,*pf=0x50; 34 35 for(i=0;i<16;i++) 36 { 37 if(table[i]>0) 38 { 39 r4++; 40 *(pz++)=table[i]; 41 } 42 else 43 { 44 if(table[i]==0) r5++; 45 else 46 { 47 r6++; 48 *(pf++)=table[i]; 49 } 50 } 51 } 52 } 53 void pr1() 54 { 55 char data *p = data1; 56 uchar i,cy=0; 57 *(p+3)=0x0f4; 58 if((*(p+3)&0x80)!=0) 59 { 60 for(i=0;i<4;i++,p++) 61 { 62 *p=~*p; 63 } 64 p=data1; 65 if(0x0ff==*p) 66 { 67 cy++; 68 *p=0; 69 } 70 else (*p)++; 71 for(i=1,p++;i<3;i++,p++) 72 { 73 if(*p==0x0ff&&cy==1) 74 { 75 cy=1; 76 *p=0; 77 } 78 else if(cy==1) 79 { 80 (*p)++; 81 cy=0; 82 } 83 84 } 85 } 86 } 87 88 void pr2() 89 { 90 uchar i; 91 uint sum=0; 92 data char xdata *p=buf1; 93 data char data *q; 94 for(i=0;i<16;i++) 95 { 96 sum +=*(p++); 97 } 98 q=buf2; 99 *q=sum/16; 100 q=buf; 101 *q=sum%16; 102 103 } 104 105 void pr3() 106 { 107 } 108 void pr4() 109 { 110 } 111 void pr5() 112 { 113 } 114 115 void main() 116 { 117 char *key=0x20; 118 uchar i; 119 *key=0xde; 120 for(i=0;i<6;i++) 121 { 122 if(*key==key_value[i]) break; 123 } 124 switch(0) 125 { 126 case 0:pr0(); 127 case 1:pr1(); 128 case 2:pr2(); 129 case 3:pr3(); 130 case 4:pr4(); 131 case 5:pr5(); 132 default:break; 133 } 134 }
单片机实验 (四)
一、实验题目
当K1键按下后,首先使蜂鸣器响一声,然后使LED1- LED8完成3种闪亮的花样(自己定义),每一种花样循环 3次,然后周而复始。
二、实验目的
1.掌握51单片机I/O口的使用方法。
2.掌握基本单片机输入/输出程序的设计。
三、实验要求:
1、独立完成实验内容。
2、掌握ISP下载。
3、掌握无仿真器,程序调试的方法。
4、提供实验报告(电子档)
5、实验报告中提供实验电路图
四、实验代码及图
1 #include<reg52.h> 2 #define uchar unsigned char 3 uchar table[3]={0x44,0x55,0xcc}; 4 uchar flag=0; 5 sbit P3_2=P3^2; 6 7 void delay(int z) 8 { 9 uchar i=250; 10 while(z--) 11 { 12 i=250; 13 while(i--); 14 } 15 } 16 void INT0_proc() interrupt 0 17 { 18 flag=!flag; 19 } 20 void main() 21 { 22 uchar i; 23 P2=0XFF; 24 P3_2=1; 25 EA=1; 26 IT0=1; 27 EX0=1; 28 while(1) 29 { 30 if(flag==1) 31 { 32 for(i=0;i<3;i++) 33 { 34 P1=table[i]; 35 delay(500); 36 } 37 } 38 } 39 }
单片机实验 (五)
一、实验目的:
1、掌握51单片机中断控制器的使用方法
2、掌握51单片机控制动态LED显示器的方法
二、实验设备
1、硬件:PC 单片机实验箱
2、软件:Kiel uVision4
三、实验内容
程序启动后4位LED显示器滚动显示“-”,每按下1次K1键后,首先使蜂鸣器响一声。然后,依次使LED滚动显示CNT的计数值(0-9)。
四、实验要求
1、按键K1采用中断来管理。(INT0采用边沿触发)
2、中断服务程序完成四个功能:
1)消除按键K1抖动。
2)CNT计数。
3)查表将计数值转换成LED显示器的段代码。
4)将段代码分别放入4个显示缓冲单元。
3、掌握无仿真器,程序调试的方法
4、实验报告中提供实验电路图
5、阐述实验原理
五、实验代码及电路图
1 #include<reg52.h> 2 #define uchar unsigned char 3 uchar code wei[4]={0x11,0x12,0x14,0x18}; 4 uchar code num[11]= {0xbf,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 5 sbit P3_2=P3^2; 6 uchar count=0,temp=0,flag=0; 7 8 void delay(uchar i) 9 { 10 uchar j; 11 while(i--) 12 { 13 for(j=0;j<100;j++); 14 } 15 } 16 void int0_pro() interrupt 0 17 { 18 count++; 19 flag=1; 20 } 21 void display(){ 22 uchar i=0; 23 if(flag)temp=count%10+1; 24 else temp=count%10; 25 for(i=0;i<4;i++) 26 { 27 P1=num[temp]; 28 P2=wei[i]; 29 delay(500); 30 } 31 } 32 void init() 33 { 34 P1=0xff; 35 P2=0x00; 36 P3_2=1; 37 EX0=1; 38 IT0=1; 39 EA=1; 40 } 41 void main() 42 { 43 init(); 44 while(1) 45 { 46 display(); 47 } 48 }
单片机实验 (六)
一、实验目的:
1、掌握51单片机中断控制器的使用方法
2、掌握51单片机控制动态LED显示器的方法
二、实验设备
1、硬件:PC 单片机实验箱
2、软件:Kiel uVision4
三、实验内容 两个数码管,K1,K2两个按键,完成K1启动计数,K2暂停计数,每一秒钟数码管增加1,60秒钟后,数码管回归0,重新计数。
四、实验要求
1、按键K1,K2采用中断来管理。(INT0采用边沿触发)
2、中断服务程序完成四个功能:
1)消除按键K1抖动。
2)CNT计数。
3)查表将计数值转换成LED显示器的段代码。
4)将段代码分别放入4个显示缓冲单元。
3、掌握无仿真器,程序调试的方法。
4、提供实验报告(电子档)
5、实验报告中提供实验电路图
6、阐述实验原理
五、实验代码及电路图
#include<reg52.h> #define uchar unsigned char uchar num[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit k1=P3^2; sbit k2=P3^3; sbit wei0=P3^0; sbit wei1=P3^1; uchar count=0; uchar t=0; void delay(int z) { uchar i=250; while(z--) { i=250; while(i--); } } void display() { count=count%61; P2=num[count/10]; wei0=1; wei1=0; wei0=0; P2=num[count%10]; wei0=0; wei1=1; wei1=0; } void INT0_proc() interrupt 0 { delay(10); if(k1==0) { TR0=1; } } void INT1_proc() interrupt 2 { delay(10); if(k2==0) { TR0=0; } } void T0_pro() interrupt 1 { TH0=0X3C; TL0=0XB0; if(t==20) { count++; t=0; } t++; } void init() { P3=0x0C; P2=0xff; IT0=1; EX0=1; IT1=1; EX1=1; ET0=1; TMOD=0X01; TH0=0X3C; TL0=0XB0; EA=1; } void main() { init(); while(1) { display(); } }
单片机实验 (七)
一、实验目的:
1、掌握51单片机串口的使用方法
2、掌握protues上串口与PC通信的方法
二、实验设备
1、硬件:PC 单片机实验箱
2、软件:Kiel uVision4 串口助手 虚拟串口(VSPD)
三、实验内容
晶振12MHz,波特率1200,程序启动后单片机主动发出Hello Server,PC使用串口助手应答单片机,单片机收到数据后,不做任何修改返回PC。
四、实验要求
1、串口中断来实现。
2、中断服务程序完成四个功能:
1)转发数据。
2)设置TI,RI。
3、掌握无仿真器,程序调试的方法。
4、提供实验报告(电子档)
5、实验报告中提供实验电路图
6、阐述实验原理
五、实验代码及电路图
#include<reg51.h> #define uchar unsigned char uchar code data1[]="Hello Server"; uchar count=0; char a; void S_proc() interrupt 4 { if(TI) { TI=0; if(count<12) { SBUF=data1[++count]; } } else { RI=0; a=SBUF; SBUF=a; while(!TI); TI=0; } } void main() { SCON=0X50; TMOD=0X20; TH1=TL1=230; EA=1; TR1=1; SBUF=data1[count]; ES=1; while(1); }
实验结果:
欢迎一起讨论!!!