单片机交流
登录
直播中
青sky
9年用户
1284经验值
擅长:模拟技术
私信
关注
[问答]
基于51单片机的定时器定时1秒如何去实现?
开启该帖子的消息推送
定时器
51单片机
基于51
单片机
的定时器定时1秒如何去实现?
基于51单片机的数码管切换0-F如何去实现?
回帖
(1)
闫玮婧
2021-7-19 11:06:29
1、定时器定时1秒
我们先来计算定时中用的初值。先讲原理,帮助大家理解。
要定时一秒,直接一步到位,用定时器不行,因为:
16位定时器的溢出值是65536(2的16次方)
晶振11.0592MHZ(MHZ,后面乘10的6次方转化为HZ),
机器周期=1/11059200,
时钟周期=12*机器周期=12/11059200,
最多65536 X12/11059200=0.071秒,到不了1秒
所以,我们这里采用0.02秒X50=1秒的方法
初值计算:
(65536-x)*12/11059200=0.02
x=47104(十进制)=B800(十六进制)
所以,采用T0为模式1(T0十六位定时模式)
高八倍TH0=0xB8
第八位TL0=0x00
#include 《reg52.h》***it LED0 = P1^0;unsigned char cnt = 0; //定义一个计数变量,记录T0溢出的次数,单片机一次性到不了1秒,所以要倍数乘一下void main(){ TMOD = 0x01; //设置T0为模式1 TH0 = 0xB8; //高八位初值 TL0 = 0x00; //第八位初值 TR0 = 1; //启动T0定时器 while(1) { if(TF0 == 1) { TF0 = 0; //T0溢出,清除中断标志位,这里是定时程序,所以这条要加,如果是中断程序硬件自动清零,这条不用 TH0 = 0xB8; //重新赋初值,因为每次溢出后会自动清零 TL0 = 0x00; cnt++; //0.02秒加一次 if (cnt 》= 50) //0.02*50=1秒 { cnt = 0; //达到 50 次后计数值清零 LED0 = ~LED0; //LED0每隔一秒取反一次:一秒亮,一秒灭 } } }} 现象:LED0每隔一秒取反一次:一秒亮,一秒灭
2.数码管每隔一秒切换
数码管知识之前发过了,这里不重复
#include 《reg51.h》#define uint unsigned int //定义无符号整型的写法#define uchar unsigned char //定义无符号字符型的写法 ***it DU = P2^6;***it WE = P2^7;uchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66,//0-40x6D, 0x7D, 0x07, 0x7F, 0x6F,//5-90x77, 0x7C, 0x39, 0x5E, 0x79,0x71//A-F};//这里用code是把它放到ROM区,节省RAM区uchar cnt = 0; //记录T0中断次数uchar sec = 0; //记录经过的秒数void main(){ WE = 1; //打开位控 P0 = 0XFE; //1111 1110 根据原理图顺序,为左边第一个数码管 WE = 0; //关闭位控 TMOD = 0x01; //设置T0为模式1 TH0 = 0xB8; //高八位初值 TL0 = 0x00; //第八位初值 TR0 = 1; //启动T0定时器 while(1) { if(TF0 == 1) { TF0 = 0; //T0溢出,清除中断标志位,这里是定时程序,所以这条要加,如果是中断程序硬件自动清零,这条不用 TH0 = 0xB8; //重新赋初值,因为每次溢出后会自动清零 TL0 = 0x00; cnt++; //0.02秒加一次 if (cnt 》= 50) //0.02*50=1秒 { cnt = 0; // 达到 50 次后计数值清零 sec++; if(sec 》 15) //当秒数超过15,重新从0开始 { sec = 0; } } } DU = 1; //打开段控 P0 = table[sec]; DU = 0; //关闭段控 }} 显示效果:0-F,这里就发个一张
1、定时器定时1秒
我们先来计算定时中用的初值。先讲原理,帮助大家理解。
要定时一秒,直接一步到位,用定时器不行,因为:
16位定时器的溢出值是65536(2的16次方)
晶振11.0592MHZ(MHZ,后面乘10的6次方转化为HZ),
机器周期=1/11059200,
时钟周期=12*机器周期=12/11059200,
最多65536 X12/11059200=0.071秒,到不了1秒
所以,我们这里采用0.02秒X50=1秒的方法
初值计算:
(65536-x)*12/11059200=0.02
x=47104(十进制)=B800(十六进制)
所以,采用T0为模式1(T0十六位定时模式)
高八倍TH0=0xB8
第八位TL0=0x00
#include 《reg52.h》***it LED0 = P1^0;unsigned char cnt = 0; //定义一个计数变量,记录T0溢出的次数,单片机一次性到不了1秒,所以要倍数乘一下void main(){ TMOD = 0x01; //设置T0为模式1 TH0 = 0xB8; //高八位初值 TL0 = 0x00; //第八位初值 TR0 = 1; //启动T0定时器 while(1) { if(TF0 == 1) { TF0 = 0; //T0溢出,清除中断标志位,这里是定时程序,所以这条要加,如果是中断程序硬件自动清零,这条不用 TH0 = 0xB8; //重新赋初值,因为每次溢出后会自动清零 TL0 = 0x00; cnt++; //0.02秒加一次 if (cnt 》= 50) //0.02*50=1秒 { cnt = 0; //达到 50 次后计数值清零 LED0 = ~LED0; //LED0每隔一秒取反一次:一秒亮,一秒灭 } } }} 现象:LED0每隔一秒取反一次:一秒亮,一秒灭
2.数码管每隔一秒切换
数码管知识之前发过了,这里不重复
#include 《reg51.h》#define uint unsigned int //定义无符号整型的写法#define uchar unsigned char //定义无符号字符型的写法 ***it DU = P2^6;***it WE = P2^7;uchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66,//0-40x6D, 0x7D, 0x07, 0x7F, 0x6F,//5-90x77, 0x7C, 0x39, 0x5E, 0x79,0x71//A-F};//这里用code是把它放到ROM区,节省RAM区uchar cnt = 0; //记录T0中断次数uchar sec = 0; //记录经过的秒数void main(){ WE = 1; //打开位控 P0 = 0XFE; //1111 1110 根据原理图顺序,为左边第一个数码管 WE = 0; //关闭位控 TMOD = 0x01; //设置T0为模式1 TH0 = 0xB8; //高八位初值 TL0 = 0x00; //第八位初值 TR0 = 1; //启动T0定时器 while(1) { if(TF0 == 1) { TF0 = 0; //T0溢出,清除中断标志位,这里是定时程序,所以这条要加,如果是中断程序硬件自动清零,这条不用 TH0 = 0xB8; //重新赋初值,因为每次溢出后会自动清零 TL0 = 0x00; cnt++; //0.02秒加一次 if (cnt 》= 50) //0.02*50=1秒 { cnt = 0; // 达到 50 次后计数值清零 sec++; if(sec 》 15) //当秒数超过15,重新从0开始 { sec = 0; } } } DU = 1; //打开段控 P0 = table[sec]; DU = 0; //关闭段控 }} 显示效果:0-F,这里就发个一张
举报
更多回帖
rotate(-90deg);
回复
相关问答
定时器
51单片机
51
单片机
定时器
2012-08-03
5257
为什么
51
单片机
定时器
0中断与串口使用会相冲突
2021-09-03
2365
在
51
单片机
中如何
去
采用
定时器
中断的方式?
2021-07-16
1539
如何利用
51
单片机
的
定时器
中断
实现
音乐的切换?
2021-09-27
2745
如何利用MCS-
51
单片机
实现
定时器
/计数
器
的时钟设计?
2021-10-20
2112
C
51
单片机
定时器
中断的程序该怎样
去
编写呢
2022-01-21
1143
51
单片机
定时器
的初值怎么计算?
2021-10-08
2476
怎样
去
设置
单片机
定时器
的错误现象呢
2022-01-21
1048
请问
51
单片机
同时使用
定时器
和串口通信会不会相互干扰?
2023-11-08
323
定时器
怎样
去
实现
1
秒
时数码管数字自动加一并循环?
2021-07-16
2132
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分