部分程序,内含原理,原理图,接线图,源程序,需要修改里面的断码。网上有。
单片机定时器的应用 1、单片机定时器的工原理 MCS-51 单片机内部有两个16 位可编程的定时器/计数器T0 和T1。它们即可用作定时器方式,又可用作计数器方式。其中T0 由TH0 和TL0 计数器构成;T1 由TH1 和TL1 计数器构成。 工作于定时器方式时,通过对机器周期(新型51单片机可以对振荡周期计数)的计数,即每一个机器周期定时器加1,来实现定时。故系统晶振频率直接影响定时时间。如果晶振频率为12MHZ,则定时器每隔(1/12MHZ)×12=1us 加1。 工作于计数器方式时,对P3.4 或P3.5 管脚的负跳变(1→0)计数。它在每个机器周期的S5P2 时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,计数器加1。因此需要两个机器周期来识别一个有效跳变,故最高计数频率为晶振频率的1/24。 特殊功能寄存器TMOD 用于定时器/计数器的方式控制。高4 位用于设置T1,低4 位用于设置T0。如图1所示。
图1 定时器模式控制字格式
TCON 寄存器用于定时器的计数控制和中断标志。如图4-8所示。
图2 定时控制寄存器数据格式 编写程序控制这两个寄存器就可以控制定时器的运行方式。 2、单片机内部定时器/计数器的使用 (1)根据需要设置工作方式,即对TMOD设置; (2)定时/计数初值的设定; (3)然后启动计数,即对TR0或TR1置1。 (5)如需用中断,则将EA和相关中断控制位置1;则计数溢出后硬件会自动转入中断入口地址;如使用查询,则必须对溢出中断标志位TF0或TF1进行判断。 1、实验开发板连接图 2、实验源程序 /******************************************************************************* * 标题:试验数码管上显示定时器中断计数 * * 连接方法:参照接线图 * ******************************************************************************/
- #include < reg51.h >
- #include <intrins.h>
- sbit LS138A=P2^2; //定义 138管脚
- sbit LS138B=P2^3;
- sbit LS138C=P2^4;
-
- unsigned int LedNumVal,LedOut[8];
-
- // 此表为 LED 的字模 //
- unsigned char code Disp_Tab[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,
- 0xbf,0xc7,0x8c,0xc1,0xff,0xf7 };
-
- /***********************************************************
- purpose: 系统初始化
- /**********************************************************/
- void system_Ini()
- {
- TMOD = 0x00; //选择模式0 13位计数 最大计数8192
- TH0 = (8192 - 1000)/32; // TH0=0x1C; 12.000M 预装初值
- TL0 = (8192 - 1000)%32 ; //TL0=0x18;
- IE = 0x8A; //中断
- TR0 = 1; //开启T0定时器
- }
-
- void delay(unsigned int i)
- {
- char j;
- for(i; i > 0; i--)
- for(j = 200; j > 0; j--);
- }
-
- /********主函数****/
- main()
- {
- system_Ini() ;
- while(1)
- {
- unsigned char i;
- LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
- LedOut[1]=Disp_Tab[LedNumVal%1000/100];
- LedOut[2]=Disp_Tab[LedNumVal%100/10];
- LedOut[3]=Disp_Tab[LedNumVal%10];
- for( i=0; i<8; i++)
- { P0 = LedOut[i];
-
- switch(i)
- {
- case 0:LS138A=0; LS138B=0; LS138C=0; break;
- case 1:LS138A=1; LS138B=0; LS138C=0; break;
- case 2:LS138A=0; LS138B=1; LS138C=0; break;
- case 3:LS138A=1; LS138B=1; LS138C=0; break;
- case 4:LS138A=0; LS138B=0; LS138C=1; break;
- case 5:LS138A=1; LS138B=0; LS138C=1; break;
- case 6:LS138A=0; LS138B=1; LS138C=1; break;
- case 7:LS138A=1; LS138B=1; LS138C=1; break;
- }
- delay(150);
- }
-
- }
-
- }
-
- /*************************************
- [ T0 (1ms)中断] 中断
- *************************************/
- void T0zd(void) interrupt 1 //3定时器1的中断号 ;1定时器0的中断号,
- // 0外部中断1; 2外部中断2 ; 4串口中断
- {
- TH0 = (8192 - 1000)/32 ; //TH0 = 0xFc,12.000
- TL0 = (8192 - 1000)%32; //TL0 = 0x18;
- LedNumVal++;
- }
复制代码
思考题:
1、标注程序,画出流程图
2、给出定时器定时一秒的计算过程。
完整的Word格式文档51黑下载地址:
3单片机定时器的应用.docx
(192.92 KB, 下载次数: 14)
|