⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mine.c

📁 健身器械面板显示程序
💻 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 + -