c51单片机秒表程序c语言,利用51单片机制作秒表的详细过程
时间: 2023-08-13 08:04:54 浏览: 48
以下是一个基本的C51单片机秒表程序的详细过程,你可以根据实际需求进行修改和优化。
1. 定义IO口
```c
sbit key1 = P3^0; //定义按键1
sbit key2 = P3^1; //定义按键2
sbit key3 = P3^2; //定义按键3
sbit led = P1^0; //定义LED灯
```
2. 定义变量
```c
unsigned int ms = 0; //毫秒数
unsigned int sec = 0; //秒数
unsigned int min = 0; //分钟数
unsigned char flag = 0; //标志位,用于判断是否启动秒表
```
3. 定时器初始化
```c
void Init_Timer0(void)
{
TMOD |= 0x01; //设置为模式1
TH0 = 0xFC; //装载高8位
TL0 = 0x18; //装载低8位
ET0 = 1; //打开定时器0中断
EA = 1; //打开总中断
TR0 = 1; //启动定时器0
}
```
4. 中断处理函数
```c
void T0_time() interrupt 1
{
TH0 = 0xFC; //重新装载高8位
TL0 = 0x18; //重新装载低8位
ms++; //毫秒数加1
if(ms == 1000) //如果毫秒数达到1000
{
ms = 0; //毫秒数清零
sec++; //秒数加1
if(sec == 60) //如果秒数达到60
{
sec = 0; //秒数清零
min++; //分钟数加1
}
}
}
```
5. 主函数
```c
void main()
{
Init_Timer0(); //初始化定时器0
while(1)
{
if(key1 == 0) //按键1按下,启动/停止秒表
{
while(!key1); //等待按键1释放
flag = ~flag; //标志位取反
}
if(key2 == 0) //按键2按下,清零秒表
{
while(!key2); //等待按键2释放
ms = 0; sec = 0; min = 0; //毫秒数、秒数、分钟数清零
flag = 0; //标志位清零
}
if(key3 == 0) //按键3按下,LED灯闪烁
{
while(!key3); //等待按键3释放
for(int i=0; i<5; i++)
{
led = ~led; //LED灯取反
Delay100ms(); //延时100ms
}
}
if(flag) //如果标志位为1,即秒表启动
{
display(); //在数码管上显示时间
}
}
}
```
6. 显示函数
```c
void display()
{
unsigned char code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; //数码管显示表
unsigned char num[8]; //定义数组存储要显示的数值
num[0] = table[sec % 10]; //秒的个位
num[1] = table[sec / 10]; //秒的十位
num[2] = table[min % 10]; //分钟的个位
num[3] = table[min / 10]; //分钟的十位
num[4] = table[ms % 10]; //毫秒的个位
num[5] = table[ms / 10 % 10]; //毫秒的十位
num[6] = table[0]; //占位符
num[7] = table[0]; //占位符
for(int i=0; i<8; i++)
{
P2 = 0xFF; //数码管关闭
switch(i)
{
case 0: P0 = 0xFE; break; //第1个数码管
case 1: P0 = 0xFD; break; //第2个数码管
case 2: P0 = 0xFB; break; //第3个数码管
case 3: P0 = 0xF7; break; //第4个数码管
case 4: P0 = 0xEF; break; //第5个数码管
case 5: P0 = 0xDF; break; //第6个数码管
case 6: P0 = 0xBF; break; //第7个数码管
case 7: P0 = 0x7F; break; //第8个数码管
}
P2 = num[i]; //数码管显示数值
Delay1ms(); //延时1ms
}
}
```
7. 延时函数
```c
void Delay1ms()
{
unsigned char i,j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void Delay100ms()
{
unsigned char i,j,k;
i = 2;
j = 120;
k = 157;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
```
以上就是一个基本的C51单片机秒表程序的详细过程,你可以根据实际需求进行修改和优化。