📄 maintest5.c
字号:
#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 + -