51单片机百毫秒定时器代码
时间: 2023-07-02 09:18:23 浏览: 195
以下是51单片机定时器中断的代码,可实现百毫秒级别的定时器功能:
```
#include <reg52.h>
// 定义计数器初值
#define TH0_init 0x3C
#define TL0_init 0xAF
// 定义变量
unsigned char cnt = 0;
// 定时器中断服务函数
void Timer0_ISR() interrupt 1
{
TH0 = TH0_init;
TL0 = TL0_init;
cnt++;
if(cnt == 100) // 累计100次中断,即1s
{
cnt = 0;
// 在此处添加需要执行的操作
}
}
void main()
{
// 定时器0初始化
TMOD |= 0x01; // 16位定时器模式
TH0 = TH0_init;
TL0 = TL0_init;
EA = 1; // 开启总中断
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
while(1);
}
```
在上述代码中,我们使用定时器0的16位定时器模式,计数器初值设置为0x3CAF,即65536-50000,定时器中断服务函数中,每次中断后计数器cnt加1,当cnt累计到100时,即1s过去,执行需要执行的操作。
相关问题
写一个51单片机百毫秒定时器代码实现以下功能:用两位数码管显示时间,最小计时单位为“百毫秒”,计时范围为:0.1s-9.9s。计时功能键第一次被按下,实现功能1:秒表开始计时并显示;计时功能键第二次被按下,实现功能2:停止计时,并显示,如果停止计时的时间恰好为9.9s,则清零,以便下一次从0开始;计时功能键第3次被按下,实现功能3:秒表清零。再按一次计时功能健,则重复上述过程。
好的,以下是51单片机百毫秒定时器代码实现。
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
// 数码管段码
uchar code table[]={
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
// 定义全局变量
uint cnt = 0; // 计时器计数器
uint sec = 0; // 秒数
uchar flag = 0; // 计时器状态标志,0表示停止,1表示计时中
uchar key = 0; // 按键状态标志,0表示未按下,1表示按下
// 数码管位选函数
void display(uchar num1, uchar num2)
{
uchar i;
for (i = 0; i < 8; i++)
{
P2 = 0xff;
P0 = table[num1];
P2 = ~(1 << i);
delay(1); // 延时1ms
P2 = 0xff;
P0 = table[num2];
P2 = ~(1 << i);
delay(1); // 延时1ms
}
}
// 延时函数
void delay(uint ms)
{
uint i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 110; j++);
}
// 定时器0中断函数
void timer0() interrupt 1
{
TH0 = (65536 - 1000) / 256; // 1ms
TL0 = (65536 - 1000) % 256;
cnt++;
if (cnt == 100) // 每100ms计数一次
{
cnt = 0;
if (flag == 1) // 计时器计数
{
sec++;
if (sec == 100) // 计时到9.9s,清零
{
sec = 0;
flag = 0; // 停止计时
}
}
}
}
// 按键扫描函数
uchar keyscan()
{
if (P1 != 0xff) // 判断是否有按键按下
{
delay(5); // 延时去抖动
if (P1 != 0xff) // 再次判断是否有按键按下
{
switch (P1)
{
case 0xfe: // K1
return 1;
case 0xfd: // K2
return 2;
case 0xfb: // K3
return 3;
default:
return 0;
}
}
}
else
return 0;
}
// 主函数
void main()
{
TMOD = 0x01; // 定时器0工作在模式1(16位自动重装载)
TH0 = (65536 - 1000) / 256; // 1ms
TL0 = (65536 - 1000) % 256;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
while (1)
{
key = keyscan(); // 按键扫描
if (key == 1) // 计时功能键第一次被按下
{
if (flag == 0) // 未计时状态
{
flag = 1; // 开始计时
}
}
else if (key == 2) // 计时功能键第二次被按下
{
if (flag == 1) // 计时中状态
{
flag = 0; // 停止计时
if (sec == 100) // 计时到9.9s,清零
sec = 0;
}
}
else if (key == 3) // 计时功能键第三次被按下
{
flag = 0; // 停止计时
sec = 0; // 秒数清零
}
display(sec / 10, sec % 10); // 显示时间
}
}
```
这段代码实现了功能1、功能2、功能3,并且可以重复计时。
51单片机两个定时器代码
当然,我可以提供一些基于51单片机的两个定时器的示例代码。以下是一个简单的示例,使用定时器0和定时器1来生成不同的时间延迟。
```
#include <reg51.h>
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 123; j++); // 调整该值以改变延迟时间
}
void timer0_init()
{
TMOD |= 0x01; // 设置为模式1 - 16位定时器
TH0 = 0xFC; // 设置初始值,用于产生1ms延迟
TL0 = 0x66;
TR0 = 1; // 启动定时器0
}
void timer1_init()
{
TMOD |= 0x10; // 设置为模式1 - 16位定时器
TH1 = 0x3C; // 设置初始值,用于产生10ms延迟
TL1 = 0xB0;
TR1 = 1; // 启动定时器1
}
void main()
{
timer0_init();
timer1_init();
while(1)
{
// 在此执行你的代码
// 使用定时器0产生500ms的延迟
delay_ms(500);
// 使用定时器1产生1000ms的延迟
delay_ms(1000);
}
}
```
以上代码中,`timer0_init()`和`timer1_init()`函数用于初始化定时器0和定时器1的配置。`delay_ms()`函数用于产生指定毫秒数的延迟。
请注意,以上代码仅供参考,具体的延迟时间和功能需根据你的实际需求进行调整和修改。
阅读全文