单片机实验6

来源:互联网 发布:黑客帝国矩阵革命 编辑:程序博客网 时间:2024/06/04 19:59

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