单片机第六次实验课——计数器实验

发布时间 2023-03-22 21:10:53作者: Ryan爱吃糖

六、单片机第六次实验课——计数器实验


(1)采用定时器与计数器相结合的方法使P1.1所接的发光二极管亮1秒、灭1秒,周而复始。(查询方式、中断方式)

分析:晶振频率40MHZ,机器周期为(1/40)12=03μs,采用工作方式1最大定时为2^160.3≈20ms。若采用20ms为半周期,20ms225需要两根线,P1.0接T1,以T1作计数器,T0作定时器则:计数初值(-65535)补=0001H,(-25)补=E7H

ORG 0000H
MAIN:
CLR P1.1
SETB P1.0
MOV TMOD,#61H
MOV TH1,#0E7H
MOV TL1,#0E7H
SETB TR1
LOOP1:
CPL P1.1
LOOP2:
MOV TH0,#00H
MOV TL0,#01H
SETB TR0
LOOP3:
JBC TF0,LOOP4
SJMP LOOP3
LOOP4:
CPL P1.0
JBC TF1,LOOP1
AJMP LOOP2
END

对应C语言代码:

#include<reg51.h>
#define uchar unsigned char

sbit P1_0=P1^0;
sbit P1_1=P1^1;
timer0()interrupt 1 using 1
{
    P1_0=!P1_0;
    TH0=-33334/256;
    TL0=-33334%256;
}
timer1()interrupt 3 using 2
{
    P1_1=!P1_1;
}
main(){
    P1_1=0;
    P1_0=1;
    TMOD=0x61;
    TH0=-33334/256;
    TL0=-33334%256;
    TH1=-50;
    TL1=-50;
    IP=0x08;
    EA=1;
    ET0=1;
    ET1=1;
    TR0=1;
    TR1=1;
    while(1);
    }

10ms250,10ms/0.3μs≈33333,(-33333)补=7DCBH

ORG 0000H
SJMP MAIN
ORG 000BH
SJMP TINT0
MAIN:
MOV R0,#64H
CLR P1.1
MOV TMOD,#01H
MOV TH0,#7DH
MOV TL0,#0CBH
SETB EA
SETB ET0
SETB TR0
SJMP $

TINT0:
CPL P1.0
DJNZ R0,BACK
CPL P1.1
MOV R0,#64H
BACK:
MOV TH0,#7DH
MOV TL0,#0CBH
RETI
END

对应C语言代码:

#include<reg51.h>
#define uchar unsigned char
uchar counter;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
timer0()interrupt 1 using 1
{
    P1_0=!P1_0;
    TH0=-33334/256;
    TL0=-33334%256;
    if(counter==100){
        counter=0;
        P1_1=!P1_1;
    }
    else
        counter++;
}

main()
{
    counter=0;
    P1_1=0;
    P1_0=1;
    TMOD=0x01;
    TH0=-33334/256;
    TL0=-33334%256;
    EA=1;
    ET0=1;
    TR0=1;
    while(1);
}