单片机实验6

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”。然后循环点亮下去,对应数码管的时间依次对应。

 

猜你喜欢

转载自blog.csdn.net/chao_shine/article/details/78879372