单片机实验报告.docx
- 文档编号:14958348
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:37
- 大小:2.49MB
单片机实验报告.docx
《单片机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机实验报告.docx(37页珍藏版)》请在冰点文库上搜索。
单片机实验报告
目录
第一章单片机简介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
#defineuintunsignedint
voidd(uintx)
{uintn;
for(;x>0;x--)
{for(n=0;n<123;n++)
{;}
}}
main()
{unsignedinti;
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"
#definespeed2
sbitPH1=P1^0;//定义管脚
sbitPH2=P1^1;
sbitI01=P1^2;
sbitI11=P1^3;
sbitI02=P1^4;
sbitI12=P1^5;
voiddelay(inttime);
voidGo()
{//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);
}
voiddelay(inttime)
{
inti,j;
for(j=0;j<=time;j++)
for(i=0;i<=120;i++);
}
voidmain()
{
while
(1)
{
Go();//步进电机运行
}
}
三、独立按键控制LED实验
1.基本要求
通过编程控制8个独立按键分别控制8个LED灯的开关
2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。
打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。
实验结束后先断电源再拆线,将元器件归位后离开。
3.接线图(图一)
图一图二
4.电路原理图
上图图二
5.程序
#include
#include
#defineGPIO_KEYP1//独立键盘用P1口
#defineucharunsignedchar
#defineuintunsignedint
voidDelayms(unsignedintc);//延时10ms
ucharKey_Scan();
voidmain(void)
{
unsignedcharledValue,keyNum;
ledValue=0x01;
while
(1)
{
keyNum=Key_Scan();//扫描键盘
switch(keyNum)
{
case(0xFE):
//返回按键K1的数据
ledValue=0x01;
break;
case(0xFD):
//返回按键K2的数据
ledValue=0x02;
break;
case(0xFB):
//返回按键K3的数据
ledValue=0x04;
break;
case(0xF7):
//返回按键K4的数据
ledValue=0x08;
break;
case(0xEF):
//返回按键K5的数据
ledValue=0x10;
break;
case(0xDF):
//返回按键K6的数据
ledValue=0x20;
break;
case(0xBF):
//返回按键K7的数据
ledValue=0x40;
break;
case(0x7F):
//返回按键K8的数据
ledValue=0x80;
break;
default:
break;
}
GPIO_LED=ledValue;//点亮LED灯
}
}
ucharKey_Scan(void)//键盘扫描函数
{uchari,n=0xff;
if(P1==0xff)gotoScan_r;//无键按下,返回
gotoScan_r;
Scan_1:
while(P1!
=0xff);//等待键释放
Delayms(10);
Scan_r:
returnn;
}
voidDelayms(uintx)
{
uintn;
for(;x>0;x--)
{
for(n=0;n<123;n++)
{;}
}
}
四、矩阵键盘实验
1.基本要求
编程由16个矩阵按键控制数码管显示相应的数值
2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。
打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。
实验结束后先断电源再拆线,将元器件归位后离开。
3.接线图
见下图图一
图一图二
4.电路原理图
见上图图二
5.程序
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineuintunsignedint
#defineGPIO_LEDP0
ucharScanKey(void);
voidDelayms(uintx);
main()
{unsignedcharledValue;
uchari;
ledValue=0x01;
loop:
i=ScanKey();
switch(i)
{case0xee:
ledValue=~0x3F;
break;
case0xde:
ledValue=~0x06;
break;
case0xbe:
ledValue=~0x5B;
break;
case0x7e:
ledValue=~0x4F;
break;
case0xed:
ledValue=~0x66;
break;
case0xdd:
ledValue=~0x6D;
break;
case0xbd:
ledValue=~0x7D;
break;
case0x7d:
ledValue=~0x07;
break;
case0xeb:
ledValue=~0x7F;
break;
case0xdb:
ledValue=~0x6F;
break;
case0xbb:
ledValue=~0x77;
break;
case0x7b:
ledValue=~0x7C;
break;
case0xe7:
ledValue=~0x39;
break;
case0xd7:
ledValue=~0x5E;
break;
case0xb7:
ledValue=~0x79;
break;
case0x77:
ledValue=~0x71;
break;
}
GPIO_LED=ledValue;
i=0;
gotoloop;
}
voidDelayms(uintx)
{uintn;
for(;x>0;x--)
{for(n=0;n<123;n++)
{;}
}
}
ucharScanKey(void)//键盘扫描函数
{uchari,n=0xff;
P1=0xf0;
if(P1==0xf0)gotoScan_r;//无键按下,返回
for(i=0,P1=0xfe;i<4;i++)
{if((P1&0xf0)!
=0xf0)
{Delayms(10);
if((P1&0xf0)!
=0xf0)
{n=P1;gotoScan_1;}
}
P1=(P1<<1)+1;//扫描下一行
}
gotoScan_r;
Scan_1:
P1=0xf0;
while((P1&0xf0)!
=0xf0);//等待键释放
Delayms(10);
Scan_r:
P1=0xff;returnn;
}
}
五、静态数码管实验
1.基本要求
编程使数码管显示字符0-F
2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。
打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。
实验结束后先断电源再拆线,将元器件归位后离开。
3.接线框图(图一)
图一
图二
4.电路原理图
见上图图二
5.程序
#include
#defineucharunsignedchar
#defineuintunsignedint
voidDelayms(uintx);
ucharcodeLED7Code[]=
{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,
~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
main()
{
unsignedintLedNumVal;//定义变量
while
(1)
{
//将字模送到P0口显示
LedNumVal++;
P0=LED7Code[LedNumVal%16];
Delayms(1000);//调用延时程序
}
}
voidDelayms(uintx)
{uintn;
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.程序
#defineuintunsignedint
voidDsplay();
voidDelayms(uintx);
ucharmDS[6];
ucharcodecDsCode[]=
{0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xf8,0x80,0x90};
voidmain()
{uchari;
for(i=0;i<6;i++)mDS[i]=i+1;
loop:
Dsplay();
gotoloop;
}
voidDsplay()//动态扫描显示
{uchari;
for(i=0,P2=0x01;i<6;i++)
{P1=cDsCode[mDS[i]];//输出段
Delayms(1000);
P2=P2<<1;//选通下一位
}
P2=0x00;//关闭位选通
}
voidDelayms(uintx)
{uintn;
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"
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
ucharcodeEN_CHAR1[16]={"CYMOMETER"};
ucharcodeEN_CHAR2[16]={"FREQ:
HZ"};
voidTIMER_Configuration();//初始化定时器
ulongFreq;//用来存放要显示的频率值
ulongTimeCount;//用于计算1S钟的
voidmain()
{
uchari,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;//开启计数器
}
}
}
voidTIMER_Configuration()
{
TMOD=0x51;
TH0=0x3C;
TL0=0xB0;
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
}
voidTimer0()interrupt1
{
TimeCount++;
if(TimeCount==20)//计时到1S
{
TR0=0;
TR1=0;
TimeCount=0;
}
//--12MHZ设置定时50ms的初值--//
TH0=0x3C;
TL0=0xB0;
}
voidTimer1()interrupt3
{
//--进入一次中断,表明计数到了65536--//
Freq=Freq+65536;
}
#include"lcd.h"
voidLcd1602_Delay1ms(uintc)//误差0us
{
uchara,b;
for(;c>0;c--)
{
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 报告