📄 mine.c
字号:
#include <reg52.h>
#define OSC_FREQ (12000000ul)
#define OSC_PER_INST 12
#define INT_0 0 //计数中断
#define TIMER_0 1 //暂停时,控制闪烁时间
#define INT_1 2 //暂停中断
#define TIMER_2 5 //系统时钟
#define DIS 22 //edit it if necessary
#define SELECT_4 P1 //位选
#define OUT_3 P0 //段选
sbit int_0=P3^2;
sbit int_1=P3^3;
sbit Flash=P3^4; //控制CD4514B INHIBIT位以使LED在暂停时闪烁
typedef unsigned char tbyte;
typedef unsigned int tword;
typedef unsigned long tlong;
typedef enum{WORK,TIMEOUT}Sys_state;
tbyte min;
tbyte sec;
tbyte speed;
tword dis;
//tbyte num[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
tlong Add_one; //对中断0计数
tbyte time_G; //现在时间
tbyte time_temp_G; //与现在时间求时间间隔以计算速度
Sys_state Sys_flag;
tbyte flash_t=50;
void show_init(void);
void sEOS_init(const char);
void show(tbyte,tbyte);
void display(void);
void main(void)
{
show_init();
sEOS_init(10);//setup interrupt &&timer2
while(1)
{
display();
}
}
void show_init(void)
{
min=0;
sec=0;
speed=0;
dis=0;
Flash=0;
Sys_flag=WORK;
}
//**************************
void display(void)
{
show(0,sec%10);
show(1,sec/10);
show(2,min%10);
show(3,min/10);
show(4,dis%10);
show(5,dis/10%10);
show(6,dis/100%10);
show(7,dis/1000%10);
show(8,speed%10);
show(9,speed/10);
}
void show(tbyte addr,tbyte dat)
{
tword k=50;
OUT_3 =dat;
SELECT_4 =addr;
while(--k);
}
void sEOS_init(const tbyte TICK)
{
//setup timer2
tlong Inc;
tword Reload_16;
tbyte Reload_08H, Reload_08L;
Add_one=0;
time_G=0;
time_temp_G=0;
// Timer 2 is configured as a 16-bit timer,
// which is automatically reloaded when it overflows
T2CON = 0x04; // Load Timer 2 control register
// Number of timer increments required (max 65536)
Inc = ((tlong)TICK*(OSC_FREQ/1000))/OSC_PER_INST;
// 16-bit reload value
Reload_16 = (tword) (65536UL - Inc);
// 8-bit reload values (High & Low)
Reload_08H = (tbyte)(Reload_16 / 256);
Reload_08L = (tbyte)(Reload_16 % 256);
// Used for manually checking timing (in simulator)
//P2 = Reload_08H;
//P3 = Reload_08L;
TH2 = Reload_08H; // Load T2 high byte
RCAP2H = Reload_08H; // Load T2 reload capt. reg. high byte
TL2 = Reload_08L; // Load T2 low byte
RCAP2L = Reload_08L; // Load T2 reload capt. reg. low byte
// Timer 2 interrupt is enabled, and ISR will be called
// whenever the timer overflows.
ET2 = 1;
//setup int0
IT0 = 1;
EX0 = 1;
//setup int1
IT1 = 1;
EX1 = 1;
//setup time0
TMOD= 0x01;
TH0 = 0xB1;
TL0 = 0xE0;
// Start Timer 2 running
TR2 = 1;
EA = 1; // Globally enable interrupts
}
//************************************
//中断0,计算路程和根据时间计算速度
void intp0(void) interrupt INT_0
{
Add_one++;
if(time_G<time_temp_G)
speed=DIS*10/(time_G+100-time_temp_G);
speed=DIS*10/(time_G-time_temp_G);
dis=Add_one*DIS;
time_temp_G=time_G;
}
//************************************
//系统时钟,计算时间
void timer2(void) interrupt TIMER_2
{
if(++time_G==100)
{
time_G=0;
if(++sec==60)
{
sec=0;
++min;
}
}
}
//*************************************
//中断1,系统暂停
void intp1(void) interrupt INT_1
{
flash_t=50;
if(Sys_flag==WORK)
{
Sys_flag=TIMEOUT;
TR2 =0; //禁止系统时钟&计数中断
EX0 =0;
TR0 =1; //开放暂停时钟计时
ET0 =1;
}
else
{
Sys_flag=WORK;
TR2 =1;
EX0 =1;
TR0 =0;
ET0 =0;
Flash=0;
}
}
//*************************************
//时钟中断0,计算LED闪烁时间
void timer0(void) interrupt TIMER_0
{
while(--flash_t==0)
{
#pragma asm
CPL Flash
#pragma endasm
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -