51单片机的定时器程序,c语言编写,使用内部定时器设计一个三位秒表 (秒,十秒,分),显示秒位的变动,

51单片机的定时器程序,c语言编写,使用内部定时器设计一个三位秒表 (秒,十秒,分),显示秒位的变动,,第1张

方法:首先:要学会数码管的显示程序

然后:按键的 *** 作,注意软件的消抖(具体的是延时,10ms左右)。

假设有k1~停表,k2~复位,k3~继续运行

先说停表和继续运行的

停表:如果k1按下,TR0=0;

继续运行:如果k3按下,TR0=1;

复位:直接用硬件复位单片机或者k2按下,数据清零。

要实现数据的循环:只要定时器计数到最大值时,再把最小值赋给它!

主程序包括定时器程序:

开机先运行主程序,在主程序里还得有定时/计数器0的中断源开放并启动定时器,当定时时间或者计数次数到后,就会进入INTERRUPT 1这个中断服务程序里,执行完后返回到刚才的断点处(主程序中)。

基本上不算消耗太多时间。

每个指令的消耗时间可以KEIL模拟仿真的时候可以大概算出时间。

if(++t!=350)return,这句是没有达到350,就退出中断函数,到了中断时间载再进入就是另外一次了。

#include<stc89h>

#define uchar unsigned char

#define uint unsigned int

void TI2_way0(uint numerical);//定时器2 16位定时计数 numerical 定时计数数值 传统方式

void TI2_way1(uint numerical);//定时器2 16位自动重装定时计数 numerical 定时计数数值

void TI2_RUNset(bit state,way,control);//计数器/定时器2 运行与设置函数

/定时器2相关函数开始/

void TI2_way0(uint numerical) //定时器2 numerical 定时计数数值

{

numerical=(65536-numerical); //计算出定时值

TH2=(numerical/256); //定时器2的高8位计数值

TL2=(numerical%256); //定时器2的低8位计数

}

/定时器2 16位自动重装定时计数 numerical 定时计数数值/

void TI2_way1(uint numerical)//定时器2 16位自动重装定时计数 numerical 定时计数数值

{

//numerical=(65536-numerical); //计算出定时值

TH2=RCAP2H=(numerical/256); //定时器2的高8位计数值

TL2=RCAP2L=(numerical%256); //定时器2的低8位计数

}

/

计数器/定时器2 运行与设置函数

state 0关闭定时计数器2 1启动定时计数器2

way 0定时器模式 1计数器模式

control 0:16位自动重装定时器计数器 1:16位捕获

/

void TI2_RUNset(bit state,way,control)//计数器/定时器2 运行与设置函数

{

//IPH=PT2H; //定时器2中断优先级控制高位

RCLK=0;//接收时钟标志,0:使用定时器1作为串口接收发生器 1:使用定时器2作为串口接收发生器

TCLK=0;//发送时钟标志,0:使用定时器1作为串口发送发生器 1:使用定时器2作为串口发送发生器

switch(control) //启动方式选择

{

case 0x00:CP_RL2=0;EXEN2=0;break; // 0:16位自动重装定时器计数器

case 0x01:CP_RL2=1;EXEN2=1;break; // 1:16位捕获 捕获模式使能位

}

switch(way) //启动方式选择

{

case 0x00:C_T2=0;break; //定时器模式

case 0x01:C_T2=1;break; //计数器模式

}

TR2=state;//定时器2的启动控制位,1:启动定时器 0:停止定时器

ET2=1; //定时器2中断使能位

EA =1; //打开总中断

}

/

void Timing_count2() interrupt 5 //引脚P10

{

TF2=0;//定时器2溢出标志,由硬件置1,必须由软件清0

EXF2=0;//定时器2的外部标志,由硬件置1,必须由软件清0

}

/

多简单的事啊,我贴一个AVR采用定时器0计时的,你参考一下吧。

#pragma interrupt_handler timer0_ovf_isr:10 //TIMER0 定时2ms中断

void timer0_ovf_isr(void)

{

TCNT0 = 0xD9; //reload counter value

timer2ms++;

if(timer2ms >= 5)

{

timer2ms = 0;

timer10ms ++;

systimer10ms ++;

if(systimer10ms >= 22) //内部1M晶振

{

systimer10ms = 0;

timer1s ++;

}

}

也就是说。你另外起一个变量。与响应时间对照。你别说9999分钟。你就是9999年都可以做到。不理解时加我QQ问我吧。

定时器定时时间到,则自动进入中断程序,程序程序执行完后又“自动”返回主程序

由于nn是全局变量,所以它可以在原来的基础不断加1 如此反复

如果你看汇编程序:可知,不同的中断源有不同的中断程序入口地址,如定时器0的中断程序入口地址是000BH,一旦中断发生,程序便跳至此处执行,但此处并不是真正的中断程序,而它又是一条跳转指令,指向真正的中断服务程序,中断程序结束有一条返回语句RETI,又回到了中断之前的主程序中去,主程序每执行完一条指令,都要判断有无中断的发生,不需人工乾预

whlie(1)是个死循环,中断程序跳来跳去,还是在这个小圈子里

再次重新启动。

用C语言实现的,先要定义好定时器的初值,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期,机器周期=12/n(n指晶振频率),假设你要定时的时间为M,那么定时的初值为:M/机器周期=初值;

TH0=(65536-初值)%256;

TL0=(65536-初值)/256;

将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值,例如用12M晶振做1ms定时计算如下:

机器周期=12/1210^6=1us(微秒)

定时初值=(110^-3)/(110^-6)=1000;

所以:TH0=(65536-1000)%256;

TL0=(65536-1000)/256;

将65536-1000=64536化为16进制为:0xFC18,TH0=0xFC,TL0=0X18;

定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:timer0() interrupt 1 // 1ms延时(120MHz)

以上就是关于51单片机的定时器程序,c语言编写,使用内部定时器设计一个三位秒表 (秒,十秒,分),显示秒位的变动,全部的内容,包括:51单片机的定时器程序,c语言编写,使用内部定时器设计一个三位秒表 (秒,十秒,分),显示秒位的变动,、主程序包括定时器程序吗、单片机定时器控制数码管动态显示程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9831324.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存