单片机原理及应用实验教程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四、实验程序
//4*4键盘检测程序,按下键后相应的代码显示在数码管上
#include<reg51.h>
sbit beep=P2^3; //蜂鸣器接口
sbit dula=P2^6; //控制数码管段选的锁存器锁存端
sbit wela=P2^7; //控制数码管位选的锁存器锁存端
unsigned char i=100;
if(temp!=0xf0) //如果有键按下刚一定不相等,于是进入//下一
步检测
{
delay(10); //延时去抖动
if(temp!=0xf0) //再次判断是否有键按下
{
temp=P3; //判断为有,再次读P3口数据
switch(temp) //因为刚才是将第一行置的低
{ //在这里再判断是第几列
实验一
一、实验目的
学会矩阵键盘的检测,掌握数码管静态显示原理
二、实验内容
依次按下4*4矩阵键盘上从第1到第20个键,同时在六位数码管上依次显示0、
1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
开发板上数码管为共阴极。静态数码管显示原理:,一位数码管内一共有8
个发光二极管,对共阴极来说其8个发光二极管的阴极在数码管内部全部接在一
{
switch(deng)
{
case 0: shijian=50; //红灯deng=1; break;
case 1: shijian=15; //黄灯deng=2; break;
case 2: shijian=50; //绿灯deng=3; break;
case 3: shijian=15; //黄灯deng=0; break;
case 0xee: //如果temp=0xee则为第一行和第一列key=0; //的交叉点,由此知道是矩阵键盘break; //上的第一个键被按下,给key=0
case 0xde: //以后依此类推key=1; break;
case 0xbe: key=2; break;
case 0x7e: key=3; break;
起,也就是“共阴”说法的来源,阳极是独立的,设计电路时一般把阴极接地,
当从外部给任一个阳极加一个高电平时这个发光二极管就亮了,如果想要出一个8
字,并且把右下角的小数点也点亮的话,那可以给8个阳极全送高电平,想让数码
管显示几就给相对应的发光二极管送高电平,因此在显示数字的时候首先做的就
是给0-9十个数字编好码,在要它亮什么数字的时候直接把这个编码送到它的阳
wela=1; //一个下降沿将数据锁存
wela=0;
}
void main()
{
dula=0; //先关闭两个锁存器
wela=0;
while(1) //进入检测总循环
{
P3=0xfe; //给P3.0送低电平,其余为高电平
temp=P3; //把P3口数据读回来
temp=temp&0xf0; //把P3口与11110000相与
unsigned char j,k,temp,key;
void delay(unsigned char i) //可自定义延时长短的延时函数
{ //当i=10时大约为10毫秒
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
到亮变化,循环下去。
DAC0832:DAC0832是8位全MOS中速D/A转换器,采用R—2RT形电阻解码
网络,转换结果为一对差动电流输出,转换时间大约为1us。使用单电源+5V―+15V
供电。参考电压为-10V-+10V。在此直接选择+5V作为参考电压。DAC0832有三
种工作方式:直通方式,单缓冲方式,双缓冲方式;在此选择直通的工作方式,
switch(temp)
{
case 0xe7: key=12; break;
case 0xd7: key=13; break;
case 0xb7: key=14; break;
case 0x77: key=15; break;
}
while(temp!=0xf0)
{temp=P3;
temp=temp&0xf0;
极就行了。一般的数码管每一段亮至少需要10个毫安的电流,而单片机的IO口
送不出如此大的电流,所以需要加数码管的驱动电路,可以用上拉电阻的方法,
也可以使用专门的驱动芯片,本开发板使用的74HC573,其输出电流较大,足够
点亮数码管。
本开发板上的六位数码管中每个相同段号(段指a,b,c,d,e,f,g,h)全部是接在
将XFER、WR2、CS管脚全部接数字地。管脚8接参考电压,在此接的参考电压是
+5V。在控制P0口输出数据有规律的变化将可以产生三角波,锯齿波,梯型波等
波形了。
三、实验电路
四、实验程序
//测试程序下载后可观察到D12发光二极管由暗变亮再熄灭过程,
#include<reg51.h>
sbit wela=P2^7; //数码管位选
{ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}
五、实验仪器设备
1.单片机实验系统
2.计算机
实验四
一、实验目的
}
while(temp!=0xf0) //这段程序是检测按键是否被释放
{
temp=P3; //如果没有释放就一直等待并且
temp=temp&0xf0;
beep=0; //蜂鸣器一直响
}
beep=1; //释放后关闭蜂鸣器
display(key); //显示按下相应键值的数据
P1=0xfe; //将第一个发光二极管点亮
} }
if(pp==20)
{ pp=0; shijian--;
}
a0=shijian%10;
a1=shijian/10;
display(a1,a0);
switch(deng)
{
case 1: P1=0X00; //红灯break;
case 2: //黄灯if(shijian%2==0) P1=0x00; if(shijian%2==1) P1=0xff; break;
一起的,其中每一个位(阴极)是独立的,所以在做静态显示的时候所有的数码
管只能显示相同的数字,当然可以控制哪几位显示,如果让它们显示不同的数字
那就得给每一个数码管加一套驱动电路。
下面给出本开发板共阴极数码管数字编码:
矩阵键盘的四行分别与P3.0-P3.3连接,四列分别与P3.4-P3.7连接。
三、实验电路:
case 0xbd: key=6; break;
case 0x7d: key=7; break;
}
while(temp!=0xf0)
{ temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
} }
P3=0xfb;
temp=P3;
temp=temp&0xf0;
sbit dula=P2^6; //段选
sbit dawr=P3^6; //DA写数据
sbit csda=P3^2; //DA片选
unsigned char a,j,k;
void delay(unsigned char i) //延时
{ for(j=i;j>0;j--)
for(k=125;k>0;k--);
大,所以我们观察发光二极管D12就会从暗变亮,熄灭。。。
五、实验仪器设备
1.单片机实验系统
2.计算机
六、思考题
实现简易方波发生器。可观察到发光二极管再亮和灭两种状态之间闪烁。用
示波器观察IOUT引脚电平,可看到方波波形。
一、实验目的
学习模拟交通控制方法
二、实验内容
模拟交通灯显示。其中,红灯与绿灯显示时间均为50s,中间的黄灯显示时
间为15s。绿灯用八位发光二极管流动闪烁作代表;红灯用八位发光二极管全亮
作代表;黄灯用八位发光二极管全亮全灭闪烁作代表。刚开始显示的为绿灯。
显示顺序:绿--黄--红--黄--绿--黄--红--………………
三、实验电路
四、实验程序
#include<reg51.h>
#define uchar unsigned char
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{
case 0xeb: key=8; break;
case 0xdb: key=9; break;
case 0xbb: key=10; break;
case 0x7b: key=11; break;
{ dula=0;
P0=table[sh_c];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[g_c];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
}
void main()
{
TMOD=0x01;
uchar j,k,l=255;
uchar a1,a0;
uchar shijian,deng=2;
void delay(unsigned int i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(unsigned char sh_c,unsigned char g_c)
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
unsigned int pp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
case 3: //绿灯if(shijian%2==0) P1=0x55; if(shijian%2==1) P1=0xaa; break;
case 0: if(shijian%2==0) //黄灯P1=0x00; if(shijian%2==1) P1=0xff; break;
} } }
void time0() interrupt 1
}
while(temp!=0xf0)
{ temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key); } }
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(10);
if(temp!=0xf0)
{ temp=P3;
}
void main()
{ wela=0; dula=0; csda=0; a=0; dawr=0;
while(1)
{P0=a; //给a不断的加一,然后送给DA
delay(50); //延时50ms左右,再加一,再送DA。
a++;
} }
注意:随着给DA送的数字量的不断增加,其转换成模拟量的电流也不断的增
} //程序测试用)
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{
case 0xed: key=4; break;
case 0xdd: key=5; break;
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
// 0-F编码
display(unsigned char num) //显示子函数
{
P0=table[num]; //将第num个显示编码送P0口
dula=1; //一个下降沿将数据锁存
dBaidu Nhomakorabeala=0;
P0=0xc0; //位选通全部的数码管
beep=0;
}
beep=1;
display(key);
}
} } }
五、实验仪器设备
1.单片机实验系统
2.计算机
六、思考题
按下键盘矩阵后,在六个数码管上依次显示所按下的键所代表的数字。按复
位键可以清空显示为0
实验二
一、实验目的
学会用单片机控制数模转换芯片DAC0832
二、实验内容
通过用单片机控制DAC0832输出锯齿波,让开发板上发光二极管D12由暗
TR0=1;
TH0=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时
器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
ET0=1;
EA=1;
while(1)
{
if(shijian==0)
//4*4键盘检测程序,按下键后相应的代码显示在数码管上
#include<reg51.h>
sbit beep=P2^3; //蜂鸣器接口
sbit dula=P2^6; //控制数码管段选的锁存器锁存端
sbit wela=P2^7; //控制数码管位选的锁存器锁存端
unsigned char i=100;
if(temp!=0xf0) //如果有键按下刚一定不相等,于是进入//下一
步检测
{
delay(10); //延时去抖动
if(temp!=0xf0) //再次判断是否有键按下
{
temp=P3; //判断为有,再次读P3口数据
switch(temp) //因为刚才是将第一行置的低
{ //在这里再判断是第几列
实验一
一、实验目的
学会矩阵键盘的检测,掌握数码管静态显示原理
二、实验内容
依次按下4*4矩阵键盘上从第1到第20个键,同时在六位数码管上依次显示0、
1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
开发板上数码管为共阴极。静态数码管显示原理:,一位数码管内一共有8
个发光二极管,对共阴极来说其8个发光二极管的阴极在数码管内部全部接在一
{
switch(deng)
{
case 0: shijian=50; //红灯deng=1; break;
case 1: shijian=15; //黄灯deng=2; break;
case 2: shijian=50; //绿灯deng=3; break;
case 3: shijian=15; //黄灯deng=0; break;
case 0xee: //如果temp=0xee则为第一行和第一列key=0; //的交叉点,由此知道是矩阵键盘break; //上的第一个键被按下,给key=0
case 0xde: //以后依此类推key=1; break;
case 0xbe: key=2; break;
case 0x7e: key=3; break;
起,也就是“共阴”说法的来源,阳极是独立的,设计电路时一般把阴极接地,
当从外部给任一个阳极加一个高电平时这个发光二极管就亮了,如果想要出一个8
字,并且把右下角的小数点也点亮的话,那可以给8个阳极全送高电平,想让数码
管显示几就给相对应的发光二极管送高电平,因此在显示数字的时候首先做的就
是给0-9十个数字编好码,在要它亮什么数字的时候直接把这个编码送到它的阳
wela=1; //一个下降沿将数据锁存
wela=0;
}
void main()
{
dula=0; //先关闭两个锁存器
wela=0;
while(1) //进入检测总循环
{
P3=0xfe; //给P3.0送低电平,其余为高电平
temp=P3; //把P3口数据读回来
temp=temp&0xf0; //把P3口与11110000相与
unsigned char j,k,temp,key;
void delay(unsigned char i) //可自定义延时长短的延时函数
{ //当i=10时大约为10毫秒
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
到亮变化,循环下去。
DAC0832:DAC0832是8位全MOS中速D/A转换器,采用R—2RT形电阻解码
网络,转换结果为一对差动电流输出,转换时间大约为1us。使用单电源+5V―+15V
供电。参考电压为-10V-+10V。在此直接选择+5V作为参考电压。DAC0832有三
种工作方式:直通方式,单缓冲方式,双缓冲方式;在此选择直通的工作方式,
switch(temp)
{
case 0xe7: key=12; break;
case 0xd7: key=13; break;
case 0xb7: key=14; break;
case 0x77: key=15; break;
}
while(temp!=0xf0)
{temp=P3;
temp=temp&0xf0;
极就行了。一般的数码管每一段亮至少需要10个毫安的电流,而单片机的IO口
送不出如此大的电流,所以需要加数码管的驱动电路,可以用上拉电阻的方法,
也可以使用专门的驱动芯片,本开发板使用的74HC573,其输出电流较大,足够
点亮数码管。
本开发板上的六位数码管中每个相同段号(段指a,b,c,d,e,f,g,h)全部是接在
将XFER、WR2、CS管脚全部接数字地。管脚8接参考电压,在此接的参考电压是
+5V。在控制P0口输出数据有规律的变化将可以产生三角波,锯齿波,梯型波等
波形了。
三、实验电路
四、实验程序
//测试程序下载后可观察到D12发光二极管由暗变亮再熄灭过程,
#include<reg51.h>
sbit wela=P2^7; //数码管位选
{ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}
五、实验仪器设备
1.单片机实验系统
2.计算机
实验四
一、实验目的
}
while(temp!=0xf0) //这段程序是检测按键是否被释放
{
temp=P3; //如果没有释放就一直等待并且
temp=temp&0xf0;
beep=0; //蜂鸣器一直响
}
beep=1; //释放后关闭蜂鸣器
display(key); //显示按下相应键值的数据
P1=0xfe; //将第一个发光二极管点亮
} }
if(pp==20)
{ pp=0; shijian--;
}
a0=shijian%10;
a1=shijian/10;
display(a1,a0);
switch(deng)
{
case 1: P1=0X00; //红灯break;
case 2: //黄灯if(shijian%2==0) P1=0x00; if(shijian%2==1) P1=0xff; break;
一起的,其中每一个位(阴极)是独立的,所以在做静态显示的时候所有的数码
管只能显示相同的数字,当然可以控制哪几位显示,如果让它们显示不同的数字
那就得给每一个数码管加一套驱动电路。
下面给出本开发板共阴极数码管数字编码:
矩阵键盘的四行分别与P3.0-P3.3连接,四列分别与P3.4-P3.7连接。
三、实验电路:
case 0xbd: key=6; break;
case 0x7d: key=7; break;
}
while(temp!=0xf0)
{ temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
} }
P3=0xfb;
temp=P3;
temp=temp&0xf0;
sbit dula=P2^6; //段选
sbit dawr=P3^6; //DA写数据
sbit csda=P3^2; //DA片选
unsigned char a,j,k;
void delay(unsigned char i) //延时
{ for(j=i;j>0;j--)
for(k=125;k>0;k--);
大,所以我们观察发光二极管D12就会从暗变亮,熄灭。。。
五、实验仪器设备
1.单片机实验系统
2.计算机
六、思考题
实现简易方波发生器。可观察到发光二极管再亮和灭两种状态之间闪烁。用
示波器观察IOUT引脚电平,可看到方波波形。
一、实验目的
学习模拟交通控制方法
二、实验内容
模拟交通灯显示。其中,红灯与绿灯显示时间均为50s,中间的黄灯显示时
间为15s。绿灯用八位发光二极管流动闪烁作代表;红灯用八位发光二极管全亮
作代表;黄灯用八位发光二极管全亮全灭闪烁作代表。刚开始显示的为绿灯。
显示顺序:绿--黄--红--黄--绿--黄--红--………………
三、实验电路
四、实验程序
#include<reg51.h>
#define uchar unsigned char
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{
case 0xeb: key=8; break;
case 0xdb: key=9; break;
case 0xbb: key=10; break;
case 0x7b: key=11; break;
{ dula=0;
P0=table[sh_c];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[g_c];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
}
void main()
{
TMOD=0x01;
uchar j,k,l=255;
uchar a1,a0;
uchar shijian,deng=2;
void delay(unsigned int i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(unsigned char sh_c,unsigned char g_c)
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
unsigned int pp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
case 3: //绿灯if(shijian%2==0) P1=0x55; if(shijian%2==1) P1=0xaa; break;
case 0: if(shijian%2==0) //黄灯P1=0x00; if(shijian%2==1) P1=0xff; break;
} } }
void time0() interrupt 1
}
while(temp!=0xf0)
{ temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key); } }
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(10);
if(temp!=0xf0)
{ temp=P3;
}
void main()
{ wela=0; dula=0; csda=0; a=0; dawr=0;
while(1)
{P0=a; //给a不断的加一,然后送给DA
delay(50); //延时50ms左右,再加一,再送DA。
a++;
} }
注意:随着给DA送的数字量的不断增加,其转换成模拟量的电流也不断的增
} //程序测试用)
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{
case 0xed: key=4; break;
case 0xdd: key=5; break;
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
// 0-F编码
display(unsigned char num) //显示子函数
{
P0=table[num]; //将第num个显示编码送P0口
dula=1; //一个下降沿将数据锁存
dBaidu Nhomakorabeala=0;
P0=0xc0; //位选通全部的数码管
beep=0;
}
beep=1;
display(key);
}
} } }
五、实验仪器设备
1.单片机实验系统
2.计算机
六、思考题
按下键盘矩阵后,在六个数码管上依次显示所按下的键所代表的数字。按复
位键可以清空显示为0
实验二
一、实验目的
学会用单片机控制数模转换芯片DAC0832
二、实验内容
通过用单片机控制DAC0832输出锯齿波,让开发板上发光二极管D12由暗
TR0=1;
TH0=(65536-46080)/256;//由于晶振为11.0592,故所记次数应为46080,计时
器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
ET0=1;
EA=1;
while(1)
{
if(shijian==0)