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

📄 5045.c

📁 其中包含了单片机与5045芯片的通信
💻 C
字号:



#include<REGTELE.H>
#include<MATH.H>

/*#define   WREN 0x06;  * 写允许     *
#define   WRSR 0x01;   * 写状态寄存器    *
#define   RSDR 0x05;
#define   READ 0x03;   * 读数     *
#define   WRITE 0x03;  * 写数     *
#define   ztai 0x3F;                    */
#define _O         P1_1                /*输出*/
#define _I         P1_3                /*数据输入*/
#define _SCLK      P1_2                /*时钟信号*/
#define _CS        P1_0                /*使能**/
#define L  0x1D                        /*显示下降*/
#define H  0x24                        /*显示上升*/
/********  0x00        表示半旗  *******/

unsigned int shuzhi[]={0x01,0x67,0x12,0x42,0x64,0x48,0x08,0x63,0x00,0x40};
unsigned char idata gaodu,zhuangtai=H,guocheng;
           /********** guocheng = 0x00 表示占停上,guocheng = 0x22 表示占停下,
           ************guocheng = 0x10 表示上升,   guocheng = 0x01 表示下降********/
unsigned char ge,shi,bai,tiaozheng=1200,bushu=0;     /*****高度的各个位*****/


/*****************写一字节**************/

/*
void WRB(unsigned char idata din)

{                                      
    unsigned int i,j;
    unsigned char idata temp,temp1;
    _SCLK=0;

    temp = din;
    for(i=8; i>0; i--)
    {

        temp1=temp & 0x01;
        if(temp1==1) _O =1;
        else         _O =0;
        _SCLK = 1;
        for(j=20; j>0;j--);
        _SCLK = 0;
        temp = temp >> 1;
    }
}

/*****************读一字节**************/  /*
unsigned RBT()
{
    unsigned int i,j;
    unsigned  int idata temp,idataOut=0;

    idataOut = _I;
    idataOut =idataOut<<7;
    for(i=8; i>1; i--)
    {
        _SCLK = 1;
        for(j=20; j>0; j--);
        _SCLK = 0;
        idataOut = idataOut >>1;
        temp = _I;
        temp=temp<<7;
        idataOut=idataOut+temp;
        //idataOut=ACC;

    }
    return(idataOut);
}

/*********************到顶检测**********************/   
void jishu()interrupt 3
{
int i;
  for(;;)
  {ge=0;shi=8;bai=1;
  P1=0x80;P0=shuzhi[ge];for(i=0;i<10;i++);
  P1=0x90;P0=shuzhi[shi];for(i=0;i<10;i++);
  P1=0xA0;P0=shuzhi[bai];for(i=0;i<10;i++);
  P1=0xF0;P0=0x11;for(i=0;i<10;i++);                 /*停*/
  }              
}



 /**************关机保存***********************/  /*
void save()interrupt 0
{
  unsigned int i;
  WRB(0x06);
   _CS = 1; for(i=20; i>0; i--); _CS  = 0;
   WRB(0x01);
   WRB(0x3F);
   _CS = 1; for(i=20; i>0; i--); _CS  = 0;
   WRB(0x06);
   WRB(0x00);
   WRB(gaodu);
   WRB(guocheng);
   WRB(zhuangtai);
 }   */

/******************开机读状态*******************************/  /*
 read()
{
  unsigned int i;
  WRB(0x06);
  _CS = 1; for(i=20; i>0; i--); _CS  = 0;
  WRB(0x00);
  gaodu = RBT();
  guocheng = RBT();
  zhuangtai = RBT();
  if(gaodu!=0){ge=gaodu%10;shi=((int)(gaodu/10))%10;bai=((int)((int)(gaodu/10))/10)%10;}
  return;
} 
/************************** 启动 ********************************/

 void qidong(unsigned int a)
 {unsigned int i;
  if(a==1){if(tiaozheng==1200&&zhuangtai==H){P1_7=0;for(i=0;i<20;i++)P1_7=1;}
           ge=0;shi=0;bai=0;P3_7=1;P3_6=1;TR0=1;return;}
  if(a==0){zhuangtai=L;P3_7=1;P3_6=0;TR0=1;return;}
  return;
  }
/************************* 占停 *******************************/
void Zantin(unsigned int q)
{
 unsigned int i;
                         /******关闭定时器************/
 if(q==0){if(tiaozheng==1200&&zhuangtai==H){P1_7=0;for(i=0;i<20;i++);P1_7=1;}
                   if(zhuangtai==H)guocheng=0x00;else if(zhuangtai==L)guocheng=0x22;
                   P3_7=0;return;}
 if(q==1){if(guocheng==0x00)qidong(1);else qidong(0);}              /*打开定时器*/
 return;
}



/*************************  换算  ****************************/

 void huansuan()
 {
   unsigned int shijian;
   shijian=ge+shi*10+bai*100;
   tiaozheng=((int)(shijian/15))*400;
   ge=0;shi=0;bai=0;
   return;
  }



/*************************  调整  *****************************/
 void tiaozhen(void)
{int i=1;
 for(;i;)
 {
 P1=0x80;P0=shuzhi[ge];for(i=0;i<10;i++);
 P1=0x90;P0=shuzhi[shi];for(i=0;i<10;i++);
 P1=0xA0;P0=shuzhi[bai];for(i=0;i<10;i++);
 P1=0xF0;P0=zhuangtai;for(i=0;i<10;i++);
 if(P2_2==0){for(i=0;i<20;i++);if(P2_2==0)ge++;if(ge==10)ge=0;}
 if(P2_1==0){for(i=0;i<20;i++);if(P2_1==0)shi++;if(shi==10)shi=0;}
 if(P2_0==0){for(i=0;i<20;i++);if(P2_0==0)bai++;if(bai==2)bai=0;}
 if(P1_7==0){for(i=0;i<20;i++);if(P1_7==0)i=0;}
 }
 huansuan;
 return;}



/*********************半旗*********************/

   void banqi()
   {unsigned int i,a=1;
    for(;a!=0;)
    {if(P2_2==0){for(i=0;i<20;i++);if(P2_2==0&&gaodu==0x00){guocheng=0x01;qidong(1);
                           P1_7=0;for(i=0;i<20;i++);P1_7=1;a=1;}}
    if(P2_1==0){for(i=0;i<20;i++);if(P2_1==0&&a==1&&gaodu==0x78){guocheng=0x01;a=0;qidong(1);}}
     if(zhuangtai==H&&ge==10){ge=0;shi++;}
     if(zhuangtai==H&&shi==10){shi=0;bai++;}
     if(zhuangtai==L&&ge==0){ge=9;shi--;}
     if(zhuangtai==L&&shi==0){shi=9;bai--;}
     P1=0x80;P0=shuzhi[ge];for(i=0;i<10;i++);
     P1=0x90;P0=shuzhi[shi];for(i=0;i<10;i++);
     P1=0xA0;P0=shuzhi[bai];for(i=0;i<10;i++);
     P1=0xF0;P0=zhuangtai;for(i=0;i<10;i++);
     if(a==1&&gaodu==0xB4){P1_7=0;for(i=0;i<20;i++);P1_7=1;qidong(0);}
     if(a==1&&gaodu==0x78)Zantin(0);
     if(a==0&&gaodu==0xB4){qidong(0);}
     if(a==0&&gaodu==0x00)Zantin(0);
     }
     return;
   }



/************************* 定时器*****************************/

void clk(void)interrupt 1           /*T/c0中断入口*/
{
   P3_5=!P3_5;                                      /*P3-5取反*/
   if(zhuangtai==H)bushu++;
   if(bushu==80&&guocheng==0x10&&P3_7==1){bushu=0;ge++;gaodu++;}
   else if(bushu==80&&guocheng==0x01&&P3_7==1){bushu=0;ge--;gaodu--;}
 TH0=(65536-tiaozheng)/256;                               /*预置计数初值*/
 TL0=(65536-tiaozheng)%256;
}



/************************* 主函数 *****************************/
 main()
{ unsigned int i,j;


   P3_5=0;
  P3_7=0;
 /*************计数***************/
 TMOD=0x01;                                          /*T/C0工作于定时方式*/
 TH0=(65536-tiaozheng)/256;                               /*预置计数初值*/
 TL0=(65536-tiaozheng)%256;

 EA=1;                                                 /*CPU开中断*/  
 ET0=1;
 TR0=1;/*T/C0开中断*/
 /**************开P3_3外部中断***************************/
   IT0=1;
   IE0=1;
   EX0=1;
   
   IT1=1;
   IE1=1;
   EX1=1;
 /*  read();


/*************************显示********************************/



for(;;)
{if(zhuangtai==H&&ge==10){ge=0;shi++;}
 if(zhuangtai==H&&shi==10){shi=0;bai++;}
 if(zhuangtai==L&&ge==0){ge=9;shi--;}
 if(zhuangtai==L&&shi==0){shi=9;bai--;}
 if(gaodu==180||(gaodu==0&&guocheng==0x01)){P3_7=0;} 
 if(gaodu==180&&tiaozheng==1200){P1_7=0;for(i=0;i<20;i++);P1_7=1;} 
 P1=0x80;P0=shuzhi[ge];for(i=0;i<10;i++);
 P1=0x90;P0=shuzhi[shi];for(i=0;i<10;i++);
 P1=0xA0;P0=shuzhi[bai];for(i=0;i<10;i++);
 P1=0xF0;P0=zhuangtai;for(i=0;i<10;i++);
 if(P2!=0xFF)for(i=0;i<20;i++);
 if(P2!=0xFF)
 { j=P2;
  switch(j)
  {case 0xFE:
        { if(guocheng!=0x00||guocheng!=0x22)Zantin(0);
          else if(guocheng==0x00||guocheng==0x22)Zantin(1);} break;
   case 0xFD:
         if(gaodu==0x00){guocheng=0x10;qidong(1);} break;
   case 0xFC:
         if(gaodu==0xB4){guocheng=0x01;qidong(0);} break;
   case 0xFB:
         if(gaodu==0){zhuangtai=0x00;banqi;} break;
   case 0xFA:
         if(gaodu==0)tiaozhen(); break;
    default: {}
   }      
  }
 }
}

  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -