原创说明:此随笔为单片机(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);
}
实验结果:
欢迎一起讨论!!!