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

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

分析:晶振频率40MHZ,机器周期为(1/40)*12=03μs,采用工作方式1最大定时为2^16*0.3≈20ms。若采用20ms为半周期,20ms*2*25需要两根线,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);
    }


 

 

10ms*2*50,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);
    }


 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ryan爱吃糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值