Proteus仿真
P3.0输出占空比
T+、T-设置占空比时间,每按一次加或减100ms
R+、R-设置占空比加减1% 初始为100ms 占空比50%
数码管前两位显示时间单位s,后两位显示占空比单位%
示波器显示
使用定时器,避免了数码管显示和按键扫描延时,实现占空比实时输出。避免因延时等待。 12MHz晶振程序如下
#include <reg52.h>
#define CLOCK 12000L
#define Fosc 12000000L
#define TMR 1
#define TMR_BASE (unsigned int)(65536-(Fosc*TMR/CLOCK))
#define TMR_BASEH TMR_BASE/0x100
#define MASK 0xaa
#define AddT 0xa8
#define CutT 0xa2
#define AddR 0x8a
#define CutR 0x2a
sbit OUT=P3^0;
code unsigned char Num[10]={0xc0,0xf9,0xa4,0x30,0x99,0x92,0x82,0xf8,0x80,0x90};
bit T1ms_Fg;
void Timer0_interrupt(void) interrupt 1
{
TR0=0;
TH0=TMR_BASEH;
TL0+=TMR_BASE;
TR0=1;
T1ms_Fg=1;
}
void TMR0_Init(void)
{
TMOD=0x01;
TH0=TMR_BASEH;
TL0=TMR_BASE;
TR0=1;
ET0=1;
}
bit Tmr_1ms_Fg,
Tmr_10ms_Fg,
Tmr_100ms_Fg;
unsigned char T100ms_count=10;
void timer(void)
{
Tmr_1ms_Fg=0;
Tmr_10ms_Fg=0;
Tmr_100ms_Fg=0;
if (T1ms_Fg)
{
T1ms_Fg=0;
Tmr_1ms_Fg=1;
--T100ms_count;
if (T100ms_count%10==0)
{
Tmr_10ms_Fg=1;
}
if (T100ms_count==0)
{
T100ms_count=10;
Tmr_100ms_Fg=1;
}
}
}
unsigned char T=1,R=50;
void diaplay(void)
{
static unsigned char status=0;
if(!Tmr_10ms_Fg)return;
P0=0xff;
P2=0x01<<status;
switch(status)
{
case 0:
P0=Num[T/10]&0x7f;
status++;
break;
case 1:
P0=Num[T%10];
status=4;
break;
case 4:
P0=Num[R/10];
status++;
break;
case 5:
P0=Num[R%10];
status=0;
break;
}
}
void key(void)
{
static unsigned char dat,statue=0;
if(!Tmr_10ms_Fg)return;
dat=P3&MASK;
if(dat==MASK)return;
statue++;
if(statue<16)return;
statue=0;
switch(dat)
{
case AddT:
T++;
if(T>30)T=1;
break;
case CutT:
T--;
if(T<1)T=30;
break;
case AddR:
R++;
if(R>99)R=1;
break;
case CutR:
R--;
if(R<1)R=99;
break;
}
}
bit Duty_fg=1;
void duty(void)
{
static unsigned int r=50;
if(!Tmr_1ms_Fg)return;
if(--r)return;
OUT=Duty_fg;
if(Duty_fg)r=R*T;
else r=(100-R)*T;
Duty_fg=~Duty_fg;
}
void main(void)
{
TMR0_Init();
EA=1;
while(1)
{
timer();
diaplay();
duty();
key();
}
}


