发光二极管流水灯实验.docx
《发光二极管流水灯实验.docx》由会员分享,可在线阅读,更多相关《发光二极管流水灯实验.docx(18页珍藏版)》请在冰豆网上搜索。
发光二极管流水灯实验
实验
发光二极管流水灯实验
一、实验目的:
1.通过AT89C51单片机控制8个发光二极管,八个发光二极管分别接在单片机的P0.0—P0.7
接口上,输出“0”时,发光二极管亮。
开始时P0.0TP0.1…「P0.7,实现亮点以1HZ频率循环移动。
2.用PROTEUS^计,仿真以AT89C51为核心的发光二极管流水灯实验装置。
3.掌握发光二极管的控制方法。
二、PROTEU电路设计:
三、程序部分
#includesbitcontrol=P3A7;voiddelay(intz){
intx,y;
for(x=z;x>0;x--)for(y=110;y>0;y--);
}
voidmain()
{
inti,tmp;
control=0;
P0=0xef;delay(1000);for(i=1;i<=7;i++){
tmp=P0;
P0=(tmp>>1)+0x80;delay(1000);
}
}
实验二
开关控制LED数码管实验
一、实验目的:
1.通过AT89C51读入4位开关K1、K2、K3、K4的输入状态,并按照二进制编码关系0-F输
出到数码管显示。
(如K4K3K2K1全部按下,则显示F;若只有K2按下,则显示2。
)
2•掌握LED数码管的静态显示。
3.掌握I/O口的控制方法。
、PROTEU电路设计:
PintAH蚣H站
R2.2SA1H爼Ml
^2.5«13]PJjSMiU
FIJJR^D1蹲TEDFlJ,"klUpagwrTiKaiftD输地LP3EWf
p
I
I
1
I
j
■
■
■
■lTal2
mowMiFO.IluJCHFOJWQJFC.3L4D3to相3FPSIACS
KIJ&UD6
IKT
、程序部分
#includeunsignedchartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,};unsignedcharKEY;
voidmain()
{
while
(1)
{
KEY=P2;
switch(KEY)
{
case0xff:
P0=table[0];break;case0xfe:
P0=table[1];break;case0xfd:
P0=table[2];break;case0xfc:
P0=table[3];break;case0xfb:
P0=table[4];break;case0xfa:
P0=table[5];break;case0xf9:
P0=table[6];break;case0xf8:
P0=table[7];break;case0xf7:
P0=table[8];break;case0xf6:
P0=table[9];break;case0xf5:
P0=table[10];break;case0xf4:
P0=table[11];break;case0xf3:
P0=table[12];break;case0xf2:
P0=table[13];break;case0xf1:
P0=table[14];break;case0xf0:
P0=table[15];break;default:
break;
实验
外中断优先级实验
、实验目的:
1.理解单片机中断优先级和优先权。
2.用PROTEU设计,仿真基于AT89C51单片机的中断优先级实验
3.掌握中断编程方法。
单片机主程序控制P0口数码管循环显示0〜8;外中断0、外中断1发生时分别在P2口、P1口依次显示0〜&通过实验可演示高优先级可中断低优先级,但低优先级的中断请求不能中断高优先级。
、PROTEU电路设计:
、程序部分
共阳数码
#include
unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80};//
管的段码
voiddelay(intz){
//
延时子程序,大约1ms
intx,y;
for(x=110;x>0;x--)for(y=z;y>0;y--);
}
inti0=0,i1=0;voidmain()
{
//
用于中断0,1显示数码管的变量
inti;EX0=1;
//
开外部中断0
EX1=1;
IT0=1;
IT1=1;
PX0=1;
PX1=0;EA=1;while
(1){
//
开外部中断1
//开总中断
for(i=0;i<9;i++)
{
P0=table[i];delay(200);
//P0循环显示0~8
}
voidint0()interrupt0
{
//
外部中断0优先级高于外部中断1,中断号为
for(i0=0;i0<9;i0++)
{
//显示
0~8
P2=table[i0];
delay(200);
}
voidint1()interrupt2
{
//
外部中断1,中断号为
for(i1=0;i1<9;i1++)
{
P1=table[i1];delay(200);
//显示
0~8
实验四60S倒计时实验
实验目的:
1.通过AT89C51的定时器实现60S倒计时,显示采用两位数码管动态显示
2.用PROTEU设计,仿真基于AT89C51单片机的60S倒计时实验。
二、PROTEU电路设计:
三、程序部分
#include
sbitGE=P2A1;
sbitSHI=P2A0;
intcount=0,number=60;
unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
voiddelay(intz);
voiddisplay。
;
voidmain()
{
EA=1;
ET0=1;
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while
(1)
{
display();
}
}
voiddelay(intz)
{
intx,y;
for(x=110;x>0;x--)for(y=z;y>0;y--);
}
voiddisplay()
{
SHI=0;
GE=1;
P1=table[number%10];delay(10);
GE=0;
SHI=1;
P1=table[number/10];delay(10);
}
voidtime_count()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;count++;
if(count==20)
{
count=0;
number--;
if(number<0)number=59;
一、实验目的:
1.掌握键盘设计中按键识别的原则。
2.用PROTEU设计一个常规4X4的矩阵键盘。
3.键盘编码规则自己定义,分别对应数字键0-9、A-F,按下对应的按键显示在数
码管上显示对应的数据。
、PROTEU电路设计:
三、程序部分
#include
sbit
show_1=
=P20;
sbit
show_2=
=pig
sbit
show_3=
=p“2;
sbit
show_4=
=P1A3;
unsignedcharj,k,temp,key;
unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,};
voiddelay(unsignedchari);
voiddisplay(unsignedcharnum);
voidkey_scan();
voidmain()
{
while
(1)
{
key_scan();display(key);
}
}
voiddelay(unsignedchari)
{
for(j=i;j>0;j--)
for(k=110;k>0;k--);
}
voiddisplay(unsignedcharnum){
P0=table[num];show_4=0;
}
voidkey_scan()
{
P2=0xef;
temp=P2;temp=temp&0x0f;if(temp!
=0x0f)
{
delay(10);
if(temp!
=0x0f)
{
temp=P2;
switch(temp)
{
case0xe7:
key=0;break;
case0xeb:
key=1;break;
case0xed:
key=2;break;
case0xee:
key=3;break;
}while(temp!
=0x0f)
{
temp=P2;temp=temp&0x0f;
}
display(key);
}
}
P2=0xdf;temp=P2;temp=temp&0x0f;if(temp!
=0x0f)
{
delay(10);if(temp!
=0x0f){
temp=P2;switch(temp){
case0xd7:
key=4;
break;
case0xdb:
key=5;
break;
case0xdd:
key=6;
break;
case0xde:
key=7;
break;
}while(temp!
=0x0f)
{
temp=P2;temp=temp&0x0f;
}
display(key);
}
}
P2=0xbf;temp=P2;temp=temp&0x0f;
if(temp!
=0x0f)
{
delay(10);
if(temp!
=0x0f){
temp=P2;
switch(temp){
case0xb7:
key=8;break;
case0xbb:
key=9;break;
case0xbd:
key=10;break;
case0xbe:
key=11;break;
}while(temp!
=0x0f)
{
temp=P2;temp=temp&0x0f;
display(key);
}
}
}
P2=0x7f;
temp=P2;temp=temp&0x0f;if(temp!
=0x0f)
{
delay(10);if(temp!
=0x0f)
{
temp=P2;switch(temp)
{
case0x77:
key=12;break;
case0x7b:
key=13;break;
case0x7d:
key=14;break;
case0x7e:
key=15;break;
}while(temp!
=0x0f)
{
temp=P2;temp=temp&0x0f;
}
display(key);
}
}
}
实验六AD转换程序设计
、实验目的:
1.掌握转换器ADC0809勺使用
2.用PROTEU设计,仿真基于AT89C51单片机的A/D转换实验。
3.通过改变电位器的值改变模拟量的输入,经转换为数字量在LED上显示,比对
模拟量和数字量的关系。
、PROTEU电路设计:
三、程序部分
#include
sbitOE=P3A1;
sbitSTART=卩3人3;
sbitNUM_1=P3A4;
sbitNUM_2=P3A5;
sbitNUM_3=P3A6;
sbitNUM_4=卩3人7;
sbitdp=卩1人7;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsignedintdate;
voidshow();
voiddelay(intz)
{
intx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);
}
voidmain()
{
EX0=1;
IT0=1;
EA=1;
START=0;
START=1;
START=0;while
(1);
}
voidover()interrupt0
{
OE=1;date=P0;
OE=0;
show();
START=0;
START=1;
START=0;
}
voidshow()
{
NUM_3=1;
NUM_2=1;
P1=table[date/51];dp=1;NUM_1=0;delay(5);
NUM_1=1;
P1=table[date%51*100/51/10];
NUM_2=0;
delay(5);
NUM_2=1;
P1=table[date%51*100/51%10];
NUM_3=0;
delay(5);
、实验目的:
1.掌握单片机串口通信程序的设计
2.了接RS232接口通信的特点。
3.双机通信:
分别把接收到的对方通过逻辑开关输入的信息在本地数码管上显示,如下图甲机的逻辑开关数据为81H,乙机通过串口接收该数据并数码关管显示,而甲机显示乙机发送的数据88Ho
、PROTEU电路设计:
三、程序部分
#includevoidinit(){
TMOD=0X20;//定时器1方式2
TH1=0XFD;
TL1=0XFD;//装入初值
TR1=1;//启动定时器
//设置方式1
SM0=0;SM1=1;
TI=0;
RI=0;
ES=1;
//打开串口中断
EA=1;
//打开总中断
ES=1;
//打开串口中断
REN=1;
//接收使能
SBUF=P1;
}
voidmain()
{
init();
while
(1);
}
voidserial()interrupt4
{
if(RI)
{
RI=0;
P0=SBUF;
//
从缓冲区中把接收的字符放入c中
}if(TI)
{
TI=0;
SBUF=P1;
}
}