电子科技大学成都学院
实验报告册
课程名称:
姓 名:
学 号:
院 系:
专 业:
教 师:
年
实验一LED 流水灯
一、实验目的:
1. 掌握并口的使用
2. 掌握移位指令的使用
二、实验原理和内容:
实验原理:
1. 共阳LED
(1)位移指令 左移>
(2)循环移位指令 _crol_(A,B), _cror_(A,B)函数,在头文件intrins.h 中
实验内容:实现LED 灯上下流水显示效果
三、实验步骤:
1. 创建工程;2. 编写程序; 3. 调试程序 ; 4. 下载验证
四、实验数据和结果
程序功能描述: 实现LED 的流水灯显示,即通过单片机P0口控制8个LED
灯循环点亮,循环方式为:左循环依次点亮一次,随后右循环
依次点亮一次。
本例中是调用的 intrins.h 中的函数实现的循环移位。
#include
#include
#define uchar unsigned char
#define uint unsigned int
//****功能 : 延时, 延时时间为
10ms * del
void Delay(uint del)
{
}
//****功能 : 实现灯的闪烁
void Main(void)
{
}
五、实验总结:
通过本实验我学会了共阳LED 的电路原理,深入了解共阳LED 的工作原来,
完成一系列的调试工作。
uint i,j; for(i=0; i
一、实验目的:
1. 掌握LED 数码管显示
2. 掌握数组使用
二、实验原理和内容:
实验原理:
1.LED 8段显示器
2. 共阴极数码管电路图
(1)LED 静态显示方式
静态显示就是当显示器显示某个字符时,相应的段(发光二极管) 恒定地导通或截
止,直到显示另一个字符为止。静态显示器的亮度较高,
这种显示方式编程容易,
管理也较简单,但占用I/O口线资源较多。在显示位数较多的情况下,一般都
采用动态显示方式。
(2)LED 动态显示方式
在多位LED 显示时,将所有位的段选线并联在一起,由一个8位I/O口控制。
而共阴(或共阳) 极公共端K分别由相应的I/O线控制,实现各位的分时选通。
因人眼的视觉暂留时间为0.1 s(100 ms) ,所以显示间隔要受到此条件的约束。
实验内容:用8位LED 数码管显示自己学号
三、 实验步骤:
1. 创建工程;2. 编写程序; 3. 调试程序 ; 4. 下载验证
四、实验数据和结果:
程序功能描述: 8位数码管分别显示40710324
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[10] = {0x66,0x3f,0x07,0x06,0x3f,0x4f,0x5b,0x66};
uchar code LED_W[8] = {0,1,2,3,4,5,6,7};
//**** 功能 : 延时子程序,延时时间为 1ms * x
void Delay(uint i)
{
}
//**** 功能 : 数码管的显示
void Main(void)
{
while(1) { P0 = table[1]; // i 值的 个位数 //点亮第一位数码管
uchar x,j; for(j=0;j
} } Delay(3); P0 = table[2]; // i 值的 个位数 //点亮第一位数码管 P2 = LED_W[7]; Delay(3);
五、实验总结:
掌握数据的运算与使用,掌握LED 的数码显示。
实验三 定时器/计数器使用
一、实验目的:
1. 掌握定时函数使用
2. 学习配置工作模式寄存器 TMOD 、控制器寄存器 TCON
二、实验原理和内容:
实验原理:
1.MCS-51单片机 定时/计数器的工作原理
2. 模式控制寄存器TMOD
3. 控制寄存器TCON
实验内容:根据课堂要求内容进行实验
三、实验步骤:
1. 创建工程;2. 编写程序; 3. 调试程序 ; 4. 下载验证
四、实验数据和结果:
#include
#define uchar unsigned char
#define uint unsigned int
uchar Count = 0;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //**** 功能 : 定时器的初始化,11.0592MZ 晶振,50ms
void Time0_Init()
{
} TMOD = 0x01; TH0 = 0x4c; TL0 = 0x00; IE = 0x82; TR0 = 1;
//**** 功能 : 定时器中断,中断中实现 Count 加一
void Time0_Int() interrupt 1
{
}
void main()
{
uchar i = 0;
TH0 = 0x4c; TL0 = 0x00; Count++; //长度加1
} Time0_Init(); while(1) { } P0 = table[i % 10]; //取 i 的个位 while(1) { } if(Count == 20) //当Count 为 20 时,i 自加一次,20 * 50MS = 1S { } Count = 0; i++; break;
五、实验总结:
掌握了计时器和定时器的使用,深入了解其原理,掌握定时函数使用,学习配置工作模式寄存器 TMOD 、控制器寄存器 TCON 。
实验四: 点阵LED 显示
一、实验目的:
1. 掌握8*8-LED点阵的结构原理
2. 掌握8*8-LED点阵的使用
二、实验原理和内容:
实验原理:
1. 8X8点阵LED 等效电路
8 X 8 点阵LED 工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置0电平,某一行置1电平,则相应的二极管就亮;一根竖柱:对应的列置0,而行则采用扫描的方法来实现。一根横柱:对应的行置1,而列则采用扫描的方法来实现。 LP00~ LP07图1-8,P2.0~P2.7图A-H 。
实验内容:显示心形和自己姓名拼音首字母
三、实验步骤:
1. 创建工程;2. 编写程序; 3. 调试程序 ; 4. 下载验证
四、实验数据和结果:
程序功能描述:需要连接上J16这个跳线帽。这个代码在点阵上显示相应的图形。 显示心形和自己的姓名拼音首字母。
#include
#include
#define uint unsigned int
#define uchar unsigned char
//心形显示
unsigned char code tabP0[]={0x30,0x48,0x44,0x22,0x44,0x48,0x30,0x00};
unsigned char code tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
unsigned char code tabP0[]={ };
unsigned char code tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; //**** 功能 : 延时子程序,延时时间为 1ms * x
void Delay_1ms(uchar i) //1ms延时
{
uchar x,j;
for(j=0;j
for(x=0;x
}
void main()
{
int i;
while(1)
{
for(i=0;i
{
P0=0;
P2=tabP2[i];
P0=tabP0[i];
Delay_1ms(2);
}
}
}
五、实验总结:
掌握8*8-LED点阵的结构原理
掌握8*8-LED点阵的使用
实验五:矩阵按键
一、实验目的:
1. 掌握矩阵键盘原理
2. 矩阵式键盘的按键识别方法
二、实验原理和内容:
实验原理:
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。矩阵式键盘的按键识别方法:扫描法,线反法
扫描法:又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。
(1)判断键盘中有无键按下: 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
(2) 判断闭合键所在的位置: 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。 线反法:先找按下的按键在那一行(或列),然后在找在那一列(或行),从而可以找到按下按键的具体位置。
2. 实验内容:编写按键扫描程序,识别按键。
三、实验步骤:
1. 创建工程;2. 编写程序; 3. 调试程序 ; 4. 下载验证
四、实验数据和结果:
程序实现功能:在一位数码管上显示对应的4*4键盘按下后的数值,以十六进制
数来表示。#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0xc0,0xf9,0xa4,0xb0, //数码显示依次为:0、1、2、3
0x99,0x92,0x82,0xf8, // 4、5、6、7
0x80,0x90,0x88,0x83, // 8、9、a 、b
0xc6,0xa1,0x86,0x8e,0xff / c 、d 、e 、f
};
uchar num,temp;
void delay(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan() //键盘扫描程序,返回uchar 型参数
{
uchar i;
for(i=0;i
{
P3=_crol_(0xfe,i);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
/
delay(5); //延时消抖
temp=P3; //第二次确认该键按下
temp=temp&0xf0;
while(temp!=0xf0)
{
//再次确认该键按下
//等待按键释放
temp=P3; switch(temp) { case 0xee:num=1; break; case 0xde:num=2; break; case 0xbe:num=3; break; case 0x7e:num=4; break; case 0xed:num=5; break; case 0xdd:num=6; break; case 0xbd:num=7; break; case 0x7d:num=8; break; case 0xeb:num=9; break; case 0xdb:num=10;break; case 0xbb:num=11;break; case 0x7b:num=12;break; case 0xe7:num=13;break; case 0xd7:num=14;break; case 0xb7:num=15;break; case 0x77:num=16;break; } while(temp!=0xf0) { temp=P3;
temp=temp&0xf0; }
}
}
}
return num;
}
void display(uchar aa) //显示函数
{
dula=1;
P0=table[aa-1];
dula=0; //显示完成后立即清空缓存
}
void main()
{
num=17;
dula=1;
P0=0;
dula=0;
wela=1;
P0=0x20;
wela=0;
while(1)
{ display(keyscan())}
}
五、实验总结:
通过本次实验,我们学习到了单片机系统中的4*4矩阵键盘的原理