单片机实验报告[五篇模版]

时间:2019-05-11 22:58:09下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《单片机实验报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《单片机实验报告》。

第一篇:单片机实验报告

实验一

一、实验题目:试编写一段程序,其功能为将21H单元的内容8位分别依次存放到从22H开始的8单元中。

二、keil代码:

org 0000h jmp start

org 0100h start: mov 21h,#8;mov A ,21h;取出21中的数 mov R0,#22h;初始化 mov R1,#7h;循环次数为7 loop:

RRC A;把A之中的最低位移到C

JC real;判断C里面是数是否为1,如果是1.则跳转到real mov @R0,#0h jmpkk;real: mov @R0,#1h;如果是1,则将1赋到R0单元里 kk: INC r0;依次判断A中的每一位

DJNZ R1,loop;jmp $;死循环 end

三、实验截图:

四、实验小结:

这是我们单片机的第一个实验,因为刚接触,所以会感觉很陌生,内心有一种畏惧感,看到题目的时候也是没有头绪,可以说完全是不知道到底题目是一个什么意思,更是不知道我们应该如何编写程序。不过后面通过老师的讲解,自己也去查看了一些有关的书籍,慢慢也理解了该如何去实现这种实验题目。在认真琢磨之后,我开始学会像以前刚开始学习C语言一样慢慢绘制一个程序的流程图,理清思绪,然后根据流程图编写相应的代码。

下面是本题的实验流程图:

通过完成这个实验,我对单片机的程序有了很大的认识。实验中,也是深刻的理解到了一个单片机程序每一步的实现与运行。当然,也掌握了在keil中调试的方法。

实验二

一、实验题目:若0-5号键的键值分别是:EEH、DEH、BEH、7EH、EDH、DDH。设键值存放在内部RAM 20H单元中,编程实现根据2OH中的键值分别使程序转移到PR0-PR4程序段。要求当以上程序段的功能完成后,都采用RET指令,指定返回到程序的初始入口START标号处。要求:PR0 :教材75页习题。

PR1 :同上习题9题 PR2:同上习题10 其余入口,只需完成空操作就返回。

二、keil代码:

org 0000 ljmp start org 0100 TAB: DB 0EEH,0DEH,0BEH,7EH,0EDH,0DDH start: movdptr ,#start pushdpl pushdph

mov A,#0EEH MOV 20H,A

MOV DPTR ,#TAB

MOV A,#0 NEXT: PUSH ACC;先保存A寄存器中的值

MOVC A,@A+DPTR

;A是键码表的编码

;置键码表首址

;表的起始位置的偏移量为零 CJNE A,20H,NEXT1 POP ACC RL A

;将20H值和键码表的值比较

;如相等,序号乘以2,得到分支表内偏移量2n(8位变16位)

MOV DPTR,#APJ

JMP @A+DPTR PRn指令

NEXT1: POP ACC

INC A CJNE A,#6,NEXT;表示如果==6了,说明编码查完了也没有相等的,程序直接结束

SJMP $

APJ: AJMP PR0 AJMP PR1 AJMP PR2 AJMP PR3 AJMP PR4

;不相等,则比较下一个

;置分支表首址

;执行表JPT+2H中的AJMP

PR0:

MOV R7,#5H MOV 3DH,#00H MOV 3EH,#20H MOV 4EH,#88H MOV 5EH,#98H MOV A,#0 MOV R4,A MOV R5,A MOV R6,A

;正数个数

;负数个数

;零的个数

MOV R0,#40H MOV R1,#50H MOV SP,#3FH LOOP: POP ACC JZ ZERO JB ACC.7,FS INC R4 MOV @R0,A INC R0 AJMP DJ FS: INC R5 MOV @R1,A INC R1 AJMP DJ ZERO: INC R6 DJ: DJNZ R7,LOOP RET

DATA1:DB 0EFH,3FH,3EH,07H PR1:

MOV R7,#03H;进行3次循环 MOV R0,#DATA1 MOV A,@R0

CPL A;取反 ADD A,#01

;加1 MOV @R0,A AB1: INC R0 MOV A,@R0 CPL A ADDC A,#0;带进位 DJNZ R7,AB1;SJMP $

RET BUF1:DB 1111B,0101B,0010B,0100B,0101B,0010B,0001B,0000B,1001B,0000B,1010B,1011B,0000B,0011B,0010B,0001B BUF2:DB 0 BUF:DB 0 PR2:

;30h放平均值 40h放余数 MOV R0,#BUF1

MOV R7,#16;循环16次数 MOV B,#0 MOV A,@R0 MOV R2,A LOOP1: MOV A,R2 INC R0 ADD A,@R0 MOV R2,A MOV A,B ADDC A,#0 MOV B,A DJNZ R7,LOOP1

MOV R6,#04H MOV 30H,#BUF2 MOV 30H,A MOV 40H,#BUF MOV 40H,#0 NEX: CLR C MOV A,B RRC A MOV B,A MOV A,30H RRC A

MOV 30H,A MOV A,40H RRC A MOV 40H,A DJNZ R6,NEX SJMP $ RET PR5:

RET PR3:

RET PR4:

RET END

三、实验截图:

初始化:

结果:

四、实验小结:

本实验中,将键码排成表,将键码表中的值和20H单元中的内容进行比较;另外编制一张转移表,存放AJMP指令,利用JMP @A+DPTR执行表内的AJMP指令,从而实现分支转移。

“RL A”:因为每个AJMP指令占两个字节,将刚记下来的键码中的值(即:键码的序号)乘以2即为转移表的偏移地址,在利用JMP @A+DPTR执行表内的AJMP指令,从而实现分支转移。

“movdptr ,#start Pushdpl push dph”:指定每次主程序返回到start。在单片机中,每一个子程序的返回用RET指令,而RET指令的功能正好可以使得子程序从栈顶弹出断点到PC,从而返回到主程序

实验三

一、实验题目:使用C语言完成,实验一,实验二。

二、keil代码:

实验一:

#include #include void main(){ char *p1=0x21;char *p2=0x22;int i=1;

*p1=0x8;

while(i<=8)

{

*p2=*p1&0x01;

*p1=*p1>>1;p2++;i++;

} } 实验二: #include void PR0();void PR1();void PR2();void PR3();void PR4();void PR5();

int main(){ int i;//键码表code[]的下表

int key=0;char code1[]={0xEE,0xDE,0xBE,0x7e,0xED,0xDD};char *p0=0x20;

//指针变量*p0指向20H这个单元

*p0=0xDE;

//给20H单元赋初值(20H单元里存放键码表中任一值)

for(i=0;i

}

key=i;switch(key)if(*p0==code1[i]){break;}

} {

} return 0;case 0:PR0();break;case 1:PR1();break;case 2:PR2();break;case 3:PR3();break;case 4:break;case 5:break;default:break;void PR0(){ char table1[16]={1,2,-6,7,8,9,0,-1,-2,-3,-4,-5,-6,1,4,6};char data *p30 = 0x30;char data *p40 = 0x40;char data *p50 = 0x50;int i;int countR4=0;R4,R5,R6中

int countR5=0;

//分别将正数、负数和零的个数存入 int countR6=0;for(i=0;i

//依次将table1表里的16个数据存入30H单元开始的单元里。

{

} for(i=0;i

{

if(*p30>0){

} else if(*p30<0){

} else *p50=*p30;++p50;++countR5;

*p40=*p30;++p40;++countR4;

p30[i]=table1[i];

{ } ++countR6;

}

++p30;} }

void PR1(){ char data1[]={0x10,0x11,0x12,0x13};int i;int j;char Cy=PSW^7;data1[0]=(~data1[0])+0x1;//while(j<4)for(j=0;j

} } data1[i]=(~data1[i])+Cy;i++;

void PR2(){ char buf1[]={0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x0A,0x0B,0x0C,0x0D,0x0E,0xF};char buf2=0;charbuf=0;int sum=0;int i=1;while(i<=16)

{ sum=sum+buf1[i];

++i;

} buf2=sum/0x10;buf=sum%0x10;}

三、实验截图:

实验一:

实验二:

四、实验小结:

在本实验中,我们用C语言编写代码的时候,特别注意指针的使用。另外,在单片机中使用C语言,与我们之前写C语言的时候还是有一些不同的地方,尤其是在指针使用上面的不同。C语言是一种通用的程序设计语言,代码率高,数据类型丰富,且具有良好的程序结构;单片机的C语言采用C51编译器,由C51产生的目标代码短,运行速度快,所需内存空间小。

实验中,注意:

“for(i=0;i

{

p30[i]=table1[i];}”:表示依次将table1表里的16个数据存入30H单元开始的单元里。实际上,在C中指针就相当于一个数组。

在本实验中,我可以根据之前的汇编程序实验,较为容易的根据每个子程序编子函数模块。由于之前有C语言的基础,所以能够比较好的完成本实验。

实验四

五、实验题目: 当K1键按下后,首先使蜂鸣器响一声,然后使LED1-LED8完成3种闪亮的花样(自己定义),每一种花样循环 3次,然后周而复始。

六、keil代码:

/*当K1键按下后,首先使蜂鸣器响一声,然后使LED1-LED8完成3种闪亮的花样(自己定义),每一种花样循环 3次,然后周而复始。*/ #include sbit P2_0=P2^0;//接蜂鸣器 sbit P2_7=P2^7;sbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P1_4=P1^4;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;

void DELAY(int time)//延时 { while(time--){} }

void BUZ_ON(){ if(P2_7==0)

{ P2_0=1;} else { P2_0=0;}

}

void F1(void){ int i;char data_group_mide[5]={0x00,0x18,0x24,0x42,0x81};//向两边延伸 for(i=0;i<5;i++){ P1=data_group_mide[i];DELAY(20000);}

P1=0x00;

} void F2(void){ int i;char data_group_left[8]={0xFF,0x7F,0x3F,0x0F,0x07,0x03,0x01,0x00};//向左延伸 for(i=0;i<8;i++){ P1=data_group_left[i];DELAY(20000);}

P1=0x00;

} void F3(void){ int i;char date_group_right[8]={0x00,0x01,0x03,0x07,0x0f,0x3f,0x7f,0xff};//向右延伸 for(i=0;i<8;i++){ P1=date_group_right[i];DELAY(20000);}

P1=0x00;

} void main(){

unsigned int i;//每种花样循环三次

P2_0=0;

P2_7=1;

BUZ_ON();

P1=0x00;while(P2_7==0)

{

for(i=0;i<3;i++)//花样1

{F1();}

for(i=0;i<3;i++)//花样2

{F2();}

for(i=0;i<3;i++)//花样3

{F3();}

}

}

三、protues电路图:

四、实验截图:

五、实验小结:

通过本次实验,我们熟悉了protues的编译环境,对以后的单片机学习有很大帮助。

实验五

一、实验题目: 程序启动后4位LED显示器滚动显示“-”,每按下1次K1键后,首先使蜂鸣器响一声。然后,依次使LED滚动显示CNT的计数值(0-9)。

二、Keil代码:

/*程序启动后4位LED显示器滚动显示“-”,每按下才1次K1键后,首先使蜂鸣器响一声。然后,依次使LED滚动显示CNT的计数值(0-9)。

1、按键K1采用中断来管理。(INT0采用边沿触发)

2、中断服务程序完成四个功能:

1)消除按键K1抖动。

2)CNT计数。

3)查表将计数值转换成LED显示器的段代码。

4)将段代码分别放入4个显示缓冲单元。*/ #include #define uchar unsigned char #define uint unsigned int sbit P2_7=P2^7;sbit P3_3=P3^3;uchar CORDING[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xf9,0xa4,};//0,1,2,3,4....9,0,1,2的段码 intdelayms(uint t){

uint n;while(--t){ n=200;while(--n);};return 0;}

int main(){ uint CNT=0;

P2_7=0;

P3_3=1;P1=0xF7;while(1)

{ if(P3_3==0)

{

uint i;

CNT++;

P2_7=1;delayms(100);for(i=1;i<5;i++)

//4位

{

P1=CORDING[CNT-1];

switch(i)

{

//点亮第1位

//点亮第2位

//点亮第3位

//点亮第4位

delayms(100);

}

case

case

case

case }

P2=0x00;1:P2=0x01;break;2:P2=0x02;break;3:P2=0x04;break;4:P2=0x08;break;

// 熄灭

if(CNT>10){

CNT=CNT-10;}

}

三、protues电路图:

P2_7=0;} return 0;}

四、实验截图:

五、实验总结:

通过本次实验,我们熟悉了CNT计数,学会了如何使LED灯上显示0-9数字。

实验六

一、实验题目:

两个数码管,K1,K2两个按键,完成K1启动计数,K2暂停计数,每一秒钟数码管增加1,60秒钟后,数码管回归0,重新计数。

二、keil代码:

/*两个数码管,K1,K2两个按键,完成K1启动计数,K2暂停计数,每一秒钟数码管增加1,60秒钟后,数码管回归0,重新计数。按键K1,K2采用中断来管理。(INT0采用边沿触发)*/ #define uchar unsigned char #define uint unsigned int #include uchar CNT=0;uchar

m=0;sbit P3_7=P3^7;sbit P3_2=P3^2;sbit P0_0=P0^0;uchar CORDING[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0,1,2,3,4....9的段码 void Delay(uint a){

while(--a){};

} voidintproc()interrupt 0 {

TR0=0;}

void Time0()interrupt 1 {

m++;

//中断一次,m加1

if(m==20){

m=0;

//中断次数清零 CNT++;//秒加1 if(CNT==60){ CNT=0;}

P1=CORDING[CNT/10];//显示十位 Delay(10);

P2=CORDING[CNT%10];//显示个位 Delay(10);

} } voidinit(){

TMOD=0x01;

//使用定时器T0 使用方式1 TH0 = 0x3c;

TL0 = 0xb0;

ET0=1;TR0=1;EX0=1;IT0=1;EA=1;}

void main(){

P1=0x3f;

P2=0x3f;

P3_7=1;while(1)

{ if(P3_7==0)//50ms中断一次 //控制是否开启

{ init();

} }

三、protues电路图:

}

四、实验截图:

五、实验总结:

本次实验,我们用到了中断,按键K1,K2采用中断来管理。(INT0采用边沿触发),通过本次实验加强了中断的学习,更加有利于单片机的学习。

实验七

一、实验题目:晶振12MHz,波特率1200,程序启动后单片机主动发出Hello Server,PC使用串口助手应答单片机,单片机收到数据后,不做任何修改返回PC。

二、keil代码: #include #define uchar unsigned char #define uint unsigned int

uchar code table[]=“HELLO SERVER!”;uint flag = 0;uchara,b;voidinit(){

}

voidSendByte(ucharch){ SBUF = ch;TMOD = 0x20;TH1 = 0xFD;TL1 = 0XFD;SCON = 0X50;TR1 = 1;EA = 1;ES = 1;

} while(!TI);TI = 0;voidSendString(uchar code *str){

}

void main(){

init();

SendString(“HELLO SERVER!”);while(1){

if(flag == 1){

ES = 0;SBUF = a;while(!TI);TI = 0;while(*str)SendByte(*str++);

}

} ES = 1;flag = 0;

}

voidser()interrupt 4 {

}

if(RI == 1){

} RI = 0;a = SBUF;flag = 1;

三、protues电路图:

四、实验截图:

六、实验总结:

本次实验,我们利用了中断来实现,通过本次实验我们对中断有了更加深刻的了解,让我们在以后的为以后的学习之中打下了一定的基础。

第二篇:单片机实验报告[范文模版]

实 实 验 验 报 报 告

实验课程:

单片机原理及应用

级:

自动化 2 班

号:

名:

师:

成绩:

实 验 日 期 :

****年**月**日

实验名称:

实验 1-—计数显示器

一、实验目得: 学习Proteus 软件得使用,掌握单片机原理图得绘图方法。

二、实验内容:

ﻩ1、绘制“计数显示器”电路原理图;2、利用提供得hex 文件验证此电路得运行效果。

三、实验要求:

提交得实验报告中应包括:1、绘图方法简述,要求说明元件与电源得选取、摆放及属性编辑,总线与标签得画法等内容;2、电路原理图;3、仿真运行效果展示,要求就仿真文件加载方法及 3~4幅运行截图进行简要说明;4、实验小结,说明遇到得主要问题或实验 1 体会等.参考电路原理图如下:

元件类别 电路符号 元件名称 Microprocessor ICs “U1“ 80C51 Miscellaneous “X1”/12MHz CRYSTAL Capacitors “C1”~“C2”/1nF CAP Capacitors “C3”/22μF CAP—ELEC Resistors Packs “RP1“/7—100Ω RESPACK—7 Resistors “R1"/100Ω RES Optoelectronics “LED1”~“LED2” 7SEG--CAT-GRN Switches & Relays “BUT” BUTTON 1、、及 编程思路及 C51 源程序:

2、电路原理图:

3、仿真运行效果展示:

4、实验小结 :

熟悉Proteus 软件,了解软件得结构组成与功能;学习ISIS 模块得使用方法,学会设置图纸、选元件、线画总线、修改属性等基本操作;学会可执行文件 加载及程序仿法;理解Proteus在单片机开发中得作用,完成单片机电路原 理图得绘制. 实验名称:

实验 2——LED 指示灯循环控制

一、实验目得 熟悉μVision3 编译软件、掌握 C51编程与调试方法。

二、

实验内容 1、按照教材 P243 得图 A、34,绘制实验二电路原理图; 2、编写 C51 程序,实现 8 个 LED 灯依次点亮得功能: P0、0→P0、1→ P0、2→P0、3→ ┅ →P0、7→P0、6→P0、5→ ┅ →P0、0 得顺序,无限循环,间隔约50ms; 3、观察仿真结果,完成实验报告。

三、

实验要求 1、采用两种加载并运行可执行文件得方法,即proteus独立运行与prote

us + Keil 联合运行,体会其中得差异与意义;2、练习采用单步、断点以及监视窗等手段进行程序调试得方法;3、观察仿真结果,完成实验报告:绘制得电路原理图、编程思路分析及 C51源程序、调试过程简述,仿真运行效果以及实验小结。、电路原理图:

及 2、编程思路及 C51 源程序:、仿真运行效果:、实验小结 :

通过本次实验我熟悉 uVision3 编译软件了解软件得结构组成与功能学习C51 语言得程序设计方法)学会在 uVision3中进行 C51 程序录入、编译、与 调试理解 Proteus 与 Keil 联合得仿真原理实现 LED 指示灯循环控制功能。

更好得将 C 语言与 C51 语言联系在了一起)学到得知识能准确得利用了出来。

实验名称:

实验3——指示灯与数码管得中断控制

一、实 验目得 掌握外部中断得工作原理,学会中断程序设计.二、实验内容 1、按照教材帕图 A、53,绘制实验四电路原理图;2、要求采用外部中断原理完成本次实验,其中按键 K1、K2 均设置为下降沿触发方式,自然优先级; 3、编写 C51 程序实现如下功能:开机后 D1灭灯,LED1黑屏,随后单击 K1→D1状态反转,单击 K2 →LED1 从 0 开始循环显示0~F 字符。

4、观察仿真结果,完成实验报告。

三、

实验要求 提交得实验报告中应包括:电路原理图,外部中断工作原理阐述(以 K1 为例说明中断响应过程),C51 源程序(含流程图与注释语句),运行效果(含运行截图

与说明),实验小结. 1、电路原理图 :

2、外部中断工作原理阐述:

持续按下 K1 则 D1 将“亮→灭→亮→灭→„→亮→灭如此循环,表明实现了 K1 对应于 D1 状态反转这个功能;持续按下持续按 K2 则数码显示管依次显 示 1-F,实现了 K2 对应于 0~F 间得数码管加一计数显示.

3、、及 编程思路及 C51 源 源 程序:、仿真运行效果:

5、实验小结:

通过实验对 Protues 有了更多得了解,同时了解到中断系统在实际中得更好 应用。经过编程操作起来更加熟练能很快得完成绘图,编程时也得心应手,能熟练得运用软件找出自己所编程中得语法问题及其她问题,并以改正。

实验名称:

实验4—-电子秒表显示器

一、实 实 验目得 掌握定时/计数器得中断法工作原理,熟悉 C51 编程与调试方法

二、实验要求:

1、实验电路原理图如教材 P260 A、65 图所示.程序开始时显示“00”;当1s 产生时,秒计数加1;秒计数到 59 后,自动从“00”开始。

2、采用12MHz晶振频率,T0 定时方式 1、50ms 定时中断法编程(1s 需要经过 20 软循环)(流程图与参考程序模版如下所示).//定时中断方式实现得电子秒表

15()件文头ﻩ(定义无符号字符型变量 t—-中断次数计数器,并赋初值0(定义无符号字符型变量 second—-秒计数器,并赋初值 0(定义位于 ROM 区得无符号字符型数组table-—显示字模)timer0()

(中断函数关键词){ ﻩ()0T 闭关ﻩ(初值重装载 0x3cb0)

()1增器数计数次断中ﻩ {)02==t(fiﻩﻩ

// 秒1于当相,次 02断中若ﻩ

;0=tﻩﻩﻩﻩﻩﻩﻩﻩ //中断次数计数器清零 ﻩ

;++dnocesﻩﻩ ﻩ // 零清器数计秒ﻩ

}()零清,06 到达值器数计秒若ﻩﻩ()值示显得 dnoces 量变出输别分口 2P与0Pﻩ()0T动启ﻩﻩ} main(){

;]01/dnoces[elbat=0Pﻩﻩ // 值示显出输别分口 2P 与 0Pﻩ

;]01%dnoces[elbat=2Pﻩ(定义T0 定时方式 1—-TMOD)05()0LT与0HT——载加0bc3x0值初出溢 smﻩ()AE,0TE——化始初断中ﻩ(启动 T0)

(死循环)3、编程思路及C1 51 源程序: :

4、仿真运行效果:

5、实验小结 :

本次实验进行得比较顺利,根据指导材料中提供得流程图完成了源程序得编 写,成功生成了、hex文件,经过仿真运行达到了预期得实验结果.通过本次得 实验,我更加深入得了解到单片机定时/计数功能实现得机理,通过与单片机中 断功能得结合,可以完成更多得预期功能。但就是进过讨论我也发现,程序还就是存 在很大得缺陷,想要实现更加准确实现计时功能还需综合利用各种知识完善程 序。

第三篇:单片机实验报告

《单片机原理及应用》

实 验 报 告

2017—2018学年第一学期

班级: 152 专业: 电子科学与技术 姓名: 子路 学号: 教师:

实验一:Keil C51

一、实验目的

1、熟悉Keil C51单片机应用开发系统

2、熟悉Keil C51的调试技巧

二、实验内容

1、安装好了Keil软件以后,我们打开它。打开以后界面如下:

2、我们先新建一个工程文件,点击“Project->New Project„”菜单,如下图:

3、选择工程文件要存放的路径 ,输入工程文件名 LED, 最后单击保存.4、在弹出的对话框中选择 CPU 厂商及型号

5、选择好 Atmel 公司的 AT89S52 后 , 单击确定

6、在接着出现的对话框中选择“是”。

7、新建一个 C51 文件 , 单击左上角的 New File 如下图所示:

8、保存新建的文件,单击SAVE如下图:

9、在出现的对话框中输入保存文件名MAIN.C(注意后缀名必须为.C),再单击“保存”,如下图:

10、保存好后把此文件加入到工程中方法如下 : 用鼠标在 Source Group1 上单击右键 , 然后再单击 Add Files to Group ‘Source Group 1' 如下图:

11、选择要加入的文件 , 找到 MAIN.C 后 , 单击 Add, 然后单击 Close

12、在编辑框里输入如下代码:

13、到此我们完成了工程项目的建立以及文件加入工程 , 现在我们开始编译工程如下图所示 : 我们先单击编译, 如果在错误与警告处看到 0 Error(s)表示编译通过:

14、生成.hex 烧写文件,先单击Options for Target,如图:

15、在下图中,我们单击 Output, 选中 Create HEX F。再单击“确定”

16、打开文件夹‘实验1’,查看是否生成了HEX文件。如果没有生成,在执行

一遍步骤10到步骤12,直到生成。

三、实验工具(软件、硬件等)

1、Keil

2、计算机

实验二:Proteus软件学习

一、实验目的

1、了解Proteus的基本功能

2、熟悉Proteus的设计环境Preoteus ISIS及第三方编译工具Keil

3、掌握Proteus中实现单片机系统设计与仿真的步骤与方法

二、实验内容

设计与仿真的开发过程

Proteus强大的单方机系统设计与仿真功能,使之成为单片机系统应用开发和改进手段之一。

开发的整个过程都是在计算机上完成的,其过程一般分为三步: 1)Proteus 电路设计:在ISIS平台上进行单片机系统电路设计、选择元器件、接插件、连接电路和电气现则检查等。

2)Proteus 源程序设计和生成目标代码文件:在ISIS平台上或借助第三方编译工具进行单片机系统程序设计、编辑、汇编编译、代码级调试,最后生成目标代码文件(*hex)。

3)Proteus仿真:在ISIS平台上将目标代码文件加载到单片机系统中,由此实现系统实时交互与协同伤真。

三、实验工具(软件、硬件等)

1、载有Proteus的计算机一台

实验三:LED流水灯

一、实验目的

1、用Keil软件编写程序并利用开发板仿真

2、学习LED灯工作原理

二、实验内容

延时实现LED流水灯效果P2口八个灯作跑马灯。采用了寄存器存中间数。

三、实验工具(软件、硬件等)1.载有Keil软件的计算机一台 2.开发板一套

四、实验结果及分析

实验四:静态数码管

一、实验目的

1、用Keil软件编写程序并利用开发板仿真

2、学习静态显示管工作原理

二、实验内容

静态数码管流动显示0~9

二、实验工具(软件、硬件等)1.载有Keil软件的计算机一台 2.开发板一套

四、实验结果及分析

实验五:按键移位动态显示

一、实验目的

1、用Keil软件编写程序并利用开发板仿真

2、学习静态显示管工作原理

二、实验内容

静态显示管,按键不同显示不同

三、实验工具(软件、硬件等)1.载有Keil软件的计算机一台 2.开发板一套

四、实验结果及分析

实验六:中断INT0+INT1

一、实验目的

1、用Keil软件编写程序并利用开发板仿真

2、学习中断INT0和INT1的工作原理

二、实验内容

试验数码管上显示外部中断计数,用单片机脚直接控制数码管和外部中断使用

三、实验工具(软件、硬件等)1.载有Keil软件的计算机一台 2.开发板一套

四、实验结果及分析

第四篇:单片机实验报告

目录

第一章单片机简介....................................................2 第二章

实验要求..................................................3 第三章实验设备......................................................3 第四章实验安排......................................................4 第五章实验内容......................................................4

LED灯实验.......................................................4 步进马达试验....................................................5 独立按键控制LED实验............................................7 矩阵键盘实验....................................................9 静态数码管实验.................................................12 动态数码管实验.................................................14 NE555脉冲发生器实验(定时/计数器).............................16 RS232串口通信实验(接收与发送)..................................21 第六章收获体会.....................................................25

单片机实验报告

第一章单片机简介

单片机也被称为微控制器(Microcontroller),是因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!

单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。

1.SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。

2.MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。

Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。

3.单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素,就是寻求

单片机实验报告

应用系统在芯片上的最大化解决;因此,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。

MCS51系列微控制器应用广泛,在家电、汽车甚至航空等领域都有其活跃的身影。然而,普通51系列微控制器内部资源有限,像我用Proteus构建微控制器虚拟实验室选用的AT89C52只有三个定时器、一个全双工的串行口和中断控制,并且其数据处理能力有限,不适合对大量数据进行复杂分析和运算。

因此,在不重新选型(可选用SoC)的前提下,为实现我们所需要的功能,就需要进行外围扩展。针对微控制器的特点,我们首先考虑串行扩展,因为微控制器的I/O引脚有限,并行扩展一则外围芯片面积比较大,二则对抑制EMI不利。

第二章 实验要求

1.学习Keil C51集成开发工具的操作及调试程序的方法,包括:仿真调试与脱机运行间的切换方法

2.熟悉TD-51单片机系统板及实验系统的结构及使用

3.进行MCS51单片机指令系统软件编程设计与硬件接口功能设

4. 学习并掌握Keil C51软件联机进行单片机接口电路的设计与编程调试

5.完成指定MCS51单片机综合设计题

第三章实验设备

1.HC600S-51单片机开发板 2.Keil C51 3.普中自动下载软件

第四章 实验安排

1.LED灯实验

单片机实验报告

2.步进马达试验

3.独立按键控制LED实验 4.矩阵键盘实验 5.静态数码管实验 6.动态数码管实验

7.NE555脉冲发生器实验(定时/计数器)8.RS232串口通信实验(接收与发送)

第五章 实验内容

一、LED灯实验

1.基本要求

利用位移循环指令实现LED灯的闪烁 2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图

4.电路原理图

单片机实验报告

5.程序

#include #define uint unsigned int void d(uint x){uint n;for(;x>0;x--){for(n=0;n<123;n++){;} }}

main(){unsigned int i;while(1)

{for(i=0,P0=1;i<4;i++){d(500);P0=(P0<<2);}}}

二、步进马达试验

1.基本要求

编程实现马达的正反转,调速等功能 2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)

单片机实验报告

图一 图二

4.电路原理图

上图图二 5.程序

#include “reg52.h” #define speed 2 sbit PH1 = P1^0;

//定义管脚 sbit PH2 = P1^1;sbit I01 = P1^2;sbit I11 = P1^3;sbit I02 = P1^4;sbit I12 = P1^5;

void delay(int time);

void Go(){ //A

PH1 = 0;//PH1为0 则A线圈为反向电流

I01 = 0;I11 = 0;

//以最大电流输出

PH2 = 0;//PH2为0 则B线圈为反向电流

I02 = 1;I12 = 1;

//输出0 delay(speed);//圈为反向电流

I01 = 1;//输出0 I11 = 1;

PH2 = 1;//PH2为1 则B线圈为正向电流

I02 = 0;//以最大电流输出

I12 = 0;

delay(speed);//B PH1 = 1;

//PH1为1 则A线圈为

正向电流

I01 = 0;

//以最大电流输出

I11 = 0;

PH2 = 1;//PH2为1 则B线圈为正

向电流

I02 = 1;//输出0 I12 = 1;

delay(speed);

PH1 = 1;

//PH1为1 则A线圈为正向电流

I01 = 1;I11 = 1;

PH2 = 0;

//PH2为0 则B线圈为反向电流

I02 = 0;I12 = 0;delay(speed);}

void delay(int time){

int i,j;

for(j=0;j <= time;j++)

for(i =0;i <= 120;i++);}

void main(){

while(1)

{

Go();//步进电机运行

} }

单片机实验报告

三、独立按键控制LED实验

1.基本要求

通过编程控制8个独立按键分别控制8个LED灯的开关 2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)

图一 图二

4.电路原理图 上图图二 5.程序

#include #include #define GPIO_KEY P1 //独立键盘用

P1口

#define uchar unsigned char #define uint unsigned int

void Delayms(unsigned int c);

//延时10ms uchar Key_Scan();void main(void){

unsigned char ledValue, keyNum;

ledValue = 0x01;

while(1)

{

keyNum = Key_Scan();//扫描键

switch(keyNum)

{

case(0xFE):

//返回按

键K1的数据

ledValue = 0x01;

break;

单片机实验报告

case(0xFD):

ledValue = 0x02;

break;case(0xFB):

ledValue = 0x04;

break;case(0xF7):

ledValue = 0x08;

break;case(0xEF):

ledValue = 0x10;

break;case(0xDF):

ledValue = 0x20;

break;case(0xBF):

ledValue = 0x40;

break;case(0x7F):

ledValue = 0x80;

//返回按键K2的数据

//返回按键K3的数据

//返回按键K4的数据

//返回按键K5的数据

//返回按键K6的数据

//返回按键K7的数据

//返回按键K8的数据

break;default:

break;

}

GPIO_LED = ledValue;//点亮LED灯

}

}

uchar Key_Scan(void)//键盘扫描函数 { uchar i,n=0xff;

if(P1==0xff)goto Scan_r;//无键按

下,返回

goto Scan_r;Scan_1:

while(P1!=0xff);//等待键释放

Delayms(10);Scan_r:

return n;}

void Delayms(uint x){

uint n;

for(;x>0;x--)

{

for(n=0;n<123;n++)

{;}

} }

四、矩阵键盘实验

1.基本要求

编程由16个矩阵按键控制数码管显示相应的数值 2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。

3.接线图

单片机实验报告

见下图图一

图一 图二

4.电路原理图

见上图图二 5.程序

#include #define uchar unsigned char #define uint unsigned int #define uint unsigned int #define GPIO_LED P0

uchar ScanKey(void);void Delayms(uint x);main(){ unsigned char ledValue;uchar i;ledValue = 0x01;loop: i = ScanKey();

switch(i)

{ case 0xee:

ledValue = ~0x3F;

break;

case 0xde:

ledValue = ~0x06;

break;

case 0xbe:

ledValue = ~0x5B;

break;

case 0x7e:

ledValue = ~0x4F;

break;

case 0xed:

ledValue = ~0x66;

break;

case 0xdd:

ledValue = ~0x6D;

break;

单片机实验报告

case 0xbd:

ledValue = ~0x7D;

break;

case 0x7d:

ledValue = ~0x07;

break;

case 0xeb:

ledValue = ~0x7F;

break;

case 0xdb:

ledValue = ~0x6F;

break;

case 0xbb:

ledValue = ~0x77;

break;

case 0x7b:

ledValue = ~0x7C;

break;

case 0xe7:

ledValue = ~0x39;

break;

case 0xd7:

ledValue = ~0x5E;

break;

case 0xb7:

ledValue = ~0x79;

break;

case 0x77:

ledValue = ~0x71;

break;

}

GPIO_LED = ledValue;i=0;goto loop;}

void Delayms(uint x){uint n;for(;x > 0;x--)

{ for(n=0;n<123;n++)

{;}

} }

uchar ScanKey(void)//键盘扫描函数 { uchar i,n=0xff;

P1=0xf0;

if(P1==0xf0)goto Scan_r;//无键按下,返回

for(i=0,P1=0xfe;i<4;i++)

{ if((P1&0xf0)!=0xf0)

{ Delayms(10);

if((P1&0xf0)!=0xf0)

{ n=

P1;

goto

Scan_1;}

}

P1=(P1<<1)+1;

//扫描下

一行

} goto Scan_r;Scan_1:

单片机实验报告

P1=0xf0;while((P1&0xf0)!=0xf0);//等待键

释放

Delayms(10);

Scan_r:

P1=0xff;return n;} }

五、静态数码管实验

1.基本要求

编程使数码管显示字符0-F 2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线框图(图一)

图一

单片机实验报告

图二

4.电路原理图

见上图图二 5.程序

#include #define uchar unsigned char #define uint unsigned int void Delayms(uint x);uchar code LED7Code[]=

{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D, ~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};main(){

unsigned int LedNumVal;//定义变量 while(1)

{

// 将字模送到P0口显示

LedNumVal++;

P0 = LED7Code[LedNumVal%16];

Delayms(1000);

//调用延时程序

}

}

单片机实验报告

void Delayms(uint x){uint n;for(;x > 0;x--)

{ for(n=0;n<123;n++)

{;}

} }

六、动态数码管实验

1.基本要求

编程实现8个数码管的动态扫描。通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)

图一 图二

单片机实验报告

图三

4.电路原理图

见上图图

二、图三 5.程序

#define uint unsigned int void Dsplay();void Delayms(uint x);uchar mDS[6];uchar code cDsCode[]=

{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};

void main(){ uchar i;

for(i=0;i<6;i++)mDS[i]=i+1;

loop:

Dsplay();

goto loop;}

void Dsplay()//动态扫描显示

{uchar i;

for(i=0,P2=0x01;i<6;i++)

{ P1=cDsCode[mDS[i]];//输出段

Delayms(1000);

P2=P2<<1;

//选通下一位

}

P2=0x00;

//关闭位选通 }

void Delayms(uint x){uint n;for(;x > 0;x--)

{ for(n=0;n<123;n++)

{;}

} }

七、NE555脉冲发生器实验(定时/计数器)

1.基本要求

2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图

4.电路原理图

5.程序

#include #include“lcd.h” #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar code EN_CHAR1[16]={“

CYMOMETER

”};uchar code EN_CHAR2[16]={“FREQ:

HZ”};

单片机实验报告

void TIMER_Configuration();//初始化定时器 ulong Freq;

//用来存放要显示的频率值 ulong TimeCount;//用于计算1S钟的

void main(){ uchar i, freqValue[6];

LcdInit();TIMER_Configuration();for(i=0;i<16;i++){

LcdWriteData(EN_CHAR1[i]);}

LcdWriteCom(0xc0);//第二行显示

for(i=0;i<16;i++){

LcdWriteData(EN_CHAR2[i]);}

while(1){

if(TR0==0)

//当计数器停下的时候,表明计数完毕

{

Freq = Freq + TL1;

//读取TL的值

Freq = Freq +(TH1 * 256);//读取TH的值

LcdWriteCom(0xc8);

//--求频率的个十百千万十万位--//

freqValue[0]='0'+Freq%1000000/100000;

freqValue[1]='0'+Freq%100000/10000;

freqValue[2]='0'+Freq%10000/1000;

freqValue[3]='0'+Freq%1000/100;

freqValue[4]='0'+Freq%100/10;

freqValue[5]='0'+Freq%10;

for(i=0;i<5;i++)//从最高位开始查找不为0的数开始显示(最低位为0显示0)

{

if(freqValue[i]==0x30)

{

freqValue[i]=0x20;//若为0则赋值空格键

}

else

单片机实验报告

{

break;

}

}

for(i=0;i<6;i++)

{

LcdWriteData(freqValue[i]);

}

Freq=0;//将计算的频率清零

TH1=0;//将计数器的值清零

TL1=0;

TR0=1;//开启定时器

TR1=1;//开启计数器

} } }

void TIMER_Configuration(){ TMOD=0x51;TH0=0x3C;TL0=0xB0;ET0=1;ET1=1;EA=1;TR0=1;TR1=1;} void Timer0()interrupt 1 { TimeCount++;if(TimeCount==20)//计时到1S {

TR0=0;

TR1=0;

TimeCount=0;

}

//--12MHZ设置定时50ms的初值--// TH0=0x3C;TL0=0xB0;} void Timer1()interrupt 3 {

单片机实验报告

//--进入一次中断,表明计数到了65536--// Freq=Freq+65536;

}

#include“lcd.h”

void Lcd1602_Delay1ms(uint c)

//误差 0us {

uchar a,b;for(;c>0;c--){

for(b=199;b>0;b--)

{

for(a=1;a>0;a--);

}

}

} #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com)

//写入命令 { LCD1602_E = 0;

//使能

LCD1602_RS = 0;

//选择发送命令

LCD1602_RW = 0;

//选择写入

LCD1602_DATAPINS = com;

//放入命令

Lcd1602_Delay1ms(1);//等待数据稳定

LCD1602_E = 1;

//写入时序

Lcd1602_Delay1ms(5);

//保持时间

LCD1602_E = 0;} #else

void LcdWriteCom(uchar com)

//写入命令 { LCD1602_E = 0;//使能清零

LCD1602_RS = 0;//选择写入命令

LCD1602_RW = 0;//选择写入

LCD1602_DATAPINS = com;// Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);

单片机实验报告

LCD1602_DATAPINS = com << 4;//发送低四位

Lcd1602_Delay1ms(1);

LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS

void LcdWriteData(uchar dat)

//写入数据 { LCD1602_E = 0;//使能清零

LCD1602_RS = 1;//选择输入数据

LCD1602_RW = 0;//选择写入

LCD1602_DATAPINS = dat;//写入数据

Lcd1602_Delay1ms(1);

LCD1602_E = 1;

//写入时序

Lcd1602_Delay1ms(5);

//保持时间

LCD1602_E = 0;} #else void LcdWriteData(uchar dat)

//写入数据 { LCD1602_E = 0;//使能清零

LCD1602_RS = 1;

//选择写入数据

LCD1602_RW = 0;

//选择写入

LCD1602_DATAPINS = dat;

Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//写入低四位

Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x38);//开显示

单片机实验报告

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点 } #else void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x32);//将8位总线转为4位总线

LcdWriteCom(0x28);//在四位线下的初始化

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点 } #endif

八、RS232串口通信实验(接收与发送)

1.基本要求

a.通过实验了解串口的基本原理及使用,理解并掌握对串口进行初始化; b.使用串口调试助手(Baud 9600、数据位

8、停止位

1、效验位无)做为上位机来做收发试验;

c.利用串口调试助手中字符串输入进行数据发送,接受窗口显示收到的数据。2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图

单片机实验报告

4.电路原理图

5.程序

#include #include“lcd.h” unsigned char ChCode[14] = “Received data:”;void UsartConfiguration();void main(){ unsigned char i, receiveData;LcdInit();for(i=0;i<14;i++){

LcdWriteData(ChCode[i]);} UsartConfiguration();while(1){

if(RI == 1)

//查看是否接收到数据

{

receiveData = SBUF;//读取数据

单片机实验报告

RI = 0;

//清除标志位

LcdWriteCom(0xC0);

LcdWriteData('0' +(receiveData / 100));

// 百位

LcdWriteData('0' +(receiveData % 100 / 10));// 十位

LcdWriteData('0' +(receiveData % 10));

// 个位

} } } void UsartConfiguration(){ SCON=0X50;

//设置为工作方式1 TMOD=0X20;//设置计数器工作方式2 PCON=0X80;

//波特率加倍

TH1=0XF3;

//计数器初始值设置,注意波特率是4800的TL1=0XF3;TR1=1;

//打开计数器 }

#include“lcd.h”

void Lcd1602_Delay1ms(uint c)

//误差 0us {

uchar a,b;for(;c>0;c--){

for(b=199;b>0;b--)

{

for(a=1;a>0;a--);

}

}

} #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com)

//写入命令 { LCD1602_E = 0;

//使能

LCD1602_RS = 0;

//选择发送命令

LCD1602_RW = 0;

//选择写入

LCD1602_DATAPINS = com;

//放入命令

Lcd1602_Delay1ms(1);//等待数据稳定

LCD1602_E = 1;

//写入时序

单片机实验报告

Lcd1602_Delay1ms(5);

//保持时间

LCD1602_E = 0;} #else

void LcdWriteCom(uchar com)

//写入命令 { LCD1602_E = 0;//使能清零

LCD1602_RS = 0;//选择写入命令

LCD1602_RW = 0;//选择写入

LCD1602_DATAPINS = com;Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com << 4;//发送低四位

Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif

#ifndef LCD1602_4PINS

void LcdWriteData(uchar dat)

//写入数据 { LCD1602_E = 0;//使能清零

LCD1602_RS = 1;//选择输入数据

LCD1602_RW = 0;//选择写入

LCD1602_DATAPINS = dat;//写入数据

Lcd1602_Delay1ms(1);LCD1602_E = 1;

//写入时序

Lcd1602_Delay1ms(5);

//保持时间

LCD1602_E = 0;} #else void LcdWriteData(uchar dat)

//写入数据 { LCD1602_E = 0;

//使能清零

LCD1602_RS = 1;

//选择写入数据

LCD1602_RW = 0;//选择写入

LCD1602_DATAPINS = dat;

Lcd1602_Delay1ms(1);LCD1602_E = 1;

//写入时序

Lcd1602_Delay1ms(5);

单片机实验报告

LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//写入低四位

Lcd1602_Delay1ms(1);LCD1602_E = 1;

//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif

#ifndef LCD1602_4PINS void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x38);//开显示

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点 } #else void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x32);//将8位总线转为4位总线

LcdWriteCom(0x28);//在四位线下的初始化

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点 } #endif

单片机实验报告

第六章 收获体会

本次微控制器综合设计基本上使用了所选微控制器的所有资源,进一步熟悉和加深了对中断、定时器和串行通信的理解和使用。我觉得软件实验就是让我们初学者熟悉keil的使用,然后复习下汇编的思想和掌握程序的流程,所以软件实验可以很快的完成,并且慢慢熟悉调试的强大功能。硬件设计中,仿真让我很有感触,感觉蛮好玩的,可以摒弃麻烦的实验硬件自己在寝室玩而且不受硬件状态的限制,即便出错了也不会损坏。当然更重要的是这种好习惯,仿真完后再去在实验板上验证会比直接要来的确切而且便捷,至少不要老是去插拔线。在做实验中在同学指导下我试用C语言来编写程序,确实发现比汇编语言容易编写也容易理解,以前的实验还是有参考资料的习惯,现在什么都开始自己写感觉还是很有成就感的,当然这是基于程序本身就那么几行很容易编写,也不是说参考不好。总而言之,这学期的单片机实验还是收获颇丰的。相信在以后的实验学习实践工作中都会有个潜移默化的作用的。

第五篇:单片机实验报告

单片机实验报告

一、实验目的

1.熟练使用Keil、Protues两款软件 2.通过上机操作,增强个人动手实践能力 3.加深对理论知识的理解

4.培养运用汇编语言进行初步编写程序的能力

二、实验内容

1.将片外RAM3050-306FH中数据转移至片内70-8FH中。

要求:可以从Keil或Protues上看到RAM的数据转移结果。2.设计一个外部中断触发流水灯系统:当外部中断来临时,启动流水灯,即令P2口的LED轮流循环点亮。

要求:开发板或Prrotues演示

3.将片内存储器80H中存放的BCD码转换为ASCII码,要求使用表格查询技术。

要求:在Keil或Protues上看到数据转换结果。

4.各使用中断方式和查询方式设计一个方波发生器,频率为50HZ。

要求:Protues使软件间示波器显示方波。

三、实验程序

1.将片外RAM3050-306FH中数据转移至片内70-8FH中

ORG 0000H AJMP MAIN 上电,转向主程序

ORG 0030H 主程序入口

MAIN: MOV DPTR,#3050H 数据指针指向地址3050H MOV A,#04H 将立即数04H送A寄存器

MOV R0,#20H NEXT: MOVX @DPTR,A INC DPTR 数据指针DPTR自加一

DJNZ R0,NEXT 判断是否跳转到NEXT或继续向下执行

MOV DPTR,#3050H MOV R0,#70H MOV R2,#20H NEXT1: MOVX A,@DPTR MOV @R0,A INC DPTR INC R0 DJNZ R2,NEXT1

SJMP $ 等待

END 2.设计一个外部中断触发流水灯系统:当外部中断来临时,启动流水灯,即令P2口的LED轮流循环点亮 ORG 0000H SJMP MAIN 上电,转向主程序

ORG 0003H 外部中断0向量入口

AJMP INSER ORG 0030H 主程序入口

MAIN: SETB EX0 SETB IT0

SETB EA CPUHERE: SJMP HERE ORG 0200H INSER: MOV R2,#08H MOV A,#01H NEXT: MOV P2,A LCALL DELAY RL A DJNZ R2,NEXT NEXT或继续向下执行

RETI DELAY: MOV R3,#0FFH DEL2: MOV R4,#0FFH DEL1: NOP

允许外部中断0中断 选择边沿触发方式 开中断 等待中断 设置循环次数 赋初值,设置高电平亮 将初值送往P2口 延时 左移一位

判断循环次数,是否跳转到中断返回 延时程序 DJNZ R4,DEL1 DJNZ R3,DEL2 RET END 3.将片内存储器80H中存放的BCD码转换为ASCII码,要求使用表格查询技术 ORG 0000H LJMP MAIN ORG 0030H主程序起始地址 MAIN: MOV 80H,#05H 将立即数50H转送内存单元80H MOV A,80H 将内存单元80H中的内容送寄存器A MOV DPTR,#TAB MOVC A,@A+DPTR A寄存器内容加指针偏移量后送A寄存器 MOV 80H,A RET TAB: DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H 4.1中断方式产生50HZ方波

ORG 0000H

AJMP MAIN

ORG 0030H 主程序入口 MAIN: MOV TMOD,#10H 设置定时器工作模式为模式1 MOV TH1,#0D8H 装入T1计数初值

MOV TL1,#0F0H

SETB ET1 开中断

SETB EA CPU开中断

SETB TR1 启动定时器T1 HERE: SJMP HERE 等待中断 ORG 001BH T1中断向量地址

CLR TF1 将TF1清零

CPL P2.0 P2.0取反输出

MOV TH1,#0D8H 重装初值

MOV TH0,#0F0H

RETI;中断返回

END 4.2 查询方式产生50HZ方波

ORG 0000H

AJMP MAIN

ORG 0030H 主程序入口

MAIN: MOV TMOD,#10H 设置定时器的工作模式为模式1 SETB TR1 启动定时器T1 LOOP: MOV TH1,#0D8H 装入T1计数初值

MOV TH0,#0F0H JNB TF1,$ T1没有溢出则等待

CLR TF1

产生溢出,清标志位

CPL P2.0 P2.0取反输出

SJMP LOOP 循环

END

四、实验结果截图

1.2

3.4.1

4.2

下载单片机实验报告[五篇模版]word格式文档
下载单片机实验报告[五篇模版].doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    单片机实验报告

    实验四、中断交通灯实验 林立强1000850116 一、实验目的 1、了解MCS-51单片机的组成、中断原理,中断处理过程、外部中断的中断方式。 2、掌握中断响应及处理的编程方法。 二......

    单片机实验报告

    51单片机控制流水灯 目录 (1)51精简开发板简介 (2)实验目的 (3)实验内容 (4)元件 (5)原理图 (6)实验步骤 (7)主要功能介绍(8)实验错误及分析 (9)调试及程序 (10)系统测试 (11)实验心得 一、51精简......

    单片机实验报告大全

    单片机原理与应用实学校:合肥工业大学 班级:计算机科学与技术 学号: 姓名:验报告 第一章MC51 单片机原理及应用软件实验 实验1:系统认识实验 1. 实验目的 (1)了解ZY15MCU12BC2单片......

    单片机实验报告

    单片机实验一 实验报告 课程名称: 姓名: 系别: 专业: 年级: 学号: 指导教师: 单片机原理及应用实验 陈璐 信息系 电气工程及其自动化 2012级 120712041 李莉 2015 年6 月 25 日......

    单片机实验报告

    实验一 uVision2 集成开发环境的使用 一、 实验目的和要求二、实验设备与仪器三、实验内容四、实验原理、方法与步骤 五、实验小结:1.简述生成应用程序的过程。2.记录程序调试......

    单片机实验报告4

    单片机实验报告(实验一) 一、实验目的: 1. 掌握stm8的时钟切换。 2. 熟悉汇编语言的指令系统。 3. 加深对stm8功能的理解,掌握去其使用方法。 二、实验仪器: stm8s105c6单片机......

    单片机实验报告[推荐五篇]

    单片机实验报告 流水灯实验一 一:实验目的 1、掌握51单片机如何控制信号输出。 2、掌握Keil C集成开发环境的使用。3、掌握51开发平台的使用。 二、实验内容 在开发板上实现8......

    单片机实验报告(三)

    实验报告书 信息工程系 电气自动化11班姓名:张青日期:2014.10.14 实验一:完成AT89S51单片机与PC机的RS232串行通信接口电路实物制作。该部分电路可在实物电路板Ⅰ上进行搭建。......