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

📄 ws.c

📁 瓦斯监测程序
💻 C
字号:
//--------------------------------------------
//                程序说明   (STC版带AD,LCD显示,阀值可调)
//--------------------------------------------
#include <STC12C5410AD.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit ring  = P3^7;      //蜂鸣器,1为响,0为不响

sbit dkey  = P0^1;
sbit akey  = P3^3;
sbit mo    = P3^0;

sbit RSPIN = P3^5;
sbit RWPIN = P3^4;
sbit EPIN = P3^3;      //液晶屏相关引脚

uint danger;
ulong  voltage,data8,data2;
uint ringNum,ringTmp;
uchar seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,	//段码
	     0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar ge,shi,bai;

uchar outTimer;

uchar XPOS,YPOS;

uchar lowvolt,highvolt;
void delay(uint t)
{  uint i,j;
   for(i=0;i<t;i++)
      for(j=0;j<10;j++)
         ;
}
//----------------
//LCD通讯程序
//----------------
void lcdwaitidle(void)
{  P2=0xff;
   RSPIN=0;
   RWPIN=1;
   EPIN=1;
   while((P2&0x80)==0x80);
   EPIN=0;
}

void lcdwcn(uchar c)
{  RSPIN=0;
   RWPIN=0;
   P2=c;
   EPIN=1;
   _nop_();
   EPIN=0;
}

void lcdwc(uchar c)
{  lcdwaitidle();
   lcdwcn(c);
}

void lcdwd(uchar d)
{  lcdwaitidle();
   RSPIN=1;
   RWPIN=0;
   P2=d;
   EPIN=1;
   _nop_();
   EPIN=0;
}

void lcdpos(void)
{  XPOS&=0x0f;
   YPOS&=0x03;
   if(YPOS==0x00)
      lcdwc(XPOS|0x80);
   else if(YPOS==0x01)
      lcdwc((XPOS+0x40)|0x80);
}

void lcdreset()
{  delay(150); lcdwcn(0x38);
   delay(50); lcdwcn(0x38);
   delay(50); lcdwcn(0x38);
   lcdwc(0x38);
   lcdwc(0x08);
   lcdwc(0x01);
   lcdwc(0x06);
   lcdwc(0x0c);
}

void lcdfill(uchar x,uchar y,uchar n)
{
      YPOS = y;
      XPOS=x;
      lcdpos();
      lcdwd(n);
}

void lcdwda(uchar x,uchar y,uchar *s)
{  YPOS=y;
       while(*s>0)
       {
          XPOS=x;
          lcdwd(*s);
          s++;
          delay(500);
          if (x<16)
          x++;
       }
}
//-----LCD通讯程序结束-----



delay1(uint dtime)
{
 uint i,j;
 for (i=0;i<dtime;i++)
 for (j=0;j<1000;j++)
 ;
}

void ringMethod()
{
 if (ringTmp==0)
 {
  ring = ~ring;
  ringTmp = ringNum;
 }

}

void timer0() interrupt 1
{
 outTimer++;
 TH0 = 0;
 TL0 = 0;
}

void adc() interrupt 5 //AD中断
{
  ring=1;
  ADC_CONTR = 0X00;

  data8 = ADC_DATA;
  data2 = ADC_LOW2;
  data8 = data8*4;
  voltage = data2 + data8;
  data8   = voltage*5;
  data8  *= 100;
  voltage = data8/1024;
  //voltage++;
 ADC_CONTR = 0X88;
 SPSTAT = 0X00;
 //喂狗
 //WDT_CONTR =0X35;
}



//--------------------------------
//初始化
//--------------------------------
void init()
{
 ring = 0;
 EA = 1;
 EX0 = 0;
 EX1 = 0;
 PX0 = 1;
 TCON = 0X05;
 //dang_data = 1;
 //wrong_data = 1;
 danger = 0;

 //AD设置
 AUXR = 0X18; //EADC = 1
 EADC_SPI = 1;
 P1M0 = 0X01;
 P1M1 = 0X00;
 ADC_DATA = 0;
 ADC_LOW2 = 0;
 ADC_CONTR = 0X80 + 0; //P1.0AD转换

 //定时器设置
 ET0 = 1;
 TMOD = 0x00;
 TR0=1;

 lcdreset();
 delay(10);
 lcdwda(0,0,"CO%  :");
/*
 //开机检测
 if (wrong == 0)
  danger = 1;
 if(dang == 0)
  danger = 2;
*/
}

main()
{
 init();       //初始化
 delay1(10);
 //开狗
 //WDT_CONTR =0X35;
 ADC_CONTR = 0X88;
 //ring=1;
 while(1)
 {
  if (outTimer>=40)
  {
   if (akey==0)
   {
     if (mo==1)
      lowvolt++;
     else
      highvolt++;
   }
   if (akey==1)
   {
     if (mo==1)
      lowvolt--;
     else
      highvolt--;
   }
   EA=0;
   outTimer = 0;
   lcdwda(6,0,voltage);
   EA=1;
  }


  if(ringNum > 0)            //警报运行时
  {
   ringTmp--;
   ringMethod();
  }

  if(voltage >= lowvolt)     //达到预警值
  {
   ringNum = 70;
   if(danger==0)             //第一次进入
      ringTmp = ringNum;
   danger = 1;
  }

  if(voltage > highvolt)     //达到危险值
  {
   ringNum = 10;
   if(danger==0)
      ringTmp = ringNum;     //第一次进入
   danger = 2;
  }

  if(voltage < lowvolt)      //解除警报
   {
    ring = 0;
    ringNum = 0;
    danger = 0;
   }

 }
}

⌨️ 快捷键说明

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