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(); } }