基于C51 的毫秒定时器
最近在B站上面学习了一些单片机相关的视频,通过控制数码管让我们实现简单的定时器
下面这图就是实现的功能,这里我使用的开发板是普中C51的,与这个蓝桥杯比赛的开发板还是有很大的区别!。这位老师讲的单片机使用很好,需要的朋友可以去看看,(小蜜蜂老师)
开发板是否一样不重要,重要的是我们可以通过学习将这些功能实现,加油吧
在前面也学习了如何使用一个数码管,这次我们要同时使用8个数码管,那么在控制上该怎么做了,自然这里我们使用了74HC138译码器,通过138译码器的三个引脚来控制我们的八个数码管,下面来看看所用到的原理图吧
这里自然是通过控制P2^2 P2^3 P2^4 这三个引脚来控制
看代码吧
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit key1 = P3^0 ; //按键1 实现清零
sbit key2 = P3^1; //按键2 实现暂停 和 运行
sbit LSA = P2^2; //这三个来控制138译码器对数码管的选择
sbit LSB = P2^3;
sbit LSC = P2^4;
//0-9 a- f 这里使用的是共阴级的数码管
u8 code smg_duan[17]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 readsmg[8]; //定义一个数组来存储装换后的数字
u8 stat = 0; //用于进行按键操作是的状态标志
u8 sec = 0 ; min = 0; hour = 0; //毫秒,秒,分
void delay_smg(u16 t)
{
while(t--);
}
void delay(u8 t)
{
while(t--);
}
//数码管实现函数
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //进行数码管选择
{
case(0):
LSA=1;LSB=1;LSC=1; break;//第七位
case(1):
LSA=0;LSB=1;LSC=1; break;//第六位
case(2):
LSA=1;LSB=0;LSC=1; break;//第五位
case(3):
LSA=0;LSB=0;LSC=1; break;//第四位
case(4):
LSA=1;LSB=1;LSC=0; break;//第三位
case(5):
LSA=0;LSB=1;LSC=0; break;//第二位
case(6):
LSA=1;LSB=0;LSC=0; break;//第一位
case(7):
LSA=0;LSB=0;LSC=0; break;//第零位
}
P0=readsmg[i];//将实现的数组传给P0 口
delay_smg(300);
P0=0x00;//消影
}
}
void dataprocess()
{
readsmg[0] = smg_duan[hour/10];
readsmg[1] = smg_duan[hour%10];
readsmg[2] = 0x40;
readsmg[3] = smg_duan[min/10];
readsmg[4] = smg_duan[min%10];
readsmg[5] = 0x40;
readsmg[6] = smg_duan[sec/10];
readsmg[7] = smg_duan[sec%10];
}
//###################################定时器0操作函数####################################
void InitTimer0()
{
TMOD = 0x01 ; //选择定时器模式0
TH0=0Xd8; //¸初始值¨Ê±10ms
TL0=0Xf0;
TR0 = 1; //´打开定时器0
ET0 = 1; //´中断打开
EA = 1; // ´总中断开关
}
void ServerTimer0() interrupt 1
{
TH0=0Xd8; //¸10ms
TL0=0Xf0;
sec ++;
if(sec >=100) //1s
{
min ++ ;
sec = 0;
if(min >= 60)
{
hour ++;
min = 0;
if(hour >= 60)
{
hour = 0;
}
}
}
}
//###########################按键处理函数###################################
void keyprocess()
{
if(key1 == 0)
{
delay(200);
if(key1 ==0)
{
if(stat ==0)
{
TR0 = ~TR0;
stat = 1;
}
else if( stat == 1)
{
TR0 = 1;
stat =0;
}
}
while(key1 ==0);
}
if( key2 ==0)
{
delay(200);
if(key2 ==0)
{
sec = 0;
min = 0;
hour = 0;
}
while(key2 ==0);
}
}
//################################################################################
void main()
{
InitTimer0();
while(1)
{
dataprocess();
DigDisplay();
keyprocess();
}
}
以上就是简单的毫秒定时器的代码了 冲冲冲