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

📄 main2ms.c

📁 一个应用89C52
💻 C
字号:
//main.c
//
//
#pragma OT(8,SPEED) BR NOIP FF(0) DB OE CD
#include <reg52.h>
#include <absacc.h>
#include <ADEF.h>
#include <INTRINS.H>
void getbattery(unsigned char data channel); //judge hasbattery bit
void getledstatus(unsigned char data channel); //get a channel status to LD[32]
void getttstatus(unsigned char data channel);

/*------------------------------------------------
Ssetup the serial port for 115200 baud at 11.0592MHz.  8052
------------------------------------------------*/
void beep (void){
    unsigned  char data j;
    unsigned  int  data i;
                FNC=1;
    for(j=5;j>0;j--){
           for(i=10000;i>0;i--){
                               }
                      }
                 FNC=0;
                 }

void init(void){
               PSW=0;
               IP=1;
               IE=0;                //开 IT1,IT0
               TCON=0;
               TMOD=0x16;         //t1 16 inter time, t0 exter 8reload
               SCON=0xE0;
               PCON=0x80;
               //TL0=0xff;
               //TH0=0xff;
               P1=0x0;                        //关
               status =0;
               TCON=0;
               on2500us= 0;
               flashbit = 0;
               serbit =0;
               errbit =0;
               onbat  =0;
               t1_500ms = 0;
               sec5 = 0;
               //wait3ms = 0;
               //beep();
               //EA=1;
               pt = 0;
               XBYTE[LD0] = 0x0;             //LED    hang
               XBYTE[LD1] = 0x0;
               XBYTE[LED0] = 0x0;            // 540   lie
               XBYTE[LED1] = 0x0;
               XBYTE[GD0]= gd_off;
               XBYTE[GD1]= gd_off;
                       abc = 0;
                }
void initserial(void){
    SCON  = 0xe0;		  /* SCON: mode 1, 8-bit UART, enable rcvr      */
    T2CON = 0x30;                 /* TMOD: timer 2, mode 3, 16-bit reload        */
    //T2MOD = 0x00;
    //PCON  = 0x80;
    //TH1   = 255;                  /* TH1:  reload value for 1200 baud @ 16MHz   */
    //TL1   = 255;
    RCAP2H = 0x0ff;           //57600   FA   115200 Fd     24M  F2
    RCAP2L = 0x0fa;           // t1 :bps=2[smod]/32 *fosc/12 * (2[n]-x)
    TH2    = 0x0ff;           //t2:  bps=fosc/32 / (65536-x)  RCAP2L=0xfa
    TR2    = 1;               /* TR1:  timer 1 run                          */
    REN    = 1;
    TI     = 0;                /* TI:   set TI to send first char of UART    */
    // P13    = 1;                //  enable DE
    ES     = 1;               //
    addres =  TXADR;
    addres &=0x0f;
    addres +=0xc0;
}
/*
 * putchar (mini version): outputs charcter only
 */
void sendchar (unsigned char c)  {
  //while (!TI);
  TI = 0;
  //return (SBUF = c);
  SBUF = c;
  while (!TI);
  TI = 0;
}
void delay_char(unsigned  char data mstime)
           {
           unsigned  char data i;
           i=mstime;
           while(--i){}
                  }
void delay_int(unsigned  int data mstime)
           {
           unsigned  int data i;
           i=mstime;
           while(--i){}
                  }
void sendstring(unsigned char *p,unsigned char data lenth)   // idata *p
{
  unsigned char *ip;
  unsigned char data i;
  ip=p;
  for(i=0;i<lenth;i++){
       sendchar(*ip);
        ip++;
                       }
 }
unsigned char getchar ()  {
  unsigned int data  c=1000;
  while(!RI)  {    //if(--c==0){ serbit=1;
                            //return (0);  }
                  // while(c)

              }          // serbit=1

  c = SBUF;
  RI = 0;
  return (c);
}
void getstring(unsigned char idata *p,unsigned char data lenth)
{
  unsigned char idata *ip;
  unsigned char data i;
  ip=p;
  for(i=0;i<lenth;i++){
       *ip=getchar();
        ip++;
    if(serbit)  break;
                           }
}
void PSerialInt(void) interrupt 4
{
    unsigned char c[2],i;
if(_testbit_(RI)&&_testbit_(RB8)){

       c[0]=SBUF;
       //c[1]=getchar();
    if(c[0]==addres){
           P10 =1;
           TB8 = 1;
           sendchar(addres+1);
           SM2 = 0;
           TB8 = 0;
  //get order
          c[1]=getchar();
          //if(serbit)  goto backser;   //over out
          //ser[1]=getchar();
          //ser[2]=getchar();
          //ser[3]=getchar();
    switch(c[1]){
        case 0xf0: getstring(&GET[0],6);
                   if(GET[4]==0) onbat =1;
                   else       onbat =0;
                   if(GET[5]!=0x55) serbit=1;
                   else   {
                             abc = 0;
                             for(i=0;i<32;i++){
                                 GET[i] = 0;
                                 LD[i]  = 0;  }
                            }
                   break;
        case 0xf1: //ser[1]=getchar();
                   sendstring(&TT[0],32);
                   break;
        case 0xf2: abc = getchar();
                   getstring(&GET[0],32);
                   for(i=0;i<32;i++){
                             TEMP[i] = TT[i];
                                     }
                   if(abc==0) {
                   for(i=0;i<32;i++){
                   LD[i]  = GET[i];  }
                                }
                   break;
                  }                  //add code
        if(serbit) sendchar(0x44);
        else       sendchar(0x88);

                        }

                                     }
if(TI)   TI=0;
//backser:
         P10 = 0;
         SM2 = 1;
         serbit =0;
 }

void timego(void) interrupt 3
{    //定时   t1
            //unsigned  char data i;
            TL1=_tl1;
            TH1=_th1;
            on2500us = 1;
            if(++hang==16) hang=0;
            if(++pt==2)    pt = 0;
     //if(pt==0){
     //     pm=channel/128;
    //      pn=(channel%128)%8;
    //      pl=(channel%128)/8;
    //     if(pm) {   XBYTE[GD0]= gd_off;
    //                XBYTE[GD1]=and1[pn];
    //            }
    //     else   {
    //               XBYTE[GD1]= gd_off;
    //               XBYTE[GD0]=and1[pn];
    //            }
    //       XBYTE[VSEL] = V[pl];
     //          }
    if(pt==1) {
           channel++;
           pm = (channel-1)/8;
           pn = (channel-1)%8;
           REDGET = REDGET;
           //
  //if(channel==210||channel==209){
          //REDGET = REDGET;
          //                           }
          if(REDGET)   hasbattery = 1,TT[pm] |= or1[pn];
          else         hasbattery = 0,TT[pm] &= and0[pn];
           XBYTE[VSEL] = v_off;

          pm=channel/128;
          pn=(channel%128)%8;
          pl=(channel%128)/8;
         if(pm) {   XBYTE[GD0]= gd_off;
                    XBYTE[GD1]=and1[pn];
                }
         else   {
                   XBYTE[GD1]= gd_off;
                   XBYTE[GD0]=and1[pn];
                }
           XBYTE[VSEL] = V[pl];
                  }
    if(onbeep) {
    if(++beeptime>=500) FNC = ~FNC,beeptime =0;
                     }
    if(++t1_500ms>=500)  { flashbit=~flashbit;
                        t1_500ms=0;
            if(++sec5>=8){
                       sec5=0;
                      errbit=0;
                          }
                          }
}
void getttstatus(unsigned char data channel)
{
     unsigned char data i,pm,pn,pl;
     unsigned int data l=500;
     i=channel;
     pm=i/128;
     pn=(i%128)%8;
     pl=(i%128)/8;
     if(pm) {   XBYTE[GD0]= gd_off;
                XBYTE[GD1]=and1[pn];
             }
     else   {
                XBYTE[GD1]= gd_off;
                XBYTE[GD0]=and1[pn];
              }
    XBYTE[VSEL] = V[pl];
    delay_char(250);
    //delay_int(250);
    //pm=255;
     //while(REDGET&&pm) {pm++;}
    //REDGET = REDGET;                               //P1.7
    //REDGET = REDGET;
    //while(REDGET&&l) {l--;}
    REDGET = REDGET;
#ifdef battest
     if(i==156) {              //&&REDGET==1
         pm=0;
     if(REDGET){
        //while(REDGET) {pm++;}
        REDGET = REDGET;
        REDGET = REDGET;
                 }
                        }
#endif
     pm = i/8;
     pn = i%8;
    if(REDGET)   hasbattery = 1,TT[pm] |= or1[pn];
    else         hasbattery = 0,TT[pm] &= and0[pn];
    XBYTE[VSEL] = v_off;
}

void getledstatus(unsigned char data channel)
{
   unsigned char data i,m,n;
   i = channel;
   m = i/8;
   n = i%8;
   if(TT[m]&and1[n])  {
       if(GET[m]&and1[n])  LD[m] |= and1[n];
       else                LD[m] &= and0[n];
                    }
   else  {
       if(TEMP[m]&and1[n])  {
                if(GET[m]&and1[n]){
                     LD[m] &= and0[n];
                                   }
                else{
                 errbit = 1;
                 if(flashbit)  LD[m] |= and1[n];
                 else          LD[m] &= and0[n];
                     }
                              }
        //else      errbit = 0;
         }
}

void writeled(unsigned char data hang)
{
   //unsigned char data i;
   XBYTE[LED0] = led_off;    //hang 0-15
   XBYTE[LED1] = led_off;
   if(hang/8) {  XBYTE[LD0] = 0x0;
                 XBYTE[LD1] = and1[hang%8];
               }
   else       {
                 XBYTE[LD1] = 0x0;
                 XBYTE[LD0] = and1[hang%8];
                }
  if(onbat) {
   XBYTE[LED0] = TT[hang];    //hang 0-15
   XBYTE[LED1] = TT[hang+16];
             }
   else      {
   XBYTE[LED0] = LD[hang];    //hang 0-15
   XBYTE[LED1] = LD[hang+16];
              }
}
void main(void)
{
     unsigned char data i;
     init();
     initserial();
     beep();     //lingshiqudiao
     channel = 0;
     IE=0x98;        //0x98
     TCON=0X40;
        XBYTE[LD0] = 0x01;             //LED    hang
         XBYTE[LD1] = 0x0;
         XBYTE[LED0] = 0xff;            // 540   lie
         XBYTE[LED1] = 0x00;
     //test
      /*
         XBYTE[LD0] = 0x01;             //LED    hang
         XBYTE[LD1] = 0x0;
         XBYTE[LED0] = 0xff;            // 540   lie
         XBYTE[LED1] = 0xff;

         XBYTE[GD0] = 0x40;             //LED    hang
         XBYTE[GD1] = 0x0;
         XBYTE[VSEL] = V[0];            // 540   lie
         */
           channel = 0;
           hang    = 15;
           XBYTE[GD1]= gd_off;
           XBYTE[GD0]=and1[0];
           XBYTE[VSEL] = V[0];
           //do{
           //  getttstatus(channel);
           // }while(++channel<8);
 while(1){
     if(on2500us){
     on2500us = 0;
     writeled(hang);      //hang
                  }

     //getttstatus(channel);
     if(abc!=0)  getledstatus(i++); //get a channel status to LD[32]
     if(errbit)  onbeep =1;
     else        onbeep =0,FNC =0;

     //if(++channel==0) errbit=0;
      //if(channel==0) {
      //     m++;
      //               }
     //if(channel%16==0){                     //del
     //  if(++hang==16) hang=0;
     //  writeled(hang);
      //                  }
          }

}

⌨️ 快捷键说明

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