#include<STC12C5410AD.H>
#include<800.h>
/*********************************************************/
#define key_num 150
//#include<STC89C51RC_RD.H>
/*******************************************************/
//uchar data *ATT1=0x
/********************************************************/
void delay_us(uint dat);
void delay_ms(uint dat);
void initial(void);
void initial_UART(void);
void Send_one_Byte(uchar dat);
void Send_AT(void);
void receive(void);
void input(void);
void Send_AA(uchar *dat,uchar len); //发送前len个字符
void AT_IO(void); //短消息命令判断处理
void Send_CMGS(uchar *dat); //发送短信
uchar Lookup(uchar *dat,uchar len); //
void ISP_IAP_enable(void); //
void ISP_IAP_disable(void);
void sector_erase(uint sector_addr);
uchar byte_read(uint byte_addr);
void byte_program(uint byte_addr, uchar original_data); //写EEPROM一字节
bit Write_SN(uchar *dat,uchar *SN_); //写密码
bit Write_ATT(uchar *dat,uint addr); //写手机号码
void Send_Alarm(void); //发送报警短信
void Send_D001(void);
void Send_E001(void);
void ADC_read(uchar dat);
void charge(void);
//void incept(void);
/********************************************************/
bit comgnd=0;
//bit
uchar pointer;
uint key_delay=0;
uchar ADCdata=0;
uchar Send_num=0;
bit SNS=1;
bit WING=1;
sbit ON_OFF=P1^3;
sbit Alarm1=P2^6;
sbit Alarm2=P2^7;
//sbit ON_OFF=P3^5;
//sbit Alarm1=P3^4;
//sbit Alarm2=P3^3;
sbit DC34=P1^4;
sbit DC42=P1^5;
sbit A_IO=P2^0; //继电器1
sbit B_IO=P2^1; //继电器2
sbit LED=P3^7;
sbit DC_IO=P3^2; //充电
//uchar code ON[]={0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x36,0x51,0x73,0x67,0x3A};
//uchar code OFF[]={0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x36,0x5F,0x00,0x67,0x3A};
//uchar pino[]={0x73,0x67,0x3A,0x31,0x00,0x32,0x00,0x33,0x00,0x34};
//uchar code AT_CMGS_[]={0x41,0x54,0x2B,0x43,0x4D,0x47,0x53,0x3D,0x33,0x2C,0x31,0x33,0x35};
// 0x35,0x33,0x34,0x38,0x34,0x34,0x34,0x2C,0x30,0x2C,0x30,0x2C,0x41,0x4B,0x0D,0x0A};
//uchar code CMGR[]={0x0D,0x0A,0x2B,0x43,0x4D,0x47,0x52,0x3A,0x20,0x30,0x30,0x30,0x30,0x31,0x32,0x33,0x30,0x2C,0x31,0x33,0x35,0x33,0x35,0x33,0x34,0x38,0x34,0x34,0x34,0x2C,0x31,0x33,0x35,0x33,0x35,0x33,0x34,0x38,0x34,0x34,0x34,0x2C,0x32,0x30,0x30,0x36,0x2F,0x30,0x34,0x2F,0x30,0x39,0x2F,0x31,0x33,0x3A,0x34,0x38,0x2C,0x39,0x2C,0x31,0x32,0x33};
void main(void)
{
// uchar i;
// OFF_3=0;
// OFF_4=0;
LED=1;
delay_ms(800);
initial();
initial_UART();
for(;;)
{
input();
charge();
if(comgnd==1)
{
AT_IO();
comgnd=0;
initial_UART();
}
}
}
/*************************************************************
初始化
**************************************************************/
void initial(void)
{
uchar i;
/*************************************************/
/*---------------ADC------------------*/
// P1M0=0x03; //P1.0,P1.1 为AD输入脚
// P1M1=0x03;
// ADC_CONTR=ADC_CONTR|0xE0; //打开ADC电源 210个时钟周期
/*************************************************/
pointer=0;
if(byte_read(0x2A00)!=0x5A)
{
sector_erase(0x2800);
delay_ms(25);
for(i=0;i<6;i++)
{
byte_program((0x2800+i),(0x31+i));
delay_ms(25);
}
sector_erase(0x2A00);
delay_ms(25);
byte_program((0x2A00),0x5A);
}
for(i=0;i<6;i++)
{
SN[i]=byte_read(0x2800+i);
}
/*************************************************/
}
/************************************************************
串口初始化
115200bps 波特率, 8bit 数据 位,无奇偶校验,1bit 停止位,硬件数据流控制。
SCON 地址98H
可位寻址 7 6 5 4 3 2 1 0
复位值 00H SM0/FE SM1 SM2 REN TB8 RB8 TI RI
位 符号 功能
SCON.7 FE 帧错误位当检测到一个无效停止位时通过UART 接收器设置该位但它必须由
软件清零要使该位有效PCON 寄存器中的SMOD0 位必须置1
SCON.7 SM0和SM1 定义串口操作模式要使该位有效PCON 寄存器中的SMOD0 必须置0
SCON.6 SM1和SM0 定义串行口操作模式见下表
SM0 SM1 UART 模式 波特率
0 0 0: 同步移位寄存器 fosc/12 12 时钟模式或fosc/6 6 时钟模式
0 1 1: 8 位UART 可变
1 0 2: 9 位UART fosc /64 或fosc /32(12 时钟); fosc /32 或fosc /16(6 时钟模式)
1 1 3: 9 位UART 可变
SCON.5 SM2 在模式2 和3 中多处理机通信使能位在模式2 或3 中若SM2=1 且接收到的第
9 位数据RB8 是0 则RI 接收中断标志不会被激活在模式1 中若SM2=1
且没有接收到有效的停止位则RI 不会被激活在模式0 中SM2 必须是0
SCON.4 REN 允许接收位由软件置位或清除REN=1 时允许接收REN=0 时禁止接收
SCON.3 TB8 模式2 和3 中发送的第9 位数据可以按需要由软件置位或清除
SCON.2 RB8 模式2 和3 中已接收的第9 位数据在模式1 中或sm2=0 RB8 是已接收的停止
位在模式0 中RB8 未用
SCON.1 TI 发送中断标志模式0 中在发送完第8 位数据时由硬件置位其它模式中在
发送停止位之初由硬件置位在任何模式中都必须由软件来清除TI
SCON.0 RI 接收中断标志模式0 中接收第8 位结束时由硬件置位其它模式中在接收停
止位的中间时刻由硬件置位在任何模式(SM2 所述情况除外)必须由软件清除RI
=======================================================================================
表7 中断表
中断源 优先顺序 请求位 硬件清除 入口地址
X0 1 IE0 N(L)1 Y(T)2 03H
T0 2 TP0 Y 0BH
X1 3 IE1 N(L) Y(T) 13H
T1 4 TF1 Y 1BH
PCA 5 CF,CCFn(n=0-4) N 33H
SP 6 R1,T1 N 23H
T2 7 TF2,EXF2 N 2BH
注
1 L= 电平激活
2 T= 翻转激活
IE(0A8H) 7 6 5 4 3 2 1 0
EA EC ET2 ES ET1 EX1 ET0 EX0
使能位=1 使能中断
使能位=0 禁止中断
位 标号 功能
IE.7 EA 全局禁止位如果EA=0 禁止所有中断如果EA=1 通过置
位或清除使能位对应的每个中断被使能或禁止
IE.6 EC PCA中断使能位
IE.5 ET2 定时器2 中断使能位
IE.4 ES 串行口中断使能位
IE.3 ET1 定时器1 中断使能位
IE.2 EX1 外部中断1 使能位
IE.1 ET0 定时器0 中断使能位
IE.0 EX0 外部中断0 使能位
图20 IE 特殊功能寄存器
IP(0B8H) 7 6 5 4 3 2 1 0
PT2 PS PT1 PX1 PT0 PX0
中断优先级控制位=1 定义为高优先级中断
中断优先级控制位=0 定义为低优先级中断
位 标号 功能
IP.7
IP.6 PPC PCA 中断优先级控制位
IP.5 PT2 定时器2 中断优先级控制位
IP.4 PS 串行口中断优先级控制位
IP.3 PT1 定时器1 中断优先级控制位
IP.2 PX1 外部中断1 中断优先级控制位
IP.1 PT0 定时器0 中断优先级控制位
IP.0 PX0 外部中断0 中断优先级控制位
/ ***********************************************************/
void initial_UART(void)
{
SCON=0x50;
TMOD=0x20;
// SMOD=1;
PCON|=0x80;
TH1=0xF4;
AUXR|=0x40;
TR1=1; //启动T1
ET1=0;
// ET2=0;
ES=1;
EA=1;
}
/*************************************************************
**************************************************************/
void delay_us(uint dat)
{
do
dat--;
while(dat);
}
/************************************************************
*************************************************************/
void delay_ms(uint dat)
{
do
{
delay_us(2000);
dat--;
}
while(dat);
}
/*************************************************************
充电控制
**************************************************************/
void charge(void)
{
if((DC42==1)&&(DC34==0)