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

📄 maintest5.c

📁 车载监控程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg52.h>
#include<stdio.h>
#include<string.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#define x     0x80                      //LCD...........
//#define y     0x80
#define comm  0
#define dat   1
sbit cs =P0^3;
sbit std=P0^2;
sbit sclk=P0^1;
sbit rst=P0^0;
sbit psb=P0^4;
sbit DQ =P1^2;                          //DS18B20........
sbit StartGSM=P1^5;
sbit RELAY1=P1^3;                       //继电器........
sbit RELAY2=P1^4;


/*-------------------函数、变量定义-----------------------------------*/
uchar keyPtr;
uint keyFlag;
uchar TemperH=35;
uint timer;
bit AlarmSF=0;
bit AlarmMode=0;
//uint Temper;
void Start_System(void);
void delay (uint us);
void delay1(uint ms);
void delay2(uint us);
uint Read_Temp(void);
void Wendu_Display();
bit  RST_1820(void);
void Init_lcd(void);
void clrram(void);
void int_disp1(uchar datah ,uchar p);
void chn_disp(uchar code *chn);
void chn_disp2(uchar code *chn,uchar h,uchar l,uchar p);
void Char_Display(uchar disdata,uchar p);
void ScanKeys(void);                                    //键盘扫描
uchar KeyJudge(void);                                   //按键预处理
void KeyHandle(uchar keyIndex);                         //按键处理模块
void Key_SetHT(void);
void Key_Enter(void);
void Key_SendSMS(void);
void Key_ReadSMS(void);
void Key_DeleteSMS(void);
void Key_SetAlarmMode(void);
void Key_IncHT(void);
void Key_DecHT(void);
//-------------GSM----------------------------------------
void Init_Serial(void);
uchar idata smsCenter_pdu[]="3108502305F0";//13800532500
uchar idata Phone_pdu[]="5158294838F0";     //15859284830
uchar idata Phone[]="15859284830;\r";
uchar idata rsBuf[]="";

void Init_GSM(uchar mode);
void Call(void);
void Cancel(void);
void Send_SMS(uchar *p);
void Send_SMS2(uchar *p);
/*------------------------------------------------------------------*/
uchar code tab0[]={
"温度:"};
uchar code tab1[]={
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar code tab2[]={
"High Temperature Alarm!"};
//------------------------------------------------------------------
void main(void)
{
        Start_System();
  //-----------------------------
        RELAY1=1;                       //继电器........
        RELAY2=1;
        Init_Serial();
        TMOD=0x11;
        EA=1;
        IP=0x10;                          //设置串口中断优先级
        ET0=1;
        ET1=1;
        TH0=0x8a;
        TL0=0xd0;
        TH1=0X3c;
        TL1=0Xb0;
        TR0=1;                          //启动定时器0
        //TR1=1;
        //EX0=1;                        //开外部中断0,低电平触发
        //IT0=1;
        Init_GSM(1);
        while(1)
        {
         //Wendu_Display();
         /*keyPtr=KeyJudge();                      //键盘扫描判断
         if(keyPtr!=0x55)                        //如果有键按下则处理
           {
             //init_lcd ();
             clrram();
             KeyHandle(keyPtr);
             delay1(400);
           }*/
        }
}


//------------------外部中断0,按键处理------------------
void Int0(void)interrupt 0
{
        //uchar keyPtr;
        keyPtr=KeyJudge();                      //键盘扫描判断
        if(keyPtr!=0x55)                        //如果有键按下则处理
           {
              KeyHandle(keyPtr);
           }
}
//------------------定时器0------------------------------

void Timer0(void)interrupt 1
{
        TR0=0;
        Wendu_Display();
        keyPtr=KeyJudge();                      //键盘扫描判断
         if(keyPtr!=0x55)                        //如果有键按下则处理
           {
             Init_lcd ();
             //clrram();
             KeyHandle(keyPtr);
             delay1(1000);
           }
        TH0=0X8a;                     //重装初始值10ms
        TL0=0Xd0;
        TR0=1;
}
//--------------外部中断1--------------------------
void Int1(void)interrupt 2
{
}
//-------------- 定时器1,50ms中断-----------------

void Timer1(void)interrupt 3
{
          //TR1=0;
          //Wendu_Display();
          TH1=0X3c;
          TL1=0Xb0;
          timer++;
          //TR1=1;
}
//-------------------串行口程序-------------------------------------
void Init_Serial(void)      //串口初始化,9600bit/s,方式1
{
     SCON=0X50;
     TCLK=1;
     RCLK=1;
     C_T2=0;
     RCAP2H=0XFF;
     RCAP2L=0XDC;
     //TH2=0XFF;
     //TL2=0XDC;
     ES=1;
     TR2=1;
}
void Serial(void)interrupt 4
{
        uchar Message;
        REN=1; //允许串口中断
        while(!RI){}; //等待计算机发来消息
        RI =0;
        Message=SBUF; //读取消息
        //发送字符
        SBUF=Message;
        while(!TI){};
        TI=0;

}
//-------------------按键子程序--------------------------
void ScanKeys(void)                                     //扫描键盘模块
{
        uchar scanValue=0xfe;                           //定义扫描初始值
        uchar iScan,scanTempUchar;
        for(iScan=0;iScan<4;iScan++)
        {
                P2=scanValue;                           //发送扫描值
                scanTempUchar=P2;                       //读入扫描值
                if((scanTempUchar&0x10)==0x00)          //第1列被按
                {
                  keyFlag|=(0x0001<<(iScan*4+0));       //置此键的标志位
                }
                else
                {
                  keyFlag&=~(0x0001<<(iScan*4+0));      //清除此键的标志位
                }
                if((scanTempUchar&0x20)==0x00)          //第2列被按
                {
                  keyFlag|=(0x0001<<(iScan*4+1));
                }
                else
                {
                  keyFlag&=~(0x0001<<(iScan*4+1));
                }
                 if((scanTempUchar&0x40)==0x00)          //第3列被按
                {
                  keyFlag|=(0x0001<<(iScan*4+2));
                }
                else
                {
                  keyFlag&=~(0x0001<<(iScan*4+2));
                }
                 if((scanTempUchar&0x80)==0x00)          //第4列被按
                {
                  keyFlag|=(0x0001<<(iScan*4+3));
                }
                else
                {
                  keyFlag&=~(0x0001<<(iScan*4+3));
                }
                scanValue=scanValue<<1|0x01;            //置下一次扫描值
        }
}
uchar KeyJudge(void)                                    //按键预处理
{
        uchar j,counterKeyPressedNum;
        uchar keyRet=0x55;                         //初始化按键返回码设定为无按码0x55
        uint uintTemp;
        ScanKeys();
        if(keyFlag!=0)
        {
                delay1(10);                            //延时消除抖动
                ScanKeys();
                P2=0x0f;
                while((P1&0x0f)!=0x0f);                 //等待按键松开
                counterKeyPressedNum=0;
                for(j=0;j<16;j++)
                {
                  uintTemp=((uint)0x0001)<<j;
                  if((keyFlag&uintTemp)==uintTemp)
                  {
                    counterKeyPressedNum++;
                    keyRet=j;
                  }
                }
                if(counterKeyPressedNum>1)
                {
                  return 0x55;
                }
                else
                {
                  return(keyRet);
                }
        }
        return(0x55);
}
void KeyHandle(uchar keyIndex)
{
        switch(keyIndex)
        {
          case 0:
          Char_Display(0,0x83);
          break;
          case 1:
          Char_Display(1,0x83);
          break;
          case 2:
          Char_Display(2,0x83);
          break;
          case 3:
          Char_Display(3,0x83);
          break;
          case 4:
          Char_Display(4,0x83);
          break;
          case 5:
          Char_Display(5,0x83);
          break;
          case 6:
          Char_Display(6,0x83);
          break;
          case 7:
          Char_Display(7,0x83);
          break;
          case 8:
          Key_IncHT();
          break;
          case 9:
          Key_SetHT();
          break;
          case 10:
          Key_SetHT();
          break;
          case 11:
          Key_SetAlarmMode();
          break;
          case 12:
          Key_DecHT();
          break;
          case 13:
          Send_SMS2(tab2);
          break;
          case 14:
          Call();
          break;
          case 15:
          Cancel();
          break;
          default: break ;
        }
}

/***************************LCD显示子程序**********************/
void wr_lcd (uchar dat_comm,uchar content);
/*------------------初始化-----------------*/
void Init_lcd (void)
{
  rst=1;
  psb=0;
  wr_lcd (comm,0x30);  /*30---基本指令动作*/
  wr_lcd (comm,0x01);  /*清屏,地址指针指向00H*/
  delay2 (80);
  wr_lcd (comm,0x06);  /*光标的移动方向*/
  wr_lcd (comm,0x0c);  /*开显示,关游标*/
}
/*--------------清DDRAM------------------*/
void clrram (void)
{
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x01);
  delay2 (80);
}
/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
  uchar a,i,j;
  delay2 (40);
  a=content;
  cs=1;
  sclk=0;
  std=1;
  for(i=0;i<5;i++)
  {
    sclk=1;
    sclk=0;
  }
  std=0;
  sclk=1;
  sclk=0;
  if(dat_comm)
    std=1;   //data
  else
    std=0;   //command
  sclk=1;
  sclk=0;
  std=0;
  sclk=1;
  sclk=0;
  for(j=0;j<2;j++)
  {
    for(i=0;i<4;i++)
    {
      a=a<<1;
      std=CY;
      sclk=1;
      sclk=0;
    }
    std=0;
    for(i=0;i<4;i++)
    {
      sclk=1;
      sclk=0;
    }
  }
}

void sleep_on(void)                     //睡眠模式开
{
        wr_lcd(comm,0x34);              //扩充指令动作
        wr_lcd(comm,0x08);
        delay2(40);
}
void sleep_off(void)                    //睡眠模式关
{
        wr_lcd(comm,0x34);
        wr_lcd(comm,0x0c);
        delay2(40);
}
//---------------显示汉字或字符----------------
void chn_disp(uchar code *chn)
{
  uchar i,j;
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x80);
  j=0;
  for (i=0;i<16;i++)
  wr_lcd (dat,chn[j*16+i]);
  wr_lcd (comm,0x90);
  j=1;
  for (i=0;i<16;i++)
  wr_lcd (dat,chn[j*16+i]);
}

//--------------显示中文字符:h-行,l-列(字符数),p-位置------------
void chn_disp2(uchar code *chn,uchar h,uchar l,uchar p)
{
        uchar i,j;
        wr_lcd(comm,0x30);
        wr_lcd(comm,p);
        j=h;
        for(i=0;i<l;i++)
        wr_lcd(dat,chn[j*16+i]);
}
//--------------显示数据----------------

void int_disp1(uchar datah ,uchar p)    //指定位置显示半宽数据
{
        wr_lcd(comm,0x30);
        wr_lcd(comm,p);
        wr_lcd(dat,datah);

}
void int_disp2(uchar datah)             //地址自增显示半宽数据
{
        wr_lcd(comm,0x30);
        wr_lcd(dat,datah);

}

void int_disp3(uchar datah,uchar datal, uchar p)
{
        wr_lcd(comm,0x30);
        wr_lcd(comm,p);
        wr_lcd(dat,datah);
        wr_lcd(dat,datal);
}
void int_disp4(uchar datah,uchar datal)
{
        wr_lcd(comm,0x30);
        wr_lcd(dat,datah);
        wr_lcd(dat,datal);
}


/*------------------显示子程序--------------------*/
//--------------数据显示处理程序--------------------
void Char_Display(uchar disdata,uchar p)            //指定显示地址,显示数字
{

        if((disdata>=0)&(disdata<100))
        {      uchar sw,gw;
               sw=disdata/10;
               gw=disdata%10;
               //int_disp1(0x20,p);
               int_disp1(tab1[sw],p);
               int_disp2(tab1[gw]);

         }
         else if(disdata>=100)
         {
                uchar bw,sw,gw;
                bw=disdata/100;
                sw=(disdata%100)/10;
                gw=disdata%10;
                int_disp1(tab1[bw],p);
                int_disp2(tab1[sw]);
                int_disp2(tab1[gw]);
         }

}
void Char_Display2(uchar disdata)               //地址自增显示数字
{

        if((disdata>=0)&(disdata<100))
        {      uchar sw,gw;
               sw=disdata/10;
               gw=disdata%10;
               int_disp2(tab1[sw]);
               int_disp2(tab1[gw]);

         }
         else if(disdata>=100)
         {
                uchar bw,sw,gw;
                bw=disdata/100;
                sw=(disdata%100)/10;
                gw=disdata%10;
                int_disp2(tab1[bw]);
                int_disp2(tab1[sw]);
                int_disp2(tab1[gw]);
         }
}
//--------------温度显示和高温报警程序---------------------------
void Wendu_Display(void)
{
        bit flag;
        static uchar counter1;
        uint teData;
        uchar tempzs;
        uchar tempxs;
        counter1++;
        if(counter1>=10)
        {
           Init_lcd();
           counter1=0;
        }
        //----温度显示界面----------
        int_disp3(0xa1,0xef,0x90);
        int_disp3(0xa1,0xef,0x97);
        chn_disp2(tab0,0,6,0x80);

⌨️ 快捷键说明

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