1、实验内容一
1.1、问题一:
用单位杜邦线将某一位I/O口与发光二极管相连,利用定时/计数器使发光二极管闪烁(定
时时间到,I/O口输出取反,定时时间取1s)。用中断方式和查询方式分别实现之。
1.2、问题一的代码:
1.2.1中断方式代码:
#include <reg51.h>
#include <absacc.h>
int flag = 0;
sbit P1_2 = P1^2;
void main()
{
TMOD = 0x10;
TH1 = -50000 / 256;
TL1 = -50000 % 256;
P1_2 = 0;
EA = 1;
ET1 = 1;
TR1 = 1;
for (;;) ;
}
void int1() interrupt 3
{
TH1 = -50000 / 256;
TL1 = -50000 % 256;
flag++;
if (flag == 20)
{
P1_2 = !P1_2;
flag = 0;
}
}
1.2.2 查询方式代码
#include <reg51.h>
#include <absacc.h>
int flag = 0;
sbit P1_2 = P1^2;
void time_over();
void main()
{
TMOD = 0x10;
TH1 = -50000 / 256;
TL1 = -50000 % 256;
P1_2 = 0;
EA = 1;
ET1 = 1;
TR1 = 1;
for (;;)
{
if (TF1 == 1)
{
time_over();
}
}
}
void time_over()
{
TH1 = -50000 / 256;
TL1 = -50000 % 256;
TF1 = 0;
flag++;
if(flag == 20)
{
P1_2 = !P1_2;
flag = 0;
}
}
1.3、问题一的结果和现象:
发光二极管每隔1秒进行闪烁一次,即亮灭的周期为2秒。
2、实验内容二
2.1、问题二:
利用定时计数器1的计数功能实现每五次按下独立按键(按下独立按键触发计数脉冲),发光二极管LED1亮灭取反。
2.2、问题二的代码:
#include <reg51.h>
#include <absacc.h>
sbit P1_2 = P1^2;
void main()
{
TMOD = 0x60;
TH1 = 251;
TL1 = 251;
P1_2 = 0;
EA = 1;
ET1 = 1;
TR1 = 1;
for (;;) ;
}
void int1() interrupt 3
{
P1_2 = !P1_2;
}
2.3、问题二的实验结果和现象:
理论上每按下五次独立按键,发光二极管LED1亮灭取反。但由于实际操作中有按键时产生的抖动,所以会产生按键不足五次时也会产生亮灭取反。
3、实验内容三
3.1、问题三:
使用定时器和数码管模拟倒计时红绿灯原理 。P1口连接至LED用于显示红黄绿灯,P0口用于连接2位数码管显示倒计时时间。(红灯倒计时30S,黄灯倒计时3S,绿灯倒计时27S,实现如下循环交替。
3.2、问题三的代码:
#include <reg51.h>
#include <absacc.h>
int Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
int flag = 0;
int second = 29;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
int shiwei;
int gewei;
int red = 1;
int yellow = 0;
int green = 0;
void timer();
void delay();
void main()
{
//设置定时器的工作方式
TMOD = 0x10;
TH1 = -50000 / 256;
TL1 = -50000 % 256;
EA = 1;
ET1 = 1;
TR1 = 1;
P0 = 0x3f;
//显示
while (1)
{
shiwei = Tab[second/10];
gewei = Tab[second%10];
P1 = 0xbf;
P2_2 = 1;
P2_2 = 0;
P1 = shiwei;
P2_3 = 1;
P2_3 = 0;
delay();
P1 = 0x7f;
P2_2 = 1;
P2_2 = 0;
P1 = gewei;
P2_3 = 1;
P2_3 = 0;
delay();
}
}
//定时记数中断
void int1() interrupt 3
{
TH1 = -50000 / 256;
TL1 = -50000 % 256;
flag++;
if (flag == 20)
{
flag = 0;
second--;
if (second == -1)
{
if (red)
{
P0 = 0xf3;
second = 26;
red = 0;
green = 1;
}
else if (green)
{
P0 = 0xcf;
second = 2;
green = 0;
yellow = 1;
}
else
{
P0 = 0x3f;
second = 29;
yellow = 0;
red = 1;
}
}
}
}
//防止重叠函数
void delay()
{
int y;
for(y=300;y>0;y--);
}
3.3、问题三的实验结果和现象:
在数码管上先显示“29”,此时对应的二极管为红灯亮。当数码管显示到“00”时,隔1秒后数码管的数字转换为“26”,此时对应的二极管为绿灯亮。当绿灯时间到后,隔1秒后数码管显示“00”,然后数码管显示“02”。然后循环点亮下去,对应数码管的时间依次对应。