📄 ws.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 + -