单片机实验指导书.docx
- 文档编号:17289313
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:72
- 大小:4.83MB
单片机实验指导书.docx
《单片机实验指导书.docx》由会员分享,可在线阅读,更多相关《单片机实验指导书.docx(72页珍藏版)》请在冰点文库上搜索。
单片机实验指导书
单片机原理及应用
实验指导书
实验一Keil集成开发环境的使用
一、实验目的
1、熟悉Keil软件集成开发环境及使用方法,并能够编写编译实验项目;
2、掌握编写51程序及程序的运行;
3、学习控制单片机I/O口驱动发光二极管流水显示的方法。
二、实验内容
如图1-1所示,利用STC89C54RD+单片机的P1口外接8个发光二极管,实现双向流动流水灯效果。
图1-1原理图
图1-2插线图
三、实验步骤
1、Keil软件的使用。
2、硬件资源连接。
用排线按图1-2在实验箱上将相应端子接好。
用USB数据线将计算机USB口和GL9型开发板相连。
注意保持GL9型开发板电源开关断开(开关SW1置于左侧)。
3、编译下载
a.启动uVision4新建一个51单片机的工程,输入参考代码并编译下载。
b.点击STC_ISP_V480.exe启动下载界面,如图1-3。
c.启动界面后如图1-4所示。
选择单片机型号,此处根据实际情况我们应选择STC89C54RD+,如图1-5。
d.打开程序文件。
此处我们打开编译生成的HEX文件即可,如图1-6。
e.设置串口参数。
其中串口标号按系统分配的端口序号进行选择,其它内容按照默认即可。
f.设置其它参数。
此处按照默认即可。
如图1-7。
图1-3
图1-4
图1-5
图1-6
图1-7
图1-8
g.下载。
点击Download下载键即可下载,点击前要保证GL9型开发板已经正确地通过USB数据线连接于USB接口上,并且将开关SW1置于左侧。
如图1-8。
h.点击点击Download下载键后,信息窗口提示“仍在连接中,请给MCU上电...”,如图1-9。
此时需要给GL9开发板上的单片机重新上一次电,电源开关SW1推向右方,指示灯V9点亮,如图1-10。
重新上电后下载程序开始,会有相应文字提示及进度提示,如图1-11。
下载完成,有相应提示,如图1-12.
图1-9
图1-10
图1-11
图1-12
下载完成后,单片机会立即开始运行程序。
3、观察实验结果。
四、参考程序
#include
//---------------------------------------
//定义一个数据表格
unsignedcharcodeTAB[16]=
{//定义表格一定要使用code,这样会做到程序存储区中
0x01,//表格第1步数据0b00000001
0x02,//表格第2步数据0b00000010
0x04,//表格第3步数据0b00000100
0x08,//表格第4步数据0b00001000
0x10,//表格第5步数据0b00010000
0x20,//表格第6步数据0b00100000
0x40,//表格第7步数据0b01000000
0x80,//表格第8步数据0b10000000
0xC0,//表格第9步数据0b11000000
0xE0,//表格第10步数据0b11100000
0xF0,//表格第11步数据0b11110000
0xF8,//表格第12步数据0b11111000
0xFC,//表格第13步数据0b11111100
0xFE,//表格第14步数据0b11111110
0xFF,//表格第15步数据0b11111111
0x00,//表格第16步数据0b00000000
};
//---------------------------------------
//名称:
主函数
//---------------------------------------
voidmain(void)//主函数,单片机开机后从这个函数开始运行
{
unsignedinta=0;//定义一个int型变量,做延时用
unsignedcharb=15;//定义一个char型变量,显示内容用
while
(1)//死循环,单片机初始化后,将一直运行这个死循环
{
for(a=0;a<20000;a++);//延时若干时间,具体时长暂不理会
if(++b>15)b=0;//b做加1操作,并限制在0-15以内
P0=TAB[b];//将TAB[b]的值送入PO口输出
}
}五、实验报告
1、实验报报告必须用专用的实验报告纸手写,字迹工整;
2、程序语句要有详细注释和说明;
3、写出本次实验的心得体会及总结。
实验二数码管显示
一、实验目的
1、熟悉KEIL软件使用方法;
2、熟悉七段数码管的笔段与字符显示关系;
3、熟悉51单片机I/O口与七段数码的笔段连接关系;
4、了解数码管的静态与动态显示原理。
二、实验原理
1、七段数码管
图2-1
2、七段数码管显示驱动与I/O口的连接关系
假设P0口连接七段共阴数码管的笔段A~H,对应连接关系及显示字符如下表所示:
P0.7
P0.6
P0.5
P0.4
P0.3
P0.2
P0.1
P0.0
数字段码
显示字符
H
G
F
E
D
C
B
A
0
0
1
1
1
1
1
1
0x3F
0
0
0
0
0
0
1
1
0
0x06
1
0
1
0
1
1
0
1
1
0x5B
2
0
1
0
0
1
1
1
1
0x4F
3
0
1
1
0
0
1
1
0
0x66
4
0
1
1
0
1
1
0
1
0x6D
5
0
1
1
1
1
1
0
1
0x7D
6
0
0
0
0
0
1
1
1
0x07
7
0
1
1
1
1
1
1
1
0x7F
8
0
1
1
0
1
1
1
1
0x6F
9
0
1
1
1
0
1
1
1
0x77
A
0
1
1
1
1
1
0
0
0x7C
b
0
0
1
1
1
0
0
1
0x39
C
0
1
0
1
1
1
1
0
0x5E
d
0
1
1
1
1
0
0
1
0x079
E
0
1
1
1
0
0
0
1
0x71
F
若要在共阴数码管上显示“1”,则直接对P0赋值0x06,即赋值语句为P0=0x06;
3、七段LED数码管动态显示原理
当显示位数较多时,静态显示所需I/O口太多,这时常采用动态显示。
为节省I/O口,通常将所有数码管的显示笔段线的相应段关联在一起,由一个8位I/O口控制,而各位显示位的公共端分别由相应的I/O线控制。
动态显示就是通过笔段引脚向数码管输出所要显示字符的段码。
每一时刻,只有1位数码管的位选线有效,其他各位位选线都是无效的。
逐位地每隔一定时间轮流点亮各位数码管(扫描方式),由于LED数码管的余辉和人眼的“视觉暂留”作用,只要控制好每位显示的时间和间隔,则可以造成“多位同时亮”的假象,达到同时显示的效果。
一般LED数码管的显示时间间隔(扫描间隔)大约在1~10ms之间即可。
三、实验内容
1、1位数码管显示变化的数字0-9。
图2-2原理图
图2-3插线图
2、4位数码管动态显示变化数字0-9999。
图2-4原理图
图2-5插线图
四、实验步骤
1、硬件资源连接;
2、编译下载;
3、观察实验结果。
五、参考程序
1、1位数码管显示变化的数字0-9。
#include
//---------------------------------------
//定义一个数据表格
unsignedcharcodeTAB[10]=
{//定义表格一定要使用code,这样会做到程序存储区中
0x3F,//表格第1步数据0b00111111
0x06,//表格第2步数据0b00000110
0x5B,//表格第3步数据0b01011011
0x4F,//表格第4步数据0b01001111
0x66,//表格第5步数据0b01100110
0x6D,//表格第6步数据0b01101101
0x7D,//表格第7步数据0b01111101
0x07,//表格第8步数据0b00000111
0x7F,//表格第9步数据0b01111111
0x6F,//表格第10步数据0b01101111
};
//---------------------------------------
//名称:
主函数
//---------------------------------------
voidmain(void)//主函数,单片机开机后从这个函数开始运行
{
unsignedinta=0;//定义一个int型变量,做延时用
unsignedcharb=15;//定义一个char型变量,显示内容用
while
(1)//死循环,单片机初始化后,将一直运行这个死循环
{
for(a=0;a<40000;a++);//延时若干时间,具体时长暂不理会
if(++b>9)b=0;//b做加1操作,并限制在0-9以内
P2=TAB[b];//将TAB[b]的值送入P2口输出
}
}
2、4位数码管动态显示变化数字。
#include
//---------------------------------------
//数码管字形表,供显示时查询
unsignedcharcodeLED[10]=
{//定义表格一定要使用code,这样会做到程序存储区中
0x3F,//"0"的字形表,0B00111111
0x06,//"1"的字形表,0B00000110
0x5B,//"2"的字形表,0B01011011
0x4F,//"3"的字形表,0B01001111
0x66,//"4"的字形表,0B01100110
0x6D,//"5"的字形表,0B01101101
0x7D,//"6"的字形表,0B01111101
0x07,//"7"的字形表,0B00000111
0x7F,//"8"的字形表,0B01111111
0x6F,//"9"的字形表,0B01101111
};
//---------------------------------------
//4位数码管相关I/O设置
sbitU165A0=P1^0;//U165(74HC138)的A0脚接在P1.0口上
sbitU165A1=P1^1;//U165(74HC138)的A1脚接在P1.1口上
sbitU165A2=P1^2;//U165(74HC138)的A2脚接在P1.2口上
//---------------------------------------
//名称:
主函数
//---------------------------------------
voidmain(void)//主函数,单片机开机后从这个函数开始运行
{
unsignedcharc=0;//定义一个char型变量,做延时用
unsignedchard=0;//定义一个char型变量,控制显示位置
unsignedchare=0;//定义一个char型变量,做延时用
unsignedintf=0;//定义一个int型变量,显示内容用,显示内容0-9999
while
(1)//死循环,单片机初始化后,将一直运行这个死循环
{
for(c=0;c<250;c++);//做一个0-250的循环,不执行其他操作,只为延时
if(++e>200)//做一个延时,时间到将显示内容加1
{
e=0;//清零,为下一次延时做准备
补充语句1;//显示内容加1,因为只有4位显示,超过9999后归零
}
P2=0;//关一次显示,以免显示出鬼影
if(++d>3)d=0;//先将d加1,然后判断是否大于3,大于3归零
if(d==0)//如果d=0,显示千位
{
P1=0x03;//U165A0=1,U165A1=1,U165A2=0选通数码管的千位进行显示
P2=LED[f/1000];//将要显示的f的千位提取出来查表后送显示
}
elseif(d==1)//如果d=1,显示百位
{
P1=0x02;//U165A0=0,U165A1=1,U165A2=0选通数码管的百位进行显示
P2=LED[(f%1000)/100];//将要显示的f的百位提取出来查表后送显示
}
elseif(d==2)//如果d=2,显示十位
{
P1=0x01;//U165A0=1,U165A1=0,U165A2=0选通数码管的十位进行显示
补充语句2;//将要显示的f的十位提取出来查表后送显示
}
else//如果d=3,显示个位
{
P1=0x00;//U165A0=0,U165A1=0,U165A2=0选通数码管的个位进行显示
P2=LED[f%10];//将要显示的f的个位提取出来查表后送显示
}
}
}
六、实验报告
1、实验报报告必须用专用的实验报告纸手写,字迹工整;
2、程序语句要有详细注释和说明;
3、写出本次实验的心得体会及总结。
实验三矩阵键盘
一、实验目的
1、熟悉KEIL软件使用方法;
2、熟悉反转法原理识别矩阵键盘的方法;
二、实验原理
图3-1原理图
图3-2插线图
三、实验内容
用“线反转法”读取4X4矩阵键盘,通过单片机把读取到的键盘值在字符液晶上显示。
四、实验步骤
1、硬件资源连接;
2、编译下载;
3、观察实验结果。
五、参考程序
#include
//---------------------------------------
//4×4矩阵式按键相关I/O设置
sbitHAGN1=P1^0;//第1行接在P3.0口上
sbitHANG2=P1^1;//第2行接在P3.1口上
sbitHANB3=P1^2;//第3行接在P3.2口上
sbitHANG4=P1^3;//第4行接在P3.3口上
sbitLIE1=P1^4;//第1列接在P3.4口上
sbitLIE2=P1^5;//第2列接在P3.5口上
sbitLIE3=P1^6;//第3列接在P3.6口上
sbitLIE4=P1^7;//第4列接在P3.7口上
//---------------------------------------
//---------------------------------------
//1602液晶相关I/O设置
sbitE=P2^3;//1602液晶的E脚接在P2.3口上
sbitRW=P2^4;//1602液晶的RW脚接在P2.4口上
sbitRS=P2^5;//1602液晶的RS脚接在P2.5口上
//---------------------------------------
//---------------------------------------
//按键部分用寄存器设置
unsignedcharKEYbuf;//设置8位的寄存器用来暂存按键键值数据
//---------------------------------------
//---------------------------------------
//1602液晶寄存器设置
unsignedcharDISbuf;//设置8位的unsigendchar型寄存器用来暂存1602要显示的内容
//---------------------------------------
//---------------------------------------
//名称:
1602液晶用延时函数
//---------------------------------------
voidDelay1602(unsignedintt)
{
unsignedintk;//定义一个16位寄存器用来做延时用
for(k=0;k } //--------------------------------------- //名称: 1602液晶忙检测函数 //--------------------------------------- voidLCD1602_busy(void) { P0_7=1;//将P0.7置1,为读状态做准备 RS=0;//RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入 RW=1;//RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入 E=1;//RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入 while(P0_7==1);//由P0.7读入1,表示1602液晶忙,需要等待 E=0;//读完以后,恢复E的电平 } //--------------------------------------- //名称: 1600写命令函数 //--------------------------------------- voidLCD1602_Write_com(unsignedcharcombuf) { RS=0;//选择指令寄存器 RW=0;//选择写状态 P0=combuf;//将命令字通过P0口送至DB E=1;//E高电平将命令字写入1602液晶 E=0;//写完以后,恢复E的电平 } //--------------------------------------- //名称: 1602写命令函数(带忙检测) //--------------------------------------- voidLCD1602_Write_com_busy(unsignedcharcombuf) { LCD1602_busy();//调用忙检测函数 LCD1602_Write_com(combuf);//调用忙检测函数 } //--------------------------------------- //名称: 1602写数据函数(带忙检测) //--------------------------------------- voidLCD1602_Write_data_busy(unsignedchardatabuf) { LCD1602_busy();//调用忙检测函数 RS=1;//选择数据寄存器 RW=0;//选择写状态 P0=databuf;//将命令字通过P0口送至DB E=1;//E高电平将命令字写入1602液晶 E=0;//写完以后,恢复E的电平 } //--------------------------------------- //名称: 1602液晶显示地址写函数 //--------------------------------------- voidLCD1602_Write_address(unsignedcharx,unsignedchary) { x&=0x0f;//列地址限制在0-15间 y&=0x01;//行地址限制在0-1间 if(y==0)//如果是第一行 LCD1602_Write_com_busy(x|0x80);//将列地址写入 else//如果是第二行 LCD1602_Write_com_busy((x+0x40)|0x80);//将列地址写入 } //--------------------------------------- //名称: 1602液晶初始化函数 //--------------------------------------- voidLCD1602_init(void) { Delay1602(1500);//调用延时函数 LCD1602_Write_com(0x38);//8位数据总线,两行显示模式,5*7点阵显示 Delay1602(500);//调用延时函数 LCD1602_Write_com(0x38);//8位数据总线,两行显示模式,5*7点阵显示 Delay1602(500);//调用延时函数 LCD1602_Write_com(0x38);//8位数据总线,两行显示模式,5*7点阵显示 LCD1602_Write_com_busy(0x38);//8位数据总线,两行显示模式,5*7点阵显示 LCD1602_Write_com_busy(0x08);//显示功能关,无光标 LCD1602_Write_com_busy(0x01);//清屏 LCD1602_Write_com_busy(0x06);//写入新的数据后,光标右移,显示屏不移动 LCD1602_Write_com_busy(0x0C);//显示功能开,无光标 } //--------------------------------------- //名称: 1602液晶指定地址显示函数 //--------------------------------------- voidLCD1602_Disp(unsignedcharx,unsignedchary,unsignedcharbuf) { LCD1602_Write_address(x,y);//先将地址信息写入 LCD1602_Write_data_busy(buf);//再写入要显示的数据 } //--------------------------------------- //名称: 主函数 //--------------------------------------- voidmain(void)//主函数,单片机开机后从这个函数开始运行 { LCD1602_init();//调用1602液晶初始化函数 KEYbuf=255; while (1)//死循环,单片机初始化后,将一直运行这个死循环 { //***4×4矩阵按键扫描部分*** //按K1-P16键,KEYbuf赋值0-15 P1=0xFE;//将第一行置零,以扫描K1-K4是否被按下 补充1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 指导书