sbit LED = P1^0;
/*---------------------T1初始化子函数------------------*/ void Timer1_init(void) { TMOD = 0x60; //1设定定时器1模式2,计数功能 TH1 = 0xfb; //设置计数器初值(计满溢出值-5) TL1 = 0xfb; ET1 = 1; EA = 1; TR1 = 1; //启动计数 }
/*---------------------T1中断服务子函数------------------*/
void Timer1_int(void) interrupt 3 using 1 //定时计数T1中断服务程序 { LED = ~LED; }
/*---------------------主函数------------------*/ void main(void) //主函数 { Timer1_init(); //定时T1初始化 while(1) ; }
思考:用方式0实现。
例8.5 利用单片机定时器/计数器设计一个秒表,由P1口连接LED灯,采用BCD码显示,发光二极管亮表示1,暗则表示0,计满100s后从头开始,依次循环。利用一只按键控制秒表的启、停。利用复位键,返回初始工作状态。
解: 选用P1口作输出端,控制8只发光二极管显示,设发光二极管的驱动是低电平亮,高电平灭。P3.5接秒表的启、停按键。采用T0的方式0作定时器,12M晶振,分频系数为12,即定时时钟周期为1μS
汇编语言参考程序如下:
ORG 0000H LJMP MAIN ORG 000BH
LJMP Timer0_ISQ MAIN:
MOV TMOD,#00H ;T0方式1定时
MOV TH0,#3CH ;重新置T0 50ms定时的初值 MOV TL0,#0B0H
SETB ET0 SETB EA
MOV R3,#14H ;置50ms计数循环初值(1s/50ms)
MOV A, #00H ;计数显示初始化
CPL A ;满足低电平驱动要求
MOV P1,A
CPL A ;恢复秒表计数值 Check_Start_Button: JNB P3.5, Start
CLR TR0
SJMP Check_Start_Button Start:
SETB TR0
SJMP Check_Start_Button Timer0_ISQ:
DJNZ R3,Exit_Timer0_ISQ
ADD A, #01 ;秒表加1
DA A ;十进制调整 CPL A ;满足低电平驱动要求 MOV P1,A
CPL A ;恢复秒表计数值 MOV R3, #14H Exit_Timer0_ISQ: RETI
END
C51参考程序如下:
#include
/*----------------------------T0初始化子函数--------------------------------*/ void Timer0_init(void) { TMOD = 0X00; //T0方式1 TH0 = (65535-50000)/256; //赋初始值,50ms TL0 = (65535-50000)%6; //赋初始值 ET0=1; EA=1; }
/*----------------------------T0中断服务子函数--------------------------------*/ void Timer0_int(void) interrupt 1 using 1 //T0中断服务子程序 { i++; if(i==20) //i=20时,计时1S { i = 0; dat++; f(dat==100) //计时到100S时,又从0开始 { dat=0; } } }
/*----------------------------启动子函数--------------------------------*/ void Start(void) //启动定时函数 {
if(key==0) { TR0=1; } else
//判断按键按下
//开始计时
{ TR0=0; } }
/*---------------------------BCD码转换子函数--------------------------------*/ uchar BCD(uchar BCDat) //BCD转换 { uchar x; x = (BCDat/10)*10+BCDat; return(x); }
/*--------------------------主函数--------------------------------*/ void main(void) { Timer0_init(); //T0初始化 while(1) { Start(); // 启动定时 P1 = ~(BCD(dat)); //送LED显示
} }
例8.6 编程在P3.0、P3.5、P3.4引脚上分别输出115.2KHZ、51.2KHZ、38.4KHZ的时钟信号。
解:设系统时钟频率为12 KHZ,T0、T1工作在方式2定时状态,且工作在无分频模式,即各定时器的定时脉冲频率等于时钟频率,即(T0x12)=(T1x12)=(T2x12)=1;各根据前面可编程时钟输出频率的计算公式,计算各定时器的定时初始值: (T2H)=FFH,(T2L)=CCH,(TH0)=(TL0)=8BH,( TH1)=(TL1)=64H
(1)汇编语言参考程序 T2H EQU D6H T2L EQU D7H AUXR EQU 8EH
INT_CLKO EQU 8FH
ORG 0000H
MOV TMOD,#22H ;T0、T1工作方式2定时状态
ORL AUXR,#80H ;T0工作在无分频模式 ORL AUXR,#40H ;T1工作在无分频模式 ORL AUXR,#04H ;T2工作在无分频模式
MOV T2H,#0FFH ;设置BRT定时器的初始值
MOV T2L,#0CCH
MOV TH0,#139 ;设置T0定时器的初始值 MOV TL0,#139
MOV TH1,#100 ;设置T1定时器的初始值 MOV TL1,#100
ORL INT_CLKO,#07H ;允许CLKOUT0、CLKOUT1、CLKOUT2时钟输出 SETB TR0 ;启动T0 SETB TR1 ;启动T1 ORL AUXR,#10H ;启动T2 SJMP $
(2)C51参考程序
#include
sfr INT_CLKO = 0x8F; sfr AUXR = 0x8E; sfr T2H = 0XD6; sfr T2L = 0Xd7;
main() {
TMOD = 0x22;
AUXR = (AUXR|0x80); //T0工作在无分频模式 AUXR = (AUXR|0x40) ; //T1工作在无分频模式 AUXR = (AUXR|0x04) ; //T2工作在无分频模式
相关推荐: