单片机
原理图
(51单片机 2 个定时器
stc15 3个 TF3 优先级最低
总结:
烧录软件弄一个定时器(比如一毫秒)
自己写一个interrupt 的函数
主函数调用
(感觉就像一个计数,到多少了就可以执行)
数码管显示分秒 正计时 的代码
#ifndef _SYS_H_
#define _SYS_H_
#include <STC15F2K60S2.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define LOCKY4 P2=(P2&0x1f)|0x80
#define LOCKY5 P2=(P2&0x1f)|0xA0
#define LOCKY6 P2=(P2&0x1f)|0xC0
#define LOCKY7 P2=(P2&0x1f)|0xe0
#define LOCKOFF P2=0x1f
void init();
void smg();
#endif
#include <sys.h>
#include <intrins.h>
u8 code DS[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
u8 code DSW[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 DSHC[8]={16,16,16,16,16,16,16,16};
u8 ts=0;
u16 timer=0;
u16 tm=0;
void init()
{
P0=0xff;
LOCKY4; //关led
LOCKOFF;
P0=0;
LOCKY5; //关蜂鸣器和继电器
LOCKOFF;
P0=0;
LOCKY6; //关数码管位选
LOCKOFF;
P0=0xff;
LOCKY7; 关数码管段谎?
LOCKOFF;
}
void smg( )
{
static u8 i=0;
P0= 0xff;
LOCKY7;
LOCKOFF;
P0=DSW[i];
LOCKY6;
LOCKOFF;
P0= DS[DSHC[i]];
LOCKY7;
LOCKOFF;
i++;
if(i==8) i=0;
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x20; //设置定时初值
TH0 = 0xD1; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 =1;
EA =1;
}
void Timer01ms() interrupt 1
{
//TL0 = 0x20; //设置定时初值
//TH0 = 0xD1; //设置定时初值
smg();
if(++timer>999)
{
ts++;
timer=0;
}
if(ts>59)
{
ts=0;
tm++;//FEN
}
}
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void main()
{
init();
Timer0Init() ;
while(1)
{
DSHC[4]=tm%10;
DSHC[3]=(tm/10)%10;
DSHC[7]=ts%10;
DSHC[6]=(ts/10);
}
}