从单片机的P0.0发出一个50Hz的方波工作方式2急求程序

如题所述

第1个回答  2018-11-19
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
    MOV TMOD,#02H
    MOV TH0,#6
    MOV TL0,#6
    SETB TR0
    SETB ET0
    SETB EA
    MOV R2,#40
    SJMP $
T0ISR:
    DJNZ R2,T0E
    CPL P0.0
T0E:
    RETI
    END

本回答被网友采纳
第2个回答  2018-11-19

f=50hz T=0.02s=20000us  每过10000us翻转一次

#include "reg52.h" 
typedef unsigned int u16;  
typedef unsigned char u8;
sbit pwm=P0^0; //定义输出pwm口
/*******************************************************************************
定时器0初始化
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01;//配置tmod寄存器为定时器0方式1
TH0=(65536-10000)/256; //因为方式1是16位定时器  所以用(65536-10000)us取高8位
TL0=(65536-10000)%256;//同上取低八位
ET0=1;//使能定时器0中断
EA=1;//使能总中断 
TR0=1;//开启定时器
}
void main()
{
Timer0Init();  //定时器初始化配置
while(1);//等待中断
}
void Timer0() interrupt 1
{
TH0=(65536-10000)/256; //重装计数值
TL0=(65536-10000)%256;
pwm=~pwm;//每进入一次中断就翻转一次
}

追问

有工作方式2的吗

追答TMOD|=0X02;//配置tmod寄存器为定时器0方式1
TH0=256-1 ;//因为方式2是8位定时器  所以用256-1us
TL0=256-1;//计时时只有tl0在计时,然后tl0溢出时重新装在th0的值
//上面这段话代替timerinit里边的这三句  这样定时是1us

然后interrupt里边这样写
{
    static u16 i=0;
    i++;
    if(i==10000)
    {
        pwm=~pwm;
        i=0;
    }
}
//加数那个逻辑我没仔细想 你自己好好看看  但基本定时时间没问题

方式二的话你只需要把tmod重新配置以及初值装载正确就行呀  上课要认真听啊  

方式二是八位定时器,因为不能直接定时那么多,所以得在中断中累加得值。

如果你觉得这样也很麻烦的话,可以参考stc里边有自动配置,如果还是有问题私我。