51单片机实验案例2018.3
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
delay(1000);
if(!key1)
{
P0=0x06;//数码管显示"2"
}
}
if(!key2)
{
delay(1000);
if(!key2)
{
P0=0x5B;//数码管显示"1"
}
}
if(!key3)
{
delay(1000);
if(!key3)
{
P0=0x4F;//数码管显示"3"
}
}
}
}
2)电路设计
uchar num;
uchar code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x80}; //共阴数码管显示码
void delayms (uint xms)//延时函数,约延时xms毫秒
w<<=1;
}
}
}
}
void delay(unsigned inti)
{unsigned int k;
for(k=0;k<i;k++);
}
2)电路设计
实验五:输入接口实验
一、实验目的
按钮开关与单片机的端口电路接口
拨码开关和单片机的端口电路设计
抖动与去抖动
二、实验工具
安装有Proteus和Keil软件的微机、51系列单片机实验板
{
delayms(10);//延时去抖动
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//再次判断1行是否有按键按下
{ temp=P3;//有按键按下读取P3口值
switch(temp)//具体按键判断
{
case 0xed: key=4; break; //第1行第0列
case 0xdd: key=5; break; //第1行第1列
三、实验内容
依次显示8盏灯,然后逆序依次显示。
1)设计分析
将P1口的初始值设为11111110(1不亮,0亮),左移7次后变成01111111时;再带位右移7次变成11111110,如此循环,即可实现效果。
2)程序图与程序设计
根据前面分析绘制图2-1所示的流程图,再根据图2-1编写程序。
图2-1
C语言程序:
}
while (temp!=0xf0)//等待按键释放
{
temp=P3;
temp=temp&0xf0;
}
display (key);//显示按键值
}
}
P3=0xfd;//第0行没有按键按下,扫描第1行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//判断第1行是否有按键按下
}; //9,定义二维数组,0~9的显示码
unsignedchar w;
unsigned int j,k,m;
while(1)
{
for(k=0;k<10;k++)
{
for(m=0;m<200;m++);
{w=0x01;
for(j=0;j<8;j++)
{P1=w;
P0=led[k] [j];
delay(100);
unsigned char code seg[]={0,1,2,3,4,5,6,7};//位码对应的数码管亮
void delay(unsigned int cnt)//延时子程序
{
while(--cnt);
}
main()
{
unsigned char i;
while(1)
{
P0=duanm [i];//取显示数据,段码
temp=P3;//读取P3口的值
temp=temp&0xf0;
if(temp!=0xf0)//判断是否有按键按下
{
delayms(10);//有按键按下,延时去抖动
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//再次判断按键是否按下
{ temp=P3;//有按键按下,读取P3口的值
实验一:实验环境的初识、使用及调试方法实验
一、实验目的
了解单片机的基础知识
了解51单片机的组成和工作方法
认识Proteus软件、Keil软件
掌握项目工程的建立、编辑、编译和下载的过程方法
熟练单片机开发调试工具和方法
二、实验工具
安装有Proteus和Keil软件的微机、51系列单片机实验板
三、实验内容
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//判断第2行中按键是否有按键按下
{
delayms(10);//延时去抖动
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//再次判断按键是否按下
{temp=P3;//按键按下,读取P3口值
switch(temp)//判断第2行中哪一个按键按下
switch(temp)//判断是第1行中的哪个按键按下
{
case 0xee: key=0; break; //第0行第0列
case 0xde: key=1; break; //第0行第1列
case 0xbe: key=2; break; //第0行第2列
case 0x7e: key=3; break; //第0行第3列
{
case 0xeb: key=8; break; //第2行第0列
case 0xdb: key=9; break; //第2行第1列
case 0xbb: key=10; break; //第2行第2列
case 0x7b: key=11; break; //第2行第3列
}
while (temp!=0xf0)//等待按键释放
三、实验内容
从左往右依次动态循环显示01234567
1)设计分析
数码管在共阴接法中,0(低电平)亮,1(高电平)灭,亮的数字由段选信号决定。
2)程序设计
C语言程序:
#include<reg52.h>
unsigned char duanm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
4×4矩阵键盘:开始P0口不显示,按下0号键,按键松开后,P0口显示0;按下1号键,按键松开后,P0口显示1…...按下“F”键,按键松开后,P0口数码管显示F
1)程序设计
C语言程序
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
P2=seg[i];//取位码
delay(20000);//扫描延时,时间太长会闪烁,太短会造成重影
i++;
if(i==8)//检测8位扫描完全?
i=0;
}
}
3)电路设计
实验四:单片机与LED点阵屏接口设计
一、实验目的
对课题进行全面的分析,明确系统要实现的功能,制定总的设计方案
根据论证设计硬件系统并画出电路图
case 0xbd: key=6; break; //第1行第2列
case 0x7d: key=7; break; //第1行第3列
}
while (temp!=0xf0)//等待按键释放
{
temp=P3;
temp=temp&0xf0;
}
display (key);//显示第1行中按键按下的值
}
}
P3=0xfb;//第0、第1行没有按键按下,判断第2行的按键
在硬件的基础上设计软件程序
利用仿真器编译软件程序,进行调试仿真
二、实验工具
安装有Proteus和Keil软件的微机、51系列单片机实验板
三、实验内容
利用51单片机控制一块8×8LED点阵式电子广告牌,要求在8×8LED点阵式电子广告牌上循环显示0、1、2、3、4、5、6、7、8、9这十个数。
1)程序图与程序设计
{delay(100);
LED=(LED>>1)|0x80;
}
}
}
void delay(int x)
{int i,j;
for(i=0;i<x;i++)
for(j;j<=600;j++);
}
3)电路设计
根据要求运用Proteus绘制电路原理图,如图2-2所示。在Keil软件中进行软件仿真/调试,看其功能是否正常,若出现错误或非预期的状态,则进行源程序检查修正,无误后将生成hex后缀文件,加载到Proteus的单片机属性中,进行在线仿真。
单片机最小系统的构成图1-1:
图1-1
Keil集成开发环境图1-2:
图1-2
实验二:51单片机外接8个LED案例实验
一、实验目的
了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路
掌握C51中单片机I/O口的编程方法和使用I/O口进行输入输出的注意事项
二、实验工具
安装有Proteus和Keil软件的微机、51系列单片机实验板
{0x1c,0x06,0x1e,0x36,0x36,0x36,0x1c,0x00}, //6
{0x3f,0x30,0x18,0x18,0x0c,0x0c,0x0c,0x00}, //7
{0x1c,0x36,0x36,0x36,0x3c,0x30,0x1c,0x00}, //8
{0x1c,0x36,0x36,0x36,0x3c,0x30,0x1c,0x00}
{
temp=P3;
temp=temp&0xf0;
}
display (key);//显示第2行按键的值
}
}
P3=0xf7;//第0、第1、第2行没按键按下,判断第3行是否按下
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//第3行是否有按键按下
#include<reg51.h>
#define LED P1
voiddelay(int);
main()
{unsigned char i;
LED=0xfe;
While(1)
{for(i=0;i<7;i++)
{delay(100);
LED=(LED<<1)|0x01;
}
for(i=0;i<7;i++)
{
uint i, j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display (uchar num)
{ห้องสมุดไป่ตู้
P0=table[num];//显示函数只送段选数据
}
void xxcan()//按键扫描程序
{ uchar temp,key;
P3=0xfe;//第0行输出低电平扫描
{0x1e,0x30,0x30,0x1c,0x06,0x06,0x3e,0x00}, //2
{0x1e,0x30,0x30,0x1c,0x30,0x30,0x1e,0x00}, //3
{0x30,0x38,0x34,0x32,0x3e,0x30,0x30,0x00}, //4
{0x1e,0x02,0x1e,0x30,0x30,0x30,0x1e,0x00}, //5
C语言程序:
#include<reg51.h>
void delay(unsigned int i);
void main()
{
unsigned char code led[10] [8]={
{0x24,0x24,0x24,0x24,0x24,0x24,0x18,0x18}, //0
{0x18,0x1c,0x18,0x18,0x18,0x18,0x18,0x00}, //1
三、实验内容
独立式按键:按下S0数码管(共阴极)显示0,按下S1数码管显示1,按下S2数码管显示2,按下S3数码管显示3
1)程序图与程序设计
根据功能要求与电路结构,绘制程序流程图,如图5-1所示
图5-1
C语言程序
#include<reg52.h>
sbit key1=P3^0; //定义按键位置
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
void delay(unsigned int cnt)//延时子程序
{
while(--cnt);
}
main()
{
while(1)
{
if(!key0)
{
delay(1000);
if(!key0)
{
P0=0x3F;//数码管显示"0"
}
}
{
if(!key1)
图2-2
实验三:单片机控制的数码管动态显示实验
一、实验目的
Proteus仿真软件、软件仿真板的使用
了解并熟悉多位LED数码管的电路结构、与单片机的连接方法及其应用原理
学习Proteus构建LED数码管显示电路的方法
掌握C51中单片机控制LED数码管动态显示的原理与编程方法
二、实验工具
安装有Proteus和Keil软件的微机、51系列单片机实验板
硬件电路大致上可以分成单片机系统及外围电路、列驱动电路和行驱动电路以及LED点阵阵列三大部分。如图4-1
图4-1
在8×8点阵上显示一个字符的程序设计思路如下:
首先选中8×8点阵的行,然后将该行要点亮状态所对应的字符码型,送到列端口,延时1ms;然后选中第二行,再送该行对应显示状态字符码型,延时1ms;再选中第三行,重复上述过程,直到每行显示一遍,时间约为8ms,即完成一遍扫描显示。然后再取第二个字符码型,按照前面的方式循环扫描即可,采用二维数组实现。
delay(1000);
if(!key1)
{
P0=0x06;//数码管显示"2"
}
}
if(!key2)
{
delay(1000);
if(!key2)
{
P0=0x5B;//数码管显示"1"
}
}
if(!key3)
{
delay(1000);
if(!key3)
{
P0=0x4F;//数码管显示"3"
}
}
}
}
2)电路设计
uchar num;
uchar code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x80}; //共阴数码管显示码
void delayms (uint xms)//延时函数,约延时xms毫秒
w<<=1;
}
}
}
}
void delay(unsigned inti)
{unsigned int k;
for(k=0;k<i;k++);
}
2)电路设计
实验五:输入接口实验
一、实验目的
按钮开关与单片机的端口电路接口
拨码开关和单片机的端口电路设计
抖动与去抖动
二、实验工具
安装有Proteus和Keil软件的微机、51系列单片机实验板
{
delayms(10);//延时去抖动
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//再次判断1行是否有按键按下
{ temp=P3;//有按键按下读取P3口值
switch(temp)//具体按键判断
{
case 0xed: key=4; break; //第1行第0列
case 0xdd: key=5; break; //第1行第1列
三、实验内容
依次显示8盏灯,然后逆序依次显示。
1)设计分析
将P1口的初始值设为11111110(1不亮,0亮),左移7次后变成01111111时;再带位右移7次变成11111110,如此循环,即可实现效果。
2)程序图与程序设计
根据前面分析绘制图2-1所示的流程图,再根据图2-1编写程序。
图2-1
C语言程序:
}
while (temp!=0xf0)//等待按键释放
{
temp=P3;
temp=temp&0xf0;
}
display (key);//显示按键值
}
}
P3=0xfd;//第0行没有按键按下,扫描第1行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//判断第1行是否有按键按下
}; //9,定义二维数组,0~9的显示码
unsignedchar w;
unsigned int j,k,m;
while(1)
{
for(k=0;k<10;k++)
{
for(m=0;m<200;m++);
{w=0x01;
for(j=0;j<8;j++)
{P1=w;
P0=led[k] [j];
delay(100);
unsigned char code seg[]={0,1,2,3,4,5,6,7};//位码对应的数码管亮
void delay(unsigned int cnt)//延时子程序
{
while(--cnt);
}
main()
{
unsigned char i;
while(1)
{
P0=duanm [i];//取显示数据,段码
temp=P3;//读取P3口的值
temp=temp&0xf0;
if(temp!=0xf0)//判断是否有按键按下
{
delayms(10);//有按键按下,延时去抖动
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//再次判断按键是否按下
{ temp=P3;//有按键按下,读取P3口的值
实验一:实验环境的初识、使用及调试方法实验
一、实验目的
了解单片机的基础知识
了解51单片机的组成和工作方法
认识Proteus软件、Keil软件
掌握项目工程的建立、编辑、编译和下载的过程方法
熟练单片机开发调试工具和方法
二、实验工具
安装有Proteus和Keil软件的微机、51系列单片机实验板
三、实验内容
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//判断第2行中按键是否有按键按下
{
delayms(10);//延时去抖动
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//再次判断按键是否按下
{temp=P3;//按键按下,读取P3口值
switch(temp)//判断第2行中哪一个按键按下
switch(temp)//判断是第1行中的哪个按键按下
{
case 0xee: key=0; break; //第0行第0列
case 0xde: key=1; break; //第0行第1列
case 0xbe: key=2; break; //第0行第2列
case 0x7e: key=3; break; //第0行第3列
{
case 0xeb: key=8; break; //第2行第0列
case 0xdb: key=9; break; //第2行第1列
case 0xbb: key=10; break; //第2行第2列
case 0x7b: key=11; break; //第2行第3列
}
while (temp!=0xf0)//等待按键释放
三、实验内容
从左往右依次动态循环显示01234567
1)设计分析
数码管在共阴接法中,0(低电平)亮,1(高电平)灭,亮的数字由段选信号决定。
2)程序设计
C语言程序:
#include<reg52.h>
unsigned char duanm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
4×4矩阵键盘:开始P0口不显示,按下0号键,按键松开后,P0口显示0;按下1号键,按键松开后,P0口显示1…...按下“F”键,按键松开后,P0口数码管显示F
1)程序设计
C语言程序
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
P2=seg[i];//取位码
delay(20000);//扫描延时,时间太长会闪烁,太短会造成重影
i++;
if(i==8)//检测8位扫描完全?
i=0;
}
}
3)电路设计
实验四:单片机与LED点阵屏接口设计
一、实验目的
对课题进行全面的分析,明确系统要实现的功能,制定总的设计方案
根据论证设计硬件系统并画出电路图
case 0xbd: key=6; break; //第1行第2列
case 0x7d: key=7; break; //第1行第3列
}
while (temp!=0xf0)//等待按键释放
{
temp=P3;
temp=temp&0xf0;
}
display (key);//显示第1行中按键按下的值
}
}
P3=0xfb;//第0、第1行没有按键按下,判断第2行的按键
在硬件的基础上设计软件程序
利用仿真器编译软件程序,进行调试仿真
二、实验工具
安装有Proteus和Keil软件的微机、51系列单片机实验板
三、实验内容
利用51单片机控制一块8×8LED点阵式电子广告牌,要求在8×8LED点阵式电子广告牌上循环显示0、1、2、3、4、5、6、7、8、9这十个数。
1)程序图与程序设计
{delay(100);
LED=(LED>>1)|0x80;
}
}
}
void delay(int x)
{int i,j;
for(i=0;i<x;i++)
for(j;j<=600;j++);
}
3)电路设计
根据要求运用Proteus绘制电路原理图,如图2-2所示。在Keil软件中进行软件仿真/调试,看其功能是否正常,若出现错误或非预期的状态,则进行源程序检查修正,无误后将生成hex后缀文件,加载到Proteus的单片机属性中,进行在线仿真。
单片机最小系统的构成图1-1:
图1-1
Keil集成开发环境图1-2:
图1-2
实验二:51单片机外接8个LED案例实验
一、实验目的
了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路
掌握C51中单片机I/O口的编程方法和使用I/O口进行输入输出的注意事项
二、实验工具
安装有Proteus和Keil软件的微机、51系列单片机实验板
{0x1c,0x06,0x1e,0x36,0x36,0x36,0x1c,0x00}, //6
{0x3f,0x30,0x18,0x18,0x0c,0x0c,0x0c,0x00}, //7
{0x1c,0x36,0x36,0x36,0x3c,0x30,0x1c,0x00}, //8
{0x1c,0x36,0x36,0x36,0x3c,0x30,0x1c,0x00}
{
temp=P3;
temp=temp&0xf0;
}
display (key);//显示第2行按键的值
}
}
P3=0xf7;//第0、第1、第2行没按键按下,判断第3行是否按下
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//第3行是否有按键按下
#include<reg51.h>
#define LED P1
voiddelay(int);
main()
{unsigned char i;
LED=0xfe;
While(1)
{for(i=0;i<7;i++)
{delay(100);
LED=(LED<<1)|0x01;
}
for(i=0;i<7;i++)
{
uint i, j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display (uchar num)
{ห้องสมุดไป่ตู้
P0=table[num];//显示函数只送段选数据
}
void xxcan()//按键扫描程序
{ uchar temp,key;
P3=0xfe;//第0行输出低电平扫描
{0x1e,0x30,0x30,0x1c,0x06,0x06,0x3e,0x00}, //2
{0x1e,0x30,0x30,0x1c,0x30,0x30,0x1e,0x00}, //3
{0x30,0x38,0x34,0x32,0x3e,0x30,0x30,0x00}, //4
{0x1e,0x02,0x1e,0x30,0x30,0x30,0x1e,0x00}, //5
C语言程序:
#include<reg51.h>
void delay(unsigned int i);
void main()
{
unsigned char code led[10] [8]={
{0x24,0x24,0x24,0x24,0x24,0x24,0x18,0x18}, //0
{0x18,0x1c,0x18,0x18,0x18,0x18,0x18,0x00}, //1
三、实验内容
独立式按键:按下S0数码管(共阴极)显示0,按下S1数码管显示1,按下S2数码管显示2,按下S3数码管显示3
1)程序图与程序设计
根据功能要求与电路结构,绘制程序流程图,如图5-1所示
图5-1
C语言程序
#include<reg52.h>
sbit key1=P3^0; //定义按键位置
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
void delay(unsigned int cnt)//延时子程序
{
while(--cnt);
}
main()
{
while(1)
{
if(!key0)
{
delay(1000);
if(!key0)
{
P0=0x3F;//数码管显示"0"
}
}
{
if(!key1)
图2-2
实验三:单片机控制的数码管动态显示实验
一、实验目的
Proteus仿真软件、软件仿真板的使用
了解并熟悉多位LED数码管的电路结构、与单片机的连接方法及其应用原理
学习Proteus构建LED数码管显示电路的方法
掌握C51中单片机控制LED数码管动态显示的原理与编程方法
二、实验工具
安装有Proteus和Keil软件的微机、51系列单片机实验板
硬件电路大致上可以分成单片机系统及外围电路、列驱动电路和行驱动电路以及LED点阵阵列三大部分。如图4-1
图4-1
在8×8点阵上显示一个字符的程序设计思路如下:
首先选中8×8点阵的行,然后将该行要点亮状态所对应的字符码型,送到列端口,延时1ms;然后选中第二行,再送该行对应显示状态字符码型,延时1ms;再选中第三行,重复上述过程,直到每行显示一遍,时间约为8ms,即完成一遍扫描显示。然后再取第二个字符码型,按照前面的方式循环扫描即可,采用二维数组实现。