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

📄 main.c

📁 一个应用89C52
💻 C
字号:
/***************************************************************************************
*文件名称:Main.c
*作    者:
*版    本: 1.00
*项目名称: LIC-9601
*说    明: 主控芯片为AT89C52
*创建日期:2006.12.13
*修改记录:
****************************************************************************************/
//#pragma OT(8,SPEED) BR NOIP FF(0) DB OE CD
#include <reg52.h>
#include <absacc.h>
#include <ADEF.h>
#include <INTRINS.h>
/****************************************************************************************
*函数名称:beep()
*函数功能:蜂鸣器报警函数
*入口参数:无
*出口参数:无
*作    者:
*日    期:
*****************************************************************************************/
void beep (void){
    unsigned  char data j;
    unsigned  int  data i;
    FNC=1;
    for(j=5;j>0;j--){
        for(i=15000;i>0;i--){         //22M
                               }
                       }
                 FNC=0;
                 }
 /****************************************************************************************
*函数名称:init()
*函数功能:系统初始化模块
*入口参数:无
*出口参数:无
*作    者:
*日    期:
*****************************************************************************************/
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;
               P10      = 0;
               FNC      = 0;
               //XQG      = UP;
               FQG      =1;
               TCON     =0;
               flashbit = 0;
               serbit   =0;
               errbit   =0;
               onbat    =0;
               t1_500ms = 0;
               sec5     = 0;
               onqg     = 0;
	     qg_state =0;
               jiguangbit =0;
               qg    = 0;
               LDW   = ld_off;             //LED    hang
               LEDW  = led_off;            // 540   lie
               GDW   = gd_off;
               abc   = 0;                   //abc为档位号
               }
/****************************************************************************************
*函数名称:initserial()
*函数功能:串口初始化模块
*入口参数:无
*出口参数:无
*作    者:
*日    期:
*****************************************************************************************/
void initserial(void){
    SCON   = 0xe0;		  /* SCON: mode 1, 8-bit UART, enable rcvr      */
    T2CON  = 0x30;                 /* TMOD: timer 2, mode 3, 16-bit reload        */
    RCAP2H = _th2;           //57600   FA   115200 Fd     24M  F2
    RCAP2L = _tl2;
    TH2    = _th2;          //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    */
    ES     = 1;
   // EA     = 1;              //?
    addres = TXADR;
    addres &=0x0f;
    addres |=0xc0;
}
/****************************************************************************************
*函数名称:sendchar(c)
*函数功能:发送字节
*入口参数:c
*出口参数:无
*作    者:
*日    期:
*****************************************************************************************/
void sendchar (unsigned char c)  {
  TI = 0;
  SBUF = c;
  while (!TI);
  TI = 0;
}
/****************************************************************************************
*函数名称:delay_char(mstime)
*函数功能:延迟函数
*入口参数:mstime
*出口参数:无
*作    者:
*日    期:
*****************************************************************************************/
void delay_char(unsigned  char data mstime)
           {
           unsigned  char data i;
           i=mstime;
           while(--i){}
                  }
/****************************************************************************************
*函数名称: sendstring(lenth)
*函数功能: 字符串发送
*入口参数: lenth
*出口参数: 无
*作    者:
*日    期:
*****************************************************************************************/
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++;
                       }
 }
 /****************************************************************************************
*函数名称: getchar()
*函数功能: 串口接受字节模块
*入口参数: 无
*出口参数: c
*作    者:
*日    期:
*****************************************************************************************/
unsigned char getchar ()  {
  unsigned int data  c=1000;
  while(!RI)  {}          // serbit=1
  c = SBUF;
  RI = 0;
  return (c);
}
/****************************************************************************************
*函数名称: getstring()
*函数功能: 串口接受字符串函数
*入口参数: lenth
*出口参数: *p
*作    者:
*日    期:
*****************************************************************************************/
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;
                           }
}
/****************************************************************************************
*函数名称: PSserialInt()
*函数功能: 串口中断
*入口参数: 无
*出口参数: 无
*作    者:
*日    期:
*****************************************************************************************/
void PSerialInt(void) interrupt 4
{
    unsigned char c[2],i;
if(_testbit_(RI)&&_testbit_(RB8)){

       c[0]=SBUF;
    if(c[0]==addres){
           P10 =1;
           TB8 = 1;
           sendchar(addres+1);
           SM2 = 0;
           TB8 = 0;
           c[1]=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<12;i++){
                                 GET[i] = 0;
                                 LD[i]  = 0;  }
                            }
                   break;
        case 0xf1: sendstring(&TT[0],12);
                   break;
        case 0xf2: abc = getchar();
                   getstring(&GET[0],12);
                   for(i=0;i<12;i++){
                    TEMP[i] = TT[i];            //TEMP[12] 分选前有电池的位
                                     }          //LD[12] 点亮的电池位
                   if(abc==0) {                 //TT[12] 当前有电池的位
                   for(i=0;i<12;i++){           //GET[12] 想要点亮的电池位,
                    LD[i]  = GET[i];             //abc:档位号,abc=0时,测试灯的好坏
                    }
                                }
                   break;
        case 0xf3:
                   qg      = getchar();                //汽缸开启与关闭
                   if(tuopan_state==1) qg=0,serbit=1;//汽缸开关为本地状态,TA3=1为本地状态;
                   break;
                  }
        if(serbit) sendchar(0x44);
        else       sendchar(0x88);
                        }
                                 }
  // else  c[0]=SBUF;
if(TI)   TI=0;
         P10 = 0;
         SM2 = 1;
         serbit =0;

 }
 /****************************************************************************************
*函数名称:writeled(hang)
*函数功能:发光二极管点亮函数
*入口参数:hang
*出口参数:无
*作    者:
*日    期:
*****************************************************************************************/
void writeled(unsigned char data hang)
{
   unsigned char data i;
   LEDW = led_off;    //lie 0-7
   LDW  = ld_off;
   i	= hang;
   LDW  = i;
   if(onbat) {
   LEDW = TT[i];     //TT[12]:当前有电池的位
             }
   else      {
    LEDW = LD[i];    //LD[12]:点亮的电池位
              }
}
/****************************************************************************************
*函数名称: timego()
*函数功能: 定时器1中断函数
*入口参数: 无
*出口参数: 无
*作    者:
*日    期:
*****************************************************************************************/
void timego(void) interrupt 3
{    //定时   t1
            TT[hang]   = ~V1R;                //红外线发接受管列读入,行为GDW,列为V1R
/*#ifdef  onebyone
            if(hang==1) {
                        nop;
                        }
#endif*/
           if(++hang==12) hang= 0;
           if(jiguangbit==0)
            {
              GDW  = hang;
              writeled(hang);                 //点亮相应的电池位
              }
            if(errbit)  onbeep =1;
            else        onbeep =0,FNC =0;
           if(FNC==1&&flashbit==0){           //电池取错蜂鸣器报警,LED闪烁
               FNC=FNC;
                                    }
            if(++t1_500ms>=500)
            {
                 flashbit=~flashbit;
                 t1_500ms=0;                       //托盘到位检测
                 if(flashbit&&onbeep) FNC=1;
                 else                 FNC=0;
                 if(++sec5>=6){
                               sec5 = 0;
                               errbit=0;
                                }
             }
       FQG        = 1;            //*********************
       key_state  = FQG;
       if(key_state!=key) {       //汽缸开关状态检测 &&tuopan_state==1
                onqg=1;
                          }
        tuopan_state   = TXADR;
        tuopan_state >>= 5;

       if(onqg&&tuopan_state==1) {
                                  FNC = 0;
                                  LEDW      = led_off;
                                  LDW       = ld_off;
           if(key_state)   {          //0
                     XQG        = DOWN;
                     qgtime     = 0  ;
                     GDW        = 0x90;
                     jiguangbit = 1;
                     qg_state   = 1;
                    
                     
                        }
           else      {
                      XQG       = UP;
                      qg_state  = 0;               //1
                      }
           while(key!=key_state)          //{FQG = 1,key = FQG;}
             {
               key=~key;
             }
            onqg = 0;
                 }
     else if(onqg&&tuopan_state!=1){
            onqg = 0;
                            }
      if(qg!=0&&tuopan_state==0)  {
                                  FNC = 0;
                                  LEDW      = led_off;
                                  LDW       = ld_off;
        if(qg==0x55)  {
                    XQG        = DOWN;
                     qgtime     = 0  ;
                     GDW        = 0x90;
                     jiguangbit = 1;
                     qg_state   = 1;
                       }
        else           {
                        XQG       = UP;
                        qg_state  = 0;
                        }
        qg = 0;
                  }
     else if(qg!=0&&tuopan_state!=0){
                            qg=0;
                                    }
         while(jiguangbit)
        {                                 //TEST JIGUANG GUAN
         JIG = 1;
         JIG = JIG;
         if(JIG==1){
            delay_char(250);
            JIG = JIG;                 //JIG低电平正常,高电平错误
            if(JIG&qg_state){
               XQG        = UP;
               qg_state   = 0;     //
               jiguangbit = 0;
	     GDW        = 0x10;  ///
               errbit     = 1;
                            }
                    }
         }
             if(qg_state)
             {   qgtime++;
                 if(qgtime>=3000) {
                     qg_state   = 0;
                     qgtime     = 0;
                     jiguangbit = 0;
                     GDW        = 0X10;
                                 }
              }
            TL1        = _tl1;
            TH1        = _th1;
           }
/****************************************************************************************
*函数名称:getledbyte(pm)
*函数功能:电池错拿检测函数
*入口参数:pm
*出口参数:errbit,LD[M],
*作    者:
*日    期:
*****************************************************************************************/
void getledbyte(unsigned char data pm)
{
     unsigned char data atemp,m,att;
      m     = pm;
      atemp = (~TEMP[m])&TT[m];                        //TEMP[12] 分选前有电池的位
      att   = (TEMP[m]&(~TT[m]))&(~GET[m]);
      LD[m] = (TEMP[m]&TT[m])&GET[m];                 //LD[i]:分选时点亮的电池位
      if(atemp) {
                 errbit = 1;
                 if(flashbit)  LD[m] |= atemp;
                 else          LD[m] &= (~atemp);
                }
      if(att)
                {                                      //att电池取错的位
                 errbit = 1;
                 if(flashbit)  LD[m] |= att;
                 else          LD[m] &= (~att);
                }
}

/****************************************************************************************
*函数名称:main()
*函数功能:主函数
*入口参数:无
*出口参数:无
*作    者:
*日    期:
*****************************************************************************************/
void main(void)
{
     unsigned char data i;
     init();
     initserial();
         LDW       = 12;             //LED    hang
         LEDW      = 0x0;            // 540   lie
         GDW       = gd_off;
         hang      = 0;
         GDW       = hang;
         beep();
         IE        = 0x98;          //0x98
         TCON      = 0X40;
         XQG       = UP;         //汽缸为开启状态
         FQG       = 1;
         i         = 0;
         key       = FQG;
         key_state = FQG;
while(1){
     if(abc != 0) getledbyte(i);
     if(++i == 12)
      {
      i=0;
      }
}
}

⌨️ 快捷键说明

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