历史上的今天
今天是:2025年10月19日(星期日)
2022年10月19日 | STC89C52单片机 定时器
2022-10-19 来源:csdn
怎么去设置定时?
例如:
定时 50微秒
首先 50000 ÷ 1.085 = 46,082.94930875576 从 0 开始加 19,453 次会溢出 这样的计算会有误差,但是影响比较小可以忽略不计
TH0 = (65535 - 46082) / 256; // 将商放在高八位
TL0 = (65535 - 46082) % 256; // 将余数放在低八位
或者 65535 - 46082 = 19453
十六进制得到:4BFD
二进制得到:0100 1011 1111 1101
将得到的十六进制分别放入 TH0 和 TL0;
TH0 = 0x4b;
TL0 = 0xfd; //定时50ms
定时器
定时器0工作模式1 16位定时模式,数码管动态显示0-10秒表。
#include #include #define uint unsigned int #define uchar unsigned char sbit DU = P2^6;//数码管段选 sbit WE = P2^7;//数码管段选 //共阴数码管段选表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,}; /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } /*==================================== 函数 :display(uchar i) 参数 :i 显示数值,取值范围0-255 返回值 :无 描述 :三位共阴数码管动态显示 ====================================*/ void display(uchar i) { uchar bai, shi, ge; bai = i / 100; //236 / 100 = 2 shi = i % 100 / 10; //236 % 100 / 10 = 3 ge = i % 10;//236 % 10 =6 //第一位数码管 P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFE; //1111 1110 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = tabel[bai];// DU = 0;//锁存段选数据 delay(5); //第二位数码管 P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFD; //1111 1101 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = tabel[shi];// DU = 0;//锁存段选数据 delay(5); //第三位数码管 P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFB; //1111 1011 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = tabel[ge];// DU = 0;//锁存段选数据 delay(5); } //定时器0初始化 void timer0Init() { TR0 = 1; //启动定时器0 TMOD = 0X01; //定时器工作模式1,16位定时器计数模式 TH0 = 0x4b; TL0 = 0xfd; //定时50ms /* 怎么去定时?例如定时 50微秒 首先 50000 ÷ 1.085 = 46,082.94930875576 从 0 开始加 19,453 次会溢出 这样的计算会有误差,但是影响比较小可以忽略不计 TH0 = (65535 - 46082) / 256; // 将商放在高八位 TL0 = (65535 - 46082) % 256; // 将余数放在低八位 或者 65535 - 46082 = 19453 十六进制得到:4BFD 二进制得到:0100 1011 1111 1101 将得到的十六进制分别放入 TH0 和 TL0; TH0 = 0x4b; TL0 = 0xfd; //定时50ms */ } void main(){//main函数自身会循环 uchar mSec, Sec;//毫秒和秒储存变量 timer0Init();//定时器0初始化 while(1) { if(TF0 == 1)//判断是否溢出 { TF0 = 0;//软件清零溢出标志位 TH0 = 0x4b; TL0 = 0xfd; //定时50ms mSec++;//50ms到 if(mSec == 20) { mSec = 0; Sec++;//1秒时间到 } } display(Sec); //数码管显示函数 if(Sec > 59) Sec = 0;//秒清零 } }
上一篇:STC89C52单片机 串口通信
下一篇:STC89C52单片机 矩阵键盘
史海拾趣
|
看了下今年的PCIM参加的厂商,目前好像很少唉。不知道研讨会精不精彩 有会去的朋友吗? Aavid Termalloy ChinaAuxel FTG (Shanghai) Co., Ltd ChinaAVX / Kyocera(S) Pte Ltd Singapore Beijing LEM Electronics Co., ...… 查看全部问答> |
|
公司库里有一批,没有印型号的STC片子,20脚DIP,什么原因,没型号的没有上文,我想用一下,可是下载确怎么也找不到型号,高手们有什么办法识别出来呢???… 查看全部问答> |
|
小子想要实现的功能是:对所有拷入U盘的文件进行加密操作,设想是在过滤驱动中捕获写操作,但对复制、粘贴的内核操作过程很迷茫。那位大大能指点下小子,给介绍下中间发生了些什么。… 查看全部问答> |
|
将工程从evc4移植到VS2005, 在emulaor中运行,出现断言错误 ,错误信息显示如下: debug assertion failed! Program:\\Program files\\pro.exe File: f:\\sp\\vctools\\vc7libsce\\ship\\atlmfc\\src\\mfc\\filecore.cpp line 297 如何解决??… 查看全部问答> |
|
我在EVC环境下建立的程序,程序修改编译成功后,在后来修改一个.cpp文件中的程序时,我稍改动一下程序,本来程序没什么问题,但在编译后出现如下编译错误: c:\\documents and settings\\proc\\locate.cpp(5) : fatal error C1083: Cannot open include ...… 查看全部问答> |
|
最近在编写的一个系统控制软件中需要用到大量自己编制的数据表,数据量很大已经超过了8K,即已经超过了RAML0L1范围,疑问是怎样将只读的数据表格分配到FLASH区中?我在分配到FLASH中时程序烧写后相应区域读出来的不是0就是0x0ffff;是否是需要修改.ge ...… 查看全部问答> |
|
使用UDP进行数据传输的速率测试,无限循环传输一个随机数组,没有采用操作系统,最高速度只有500K字节每秒,使用TCP做同样的测验也是500KB,求助各位大神这是怎么回事呢? 附上UDP部分源码: struct udp_pcb *pcb; int i; static char data[147 ...… 查看全部问答> |
|
库房,车间,办公环境温湿度集中监控系统应用方案 第一部分 温湿度监测方案 一、应用概述 在信息化程度越来越高的今天,担当信息处理与交换重任的机房是整个信息网络工程的数据传输中心、数据处理中心和数据交换 ...… 查看全部问答> |




