51单片机实验报告94890.docx
《51单片机实验报告94890.docx》由会员分享,可在线阅读,更多相关《51单片机实验报告94890.docx(35页珍藏版)》请在冰豆网上搜索。
51单片机实验报告94890
《单片机与接口技术》实验报告
信息工程学院
2016年9月
辽东学院信息技术学院
《单片机与接口技术》实验报告
姓名:
王瑛
学号:
0913140319
班级:
B1403
专业:
网络工程
层次:
本科
2016年9月
实验题目:
实验环境的初识、使用及调试方法(第一章)
实验题目:
单片机工程初步实验(第二章)
实验题目:
基本指令实验(第三章)4
实验题目:
定时器/计数器实验(第五章)4
实验题目:
中断实验(第六章)4
实验题目:
输入接口实验(第八章)4
实验题目:
I/O口扩展实验(第九章)4
实验题目:
串行通信实验(第十一章)4
实验题目:
A/D,D/A转换实验(第十七章)4
实验题目:
实验环境的初识、使用及调试方法实验
实验类型:
验证性实验课时:
1时间:
2016年10月24日
一、实验内容和要求
了解单片机的基础知识
了解51单片机的组成和工作方法
掌握项目工程的建立、编辑、编译和下载的过程方法
熟练单片机开发调试工具和方法
二、实验结果及分析
单片机最小系统的构成:
Keil集成开发环境:
STC-ISP:
实验题目:
单片机工程初步实验
实验类型:
验证性实验课时:
1时间:
2016年10月24日
一、实验内容和要求
点亮一个LED小灯
程序下载到单片机中
二、实验结果及分析
1、点亮一个LED小灯
点亮LED小灯的程序:
#include//包含特殊功能寄存器定义的头文件
sbitLED=P0^0;
sbitADDR0=P1^0;//sbit必须小写,P必须大写
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
voidmain()
{
ENLED=0;
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0;
LED=0;//点亮小灯
while
(1);//程序停止
}
2、程序下载
首先,我们要把硬件连接好,把板子插到我们的电脑上,打开设备管理器查看所使用的COM口,如图所示:
然后STC系列单片的下载软件——STC-ISP,端口为上一步查到的端口,其余选项改成如图所示:
打开程序文件下载后当软件显示“已加密”就表示程序下载成功了,如下图所示:
三、心得体会
通过对单片机的初步学习和认识,我了解到了单片机的工作流程,还有通过自己编写单片机的程序,也让我对单片机的学习有了更大的兴趣,虽然过程中遇到了些许的困难,但这也让自己意识到还有很多不足,通过接下来的学习,希望对单片机的课程有更加深入的了解。
实验题目:
基本指令实验
实验类型:
验证性实验课时:
2时间:
2016年11月1日
一、实验内容和要求
了解单片机的硬件基础知识
LED灯闪烁的程序
二、实验结果及分析
1、去耦电容
电容有缓冲和稳定的作用,有了这个电容,可以说我们的电压和电流就会很稳定了,不会产生大的波动。
2、74HC138三八译码器
在我们设计单片机电路的时候,单片机的IO口数量是有限的,有时并满足不了我们的设计需求,比如我们的STC89C52一共有32个IO口,但是我们为了控制更多的器件,就要使用一些外围的数字芯片,这种数字芯片由简单的输入逻辑来控制输出逻辑,比如74HC138三八译码器。
如图所示。
3、LED灯闪烁的程序
#include
sbitLED=P0^0;
sbitADDR0=P1^0;
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
voidmain()//void为函数类型
{
unsignedinti=0;//定义一个无符号整型变量i,赋初始值为0
ENLED=0;
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0;
while
(1)
{
LED=0;//点亮小灯
for(i=0;i<=3000;i++);//延时
LED=1;//熄灭小灯
for(i=0;i<=3000;i++);//延时
}
}
三、心得体会
做好一件事的前提条件是你对自己所要做的事情有充分的了解和认识,做好完全的准备才能够有保证将这件事做好,学习也是如此,想要做好一个程序,就要将他的工作过程以及条件搞清楚才能将程序编好编清楚。
实验题目:
定时器/计数器实验
实验类型:
验证性实验课时:
3时间:
2016年11月8日
一、实验内容和要求
学习和了解单片机中的定时器、及其寄存器
学习数码管的相关知识
编写数码管的静态显示的相关程序
二、实验结果及分析
1、数码管
数码管示意图:
数码管结构图:
2、数码管静态显示的程序
#include
sbitADDR0=P1^0;
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
voidmain()
{
ENLED=0;
ADDR3=1;
ADDR2=0;
ADDR1=0;
ADDR0=0;
P0=0xF9;
while
(1);
}
三、心得体会
通过这次实验课,我对定时器有了更加深刻的了解,也让我知道了对教材应该更熟悉,因为教材是基础的,只有把基础搞好了才能够进行其他层次的学习。
有时候也可以通过软件的仿真来验证书上的一些理论性的东西。
实现自己想要的效果。
实验题目:
中断实验
实验类型:
验证性实验课时:
4时间:
2016年11月15日
一、实验内容和要求
复习C语言中的数组、if语句和switch语句
学习数码管的动态显示相关知识
掌握单片机中断系统
二、实验结果及分析
1、数码管的动态显示程序
(switch语句)
#include
sbitADDR0=P1^0;
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
unsignedcharcodeLedChar[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
unsignedcharLedBuff[6]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
voidmain()
{
unsignedchari=0;
unsignedintcnt=0;
unsignedlongsec=0;
ENLED=0;
ADDR3=1;
TMOD=0x01;
TH0=0xFC;
TL0=0x67;
TR0=1;
while
(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xFC;
TL0=0x67;
cnt++;
if(cnt>=1000)
{
cnt=0;
sec++;
LedBuff[0]=LedChar[sec%10];
LedBuff[1]=LedChar[sec/10%10];
LedBuff[2]=LedChar[sec/100%10];
LedBuff[3]=LedChar[sec/1000%10];
LedBuff[4]=LedChar[sec/10000%10];
LedBuff[5]=LedChar[sec/100000%10];
}
switch(i)
{
case0:
ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=LedBuff[0];break;
case1:
ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=LedBuff[1];break;
case2:
ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=LedBuff[2];break;
case3:
ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=LedBuff[3];break;
case4:
ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=LedBuff[4];break;
case5:
ADDR2=1;ADDR1=0;ADDR0=1;i=0;P0=LedBuff[5];break;
default:
break;
}
}
}
}
2、中断系统程序
(if...else语句)
#include
sbitADDR0=P1^0;
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
unsignedcharcodeLedChar[]={
0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
unsignedcharLedBuff[6]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsignedcharflagls=0;
voidmain()
{
unsignedchari=0;
unsignedintcnt=0;
unsignedlongsec=0;
ENLED=0;
ADDR3=1;
TMOD=1;
TH0=0x01;
TL0=0xFC;
TL0=0x67;
TR0=1;
while
(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xFC;
TL0=0x67;
cnt++;
if(cnt>=1000)
{
cnt=0;
sec++;
LedBuff[0]=LedChar[sec%10];
LedBuff[1]=LedChar[sec/10%10];
LedBuff[2]=LedChar[sec/100%10];
LedBuff[3]=LedChar[sec/1000%10];
LedBuff[4]=LedChar[sec/10000%10];
LedBuff[5]=LedChar[sec/100000%10];
}
if(i==0)
{ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=LedBuff[0];}
elseif(i==1)
{ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=LedBuff[1];}
elseif(i==2)
{ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=LedBuff[2];}
elseif(i==3)
{ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=LedBuff[3];}
elseif(i==4)
{ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=LedBuff[4];}
elseif(i==5)
{ADDR2=1;ADDR1=0;ADDR0=1;i++;P0=LedBuff[5];}
}
}
三、心得体会通过在实验课的学习,了解到了51单片机中中断的概念以及中断处理系统的工作原理。
学习知识也应该经常复习。
也让我感受到他是一门综合性实践性较强的课程,也是我体会到要想综合运用所学的理论知识、提高设计能力,还需增加实际操作的环节。
实验题目:
输入接口实验
实验类型:
验证性实验课时:
5时间:
2016年11月22日
一、实验内容和要求
掌握函数调用、函数形式参数和实际参数的相关知识
学习单片机中按键的相关知识
编写简易加法计算器程序
二、实验结果及分析
1、按键
独立按键原理图:
矩阵按键原理图:
按键的扫描程序:
#include
sbitADDR0=P1^0;
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
sbitKEY_IN_1=P2^4;
sbitKEY_IN_2=P2^5;
sbitKEY_IN_3=P2^6;
sbitKEY_IN_4=P2^7;
sbitKEY_OUT_1=P2^3;
sbitKEY_OUT_2=P2^2;
sbitKEY_OUT_3=P2^1;
sbitKEY_OUT_4=P2^0;
unsignedcharcodeLedChar[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
unsignedcharKeySta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
voidmain()
{
unsignedchari,j;
unsignedcharbackup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
EA=1;
ENLED=0;
ADDR3=1;
ADDR2=0;
ADDR1=0;
ADDR0=0;
TMOD=0x01;
TH0=0xFC;
TL0=0x67;
ET0=1;
TR0=1;
P0=LedChar[0];
while
(1)
{
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(backup[i][j]!
=KeySta[i][j])
{
if(backup[i][j]!
=0)
{
P0=LedChar[i*4+j];
}
backup[i][j]=KeySta[i][j];
}
}
}
}
}
voidInterruptTimer0()interrupt1
{
unsignedchari;
staticunsignedcharkeyout=0;
staticunsignedcharkeybuf[4][4]={
{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
};
TH0=0xFC;
TL0=0x67;
keybuf[keyout][0]=(keybuf[keyout][0]<<1)|KEY_IN_1;
keybuf[keyout][1]=(keybuf[keyout][1]<<1)|KEY_IN_2;
keybuf[keyout][2]=(keybuf[keyout][2]<<1)|KEY_IN_3;
keybuf[keyout][3]=(keybuf[keyout][3]<<1)|KEY_IN_4;
for(i=0;i<4;i++)
{
if((keybuf[keyout][i]&0x0F)==0x00)
{
KeySta[keyout][i]=0;
}
elseif((keybuf[keyout][i]&0x0F)==0x0F)
{
KeySta[keyout][i]=1;
}
}
keyout++;
keyout=keyout&0x03;
switch(keyout)
{
case0:
KEY_OUT_4=1;KEY_OUT_1=0;break;
case1:
KEY_OUT_1=1;KEY_OUT_2=0;break;
case2:
KEY_OUT_2=1;KEY_OUT_3=0;break;
case3:
KEY_OUT_3=1;KEY_OUT_4=0;break;
default:
break;
}
}
三、心得体会
用户与单片机之间的信息交互需要依赖于两类设备:
输入设备和输出设备。
通过这节实验课的学习,让我对单片机输入接口有了更深入的了解,巩固了书上学到的知识,熟悉了操作。
实验题目:
I/O口扩展实验
实验类型:
验证性实验课时:
6时间:
2016年11月29日
一、实验内容和要求
了解单片机I/O口、上下拉电阻的结构
28BYJ-48型步进电机
二、实验结果及分析
1、I/O口结构
2、28BYJ-48型步进电机
#include
unsignedlongbeats=0;
voidStartMotor(unsignedlongangle);
voidmain()
{
EA=1;
TMOD=0x01;
TH0=0xF8;
TL0=0xCD;
ET0=1;
TR0=1;
StartMotor(360*2+180);
while
(1);
}
voidStartMotor(unsignedlongangle)
{
EA=0;
beats=(angle*4076)/360;
EA=1;
}
voidInterruptTimer0()interrupt1
{
unsignedchartmp;
staticunsignedcharindex=0;
unsignedcharcodeBeatCode[8]={
0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6
};
TH0=0xF8;
TL0=0xCD;
if(beats!
=0)
{
tmp=P1;
tmp=tmp&0xF0;
tmp=tmp|BeatCode[index];
P1=tmp;
index++;
index=index&0x07;
beats--;
}
else
{
P1=P1|0x0F;
}
}
三、心得体会
通过本次实验课学会了I/O口的使用,学会了延时子程序的编写和使用。
通过对单片机的深入学习,我也发现通过单片机能过实现很多自己想要的功能,我们不能过只拘泥于课本知识,要结合实际的学习,这也让我对学习单片机的兴趣更加浓厚。
实验题目:
串行通信实验
实验类型:
验证性实验课时:
7时间:
2016年12月6日
一、实验内容和要求
了解单片机串行通信的知识
掌握RS-232通信接口、USB转串口通信
串口通信的应用和实例
二、实验结果及分析
1、单片机之间UART通信示意图
2、串口数据发送示意图
3、串口通信应用程序
#include
sbitPIN_RXD=P3^0;义
sbitPIN_TXD=P3^1;
bitRxdOrTxd=0;
bitRxdEnd=0;
bitTxdEnd=0;
unsignedcharRxdBuf=0;
unsignedcharTxdBuf=0;
voidConfigUART(unsignedintbaud);
voidStartTXD(unsignedchardat);
voidStartRXD();
voidmain()
{
EA=1;
ConfigUART(9600);
while
(1)
{
while(PIN_RXD);
StartRXD();
while(!
RxdEnd);
StartTXD(RxdBuf+1);
while(!
TxdEnd);
}
}
voidConfigUART(unsignedintbaud)
{
TMOD&=0xF0;
TMOD|=0x02;
TH0=256-(11059200/12)/baud;
}
voidStartRXD()
{
TL0=256-((256-TH0)>>1);
ET0=1;
TR0=1;
RxdEnd=0;
RxdOrTxd=0;
}
voidStartTXD(unsignedchardat)
{
TxdBuf=dat;
TL0=TH0;
ET0=1;
TR0=1;
PIN_TXD=0;
TxdEnd=0;
RxdOrTxd=1;
}
voidInterruptTimer0()interrup