单片机和数码管计时器
时间: 2023-07-24 21:21:31 浏览: 99
单片机课设数码管计时器.doc
5星 · 资源好评率100%
单片机和数码管结合可以实现计时器功能,可以将计时器的计数值通过数码管显示出来。下面是一个使用 4 位共阳数码管实现的计时器例子。
```c
#include <reg51.h> //51单片机头文件
sbit LED = P1^0; //定义 LED 灯连接的 IO 口
sbit DIO = P2^0; //定义数码管 DIO 连接的 IO 口
sbit CLK = P2^1; //定义数码管 CLK 连接的 IO 口
sbit STB = P2^2; //定义数码管 STB 连接的 IO 口
unsigned int count = 0; //计时器计数值
unsigned char code seg_table[] = { //共阳数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
void delay(unsigned int i) //延时函数
{
unsigned int j, k;
for(j = 0; j < i; j++)
{
for(k = 0; k < 125; k++);
}
}
void init_timer() //初始化计时器
{
TMOD |= 0x01; //设置定时器0为模式1
TH0 = 0xFC; //设置定时器0的高8位为0xFC
TL0 = 0x66; //设置定时器0的低8位为0x66
}
void display(unsigned int num) //数码管显示函数
{
unsigned int i;
unsigned char code position[] = {0x01, 0x02, 0x04, 0x08}; //数码管位置控制码表
for(i = 0; i < 4; i++)
{
DIO = 0; //清零数据线
CLK = 0; //清零时钟线
DIO = seg_table[num % 10]; //发送段码数据
num /= 10; //去掉已经发送的位数
if(i == 1) //控制小数点位置
{
DIO = 0x80;
}
STB = 1; //锁存数据
STB = 0;
DIO = position[i]; //选择数码管位置
STB = 1; //锁存数据
STB = 0;
CLK = 1; //时钟线上升沿,数据线进入下一个状态
}
}
void main()
{
init_timer(); //初始化计时器
TR0 = 1; //启动计时器0
while(1)
{
if(TF0 == 1) //判断定时器0是否溢出
{
TF0 = 0; //清除定时器0溢出标志位
count++; //计时器计数值加1
if(count >= 10000) //计时1秒
{
//在此处添加需要执行的计时任务
LED = ~LED; //LED 灯闪烁
count = 0; //计时器计数值清零
}
display(count); //数码管显示计时器计数值
}
delay(1); //延时1ms
}
}
```
在上述代码中,使用定时器0来进行计时,计时周期为 1ms。在主循环中不断判断定时器0是否溢出,如果溢出则计时器计数值加1,当计数值达到 10000 时,表示计时器已经计时 1 秒,执行需要执行的计时任务,并将计时器计数值清零。同时,在数码管上显示计时器计数值。
需要注意的是,在使用数码管显示计时器计数值时,需要将计数值转换成数码管所需要的段码,然后通过控制数码管的位置和小数点位置,将段码发送到数码管上进行显示。
在本例中,使用了一个 delay 函数实现延时,通过调整延时时间可以调整计时周期。同时,通过控制 LED 灯的亮灭,可以验证计时器的正确性。
阅读全文