#include <reg52.h>
#include <string.h>
#include <stdio.h>
#include <intrins.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define FOSC_110592M
unsigned int rec_data_len_uart=0;
unsigned char idata Buffer_Uart0_Rec[25]={0};
unsigned char TIME_BASE;
unsigned char MACT_ENDB;
unsigned char Rece_Errp=0;
uchar PH[30]={"AT+CMGS=\"15051861770\"\r\n"};
uchar code IC_DAT[];
uchar pic1[];
uchar code pic2[];
uchar key;
uchar MEDAT[16][4];
uchar cabinet[16];
uchar contain[4];
uchar data pic6[];
bit key_flag=0;
bit cabinet_1=0;
bit cabinet_2=0;
bit cabinet_3=0;
bit cabinet_4=0;
bit cabinet_5=0;
bit cabinet_6=0;
bit cabinet_7=0;
bit cabinet_8=0;
bit cabinet_9=0;
bit cabinet_10=0;
bit cabinet_11=0;
bit cabinet_12=0;
bit cabinet_13=0;
bit cabinet_14=0;
bit cabinet_15=0;
bit cabinet_16=0;
sbit RS = P0^7;
sbit WRD = P0^6;
sbit E = P0^5;
sbit PSB = P0^4;
sbit RES = P0^3;
void TransferData(char data1,bit DI);
void display(void);
void display_grapic(void);
void delayms(uint n);
void DisplayLine(uchar line1,uchar line2);
void DisplayGraphic(uchar code *adder);
void initinal(void);
void DelaySec(int sec);
void delay(uint m);
void lcd_mesg(uchar *adder1);
void KeyScan();
sbit key1=P3^5;
sbit key2=P3^4;
uchar code IC_DAT[]={
" " //0X80
" Express " //0X90
" Intelligent " //0X88
" Cabinet " //0X98
};
uchar pic1[]={
" 欢迎使用 "
" "
" 输入号码 "
" "
};
uchar code pic2[]={
" "
" "
"短信发送中......"
" "
};
uchar code pic3[]={
" "
" "
" 短信已发送 "
" "
};
uchar data pic6[]={
" "
" "
"choose "
" "
};
uchar code pic5[]={
" "
" "
" 无可用柜 "
" "
};
uchar code pic7[]={
" "
" "
" Error "
" "
};
CheckCabinet()
{
char n=1;
if(cabinet_1==0)
{
cabinet[n]=1;
n++;
}
if(cabinet_2==0)
{
cabinet[n]=2;
n++;
}
if(cabinet_3==0)
{
cabinet[n]=3;
n++;
}
if(cabinet_4==0)
{
cabinet[n]=4;
n++;
}
if(cabinet_5==0)
{
cabinet[n]=5;
n++;
}
if(cabinet_6==0)
{
cabinet[n]=6;
n++;
}
if(cabinet_7==0)
{
cabinet[n]=7;
n++;
}
if(cabinet_8==0)
{
cabinet[n]=8;
n++;
}
if(cabinet_9==0)
{
cabinet[n]=9;
n++;
}
if(cabinet_10==0)
{
cabinet_10=10;
n++;
}
if(cabinet_11==0)
{
cabinet[n]=11;
n++;
}
if(cabinet_12==0)
{
cabinet[n]=12;
n++;
}
if(cabinet_13==0)
{
cabinet[n]=13;
n++;
}
if(cabinet_14==0)
{
cabinet[n]=14;
n++;
}
if(cabinet_15==0)
{
cabinet[n]=15;
n++;
}
if(cabinet_16==0)
{
cabinet[n]=16;
}
if(cabinet_1&&cabinet_2&&cabinet_3&&cabinet_4&&cabinet_5&&cabinet_6&&cabinet_7&&cabinet_8&&cabinet_9&&cabinet_10&&cabinet_11&&cabinet_12&&cabinet_13&&cabinet_14&&cabinet_15&&cabinet_16==1)
{
initinal();
lcd_mesg(pic5);
DelaySec(2);
return(n);
}
return(n);
}
char ChooseCabinet()
{
char i;
char m;
char k;
cch: initinal();
delay(20);
i=0;
lcd_mesg(pic6);
delayms(10);
ccheck: do
{
KeyScan();
}
while(key_flag==0);
key_flag=0;
if(key==10)//确认键
{
if(i==1)
{
for(m=0;m<=15;m++)
{ if(pic6[39]-'0'==cabinet[m])
return(m+1);
}
lcd_mesg(pic7);
DelaySec(2);
goto cch;
}
else if(i==2)
{
k=(pic6[39]-'0')*10+(pic6[40]-'0');
for(m=0;m<=15;m++)
{
if(k==cabinet[m])
return(m+1);
}
lcd_mesg(pic7);
DelaySec(2);
goto cch;
}
else
{
lcd_mesg(pic7);
DelaySec(2);
goto cch;
}
}
else if(key==11)//退格键
{
--i;
pic6[39+i]=' ';
initinal();
delayms(2);
lcd_mesg(pic6);
delayms(20);
goto ccheck;
}
else
{
pic6[39]=key+'0';//存输入
i++;
goto ccheck;
lcd_mesg(pic6);
}
delay(5);
}
void GetMEDAT(char v)
{
srand(TH0);
MEDAT[v][0]=rand()%9+0;
MEDAT[v][1]=rand()%9+0;
MEDAT[v][2]=rand()%9+0;
MEDAT[v][3]=rand()%9+0;
}
void SystemInit(void)
{
TMOD=0x01;
TH0=(65536-45872)/256; // 定时50ms //晶振:11.0592MHZ
TL0=(65536-45872)%256;
ET0=1;
TR0=1;
EA=1;
}
void Timer0_IRQ(void) interrupt 1
{
TH0=(655365-45872)/256;
TL0=(655365-45872)%256; //进入中断50ms +1次
TIME_BASE++;
if(TIME_BASE == 20) // 20ms * 50ms = 刚好等于1000ms 也就是1秒
{
TIME_BASE = 0;
MACT_ENDB++; // 一秒加一次
if(MACT_ENDB==20) // 等于刚好20秒时间到
{
MACT_ENDB = 0;
Rece_Errp=1;
}
}
}
void SerialInti()//初始化程序(必须使用,否则无法收发)
{
TMOD=0x20;//定时器1操作模式2:8位自动重载定时器
#ifdef FOSC_12M //在这里根据晶振大小设置不同的数值初始化串口
TH1=0xf3;//装入初值,波特率2400
TL1=0xf3;
#else
TH1=0xfd;//装入初值,波特率9600
TL1=0xfd;
#endif //end of SOC_12M
TR1=1;//打开定时器
SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)
SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据
REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)
EA=1;//开总中断
ES=1;//开串行口中断
}
/*串行通讯中断,收发完成将进入该中断*/
void Serial_interrupt() interrupt 4
{
unsigned char temp_rec_data_uart0;
temp_rec_data_uart0 = SBUF;//读取接收数据
RI=0;//接收中断信号清零,表示将继续接收
Buffer_Uart0_Rec[rec_data_len_uart]=temp_rec_data_uart0; //接收数据
rec_data_len_uart++;
if(rec_data_len_uart>24)
{
rec_data_len_uart=0; //从头开始接收数据
}
}
void Uart1Send(uchar c)
{
SBUF=c;
while(!TI);//等待发送完成信号(TI=1)出现
TI=0;
}
//串行口连续发送char型数组,遇到终止号/0将停止
void Uart1Sends(uchar *str)
{
while(*str!='\0')
{
SBUF=*str;
while(!TI);//等待发送完成信号(TI=1)出现
TI=0;
str++;
}
}
//延时函数大概是1s钟,不过延时大的话不准...
void DelaySec(int sec)
{
uint i , j= 0;
for(i=0; i<sec; i++)
{
for(j=0; j<65535; j++)
{
}
}
}
void initinal(void) //LCD字库初始化程序
{
delay(40); //大于40MS的延时程序
PSB=1; //设置为8BIT并口工作模式
delay(1); //延时
RES=0; //复位
delay(1); //延时
RES=1; //复位置高
delay(10);
TransferData(0x30,0); //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
delay(100); //大于100uS的延时程序
TransferData(0x30,0); //Function Set
delay(37); ////大于37uS的延时程序
TransferData(0x08,0); //Display on Control
delay(100); //大于100uS的延时程序
TransferData(0x10,0); //Cursor Display Control光标设置
delay(100); //大于100uS的延时程序
TransferData(0x0C,0); //Display Control,D=1,显示开
delay(100); //大于100uS的延时程序
TransferData(0x01,0); //Display Clear
delay(10); //大于10mS的延时程序
TransferData(0x06,0); //Enry Mode Set,光标从右向左加1位移动
delay(100); //大于100uS的延时程序
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main(void)
{
while(1)
{
start: initinal(); //调用LCD字库初始化程序
delay(20); //大于100uS的延时程序
lcd_mesg(IC_DAT); //显示中文汉字
delayms(10);
do
{
KeyScan();
}
while(key_flag==0);
key_flag=0;
if(key==12) //存快递
{
int z=17;
int m;
char v;
SystemInit(); //开始定时
do
{
for(m=17;m<=27;m++) //号码清除
{
pic1[m]=' ';
}
memset(cabinet,0,sizeof(cabinet));//初始化可用柜号数组
if(CheckCabinet()==1)
{
goto start;
}
else
{ v=ChooseCabinet();
initinal();
lcd_mesg(pic1);
ee1: do
{
KeyScan();
}
while(key_flag==0&&Rece_Errp==0);
if(Rece_Errp==1)
goto ee2;
key_flag=0;
if(key==11)//退格键
{
--z;
pic1[z]=' ';
initinal();
delayms(2);
lcd_mesg(pic1);
delayms(20);
goto ee1;
}
else if(key==10) //存确认
{
int i;
for(i=0;i<=10;i++)
PH[i+9]=pic1[i+17];
GetMEDAT(v);
contain[0]=MEDAT[v][0]+'0';
contain[1]=MEDAT[v][0]+'0';
contain[2]=MEDAT[v][0]+'0';
contain[3]=MEDAT[v][0]+'0';
lcd_mesg(pic2);
delayms(200);
SerialInti();
Uart1Sends("AT+CSCS=\"GSM\"\r\n");
DelaySec(1);//延时大约3秒 1
Uart1Sends("AT+CMGF=1\r\n");
DelaySec(1);//延时3秒
Uart1Sends("AT+CSCA?\r\n");
DelaySec(1);//延时3秒
Uart1Sends("AT+CSMP=17,167,0,241\r\n");
DelaySec(1);//延时3秒
Uart1Sends(PH);//号码
DelaySec(1);//延时3秒
Uart1Sends(contain);//修改短信内容,短信内容可为英文和数字
Uart1Send(0x1a);
DelaySec(1);//延时3秒
lcd_mesg(pic3);
DelaySec(2);
}
else {
pic1[z]=key+'0';//存输入
z++;
delay(5);
lcd_mesg(pic1);
delayms(20);
goto ee1;
}
}
}
while(Rece_Errp==1);
ee2: Rece_Errp=0;
goto start;
}
}
}
/********************************************************************
* 名称 : 信息发送
* 功能 :
* 输入 : 无
* 输出 : 无
***********************************************************************/
void lcd_mesg(unsigned char *adder1)
{
unsigned char i;
TransferData(0x80,0); //Set Graphic Display RAM Address
delay(100);
for(i=0;i<32;i++)
{
TransferData(*adder1,1);
adder1++;
}
TransferData(0x90,0); //Set Graphic Display RAM Address
delay(100);
for(i=32;i<64;i++)
{
TransferData(*adder1,1);
adder1++;
}
}
/********************************************************************
* 名称 : 信息判断
* 功能 :
* 输入 : 无
* 输出 : 无
***********************************************************************/
void TransferData(char data1,bit DI) //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.
{
WRD=0;
RS=DI;
delay(1);
P2=data1;
E=1;
delay(1);
E=0;
}
/********************************************************************
* 名称 : 延时
* 功能 :
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delayms(unsigned int n) //延时10×n毫秒程序
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<2000;j++);
}
/********************************************************************
* 名称 : 延时
* 功能 :
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay(unsigned int m) //延时程序
{
unsigned int i,j;
for(i=0;i<m;i++)
for(j=0;j<10;j++);
}
void KeyScan() //键盘扫描程序,key应定义为全局无符号字符型
{
uchar i,temp,temp1=0xfe;
for(i=0;i<4;i++)
{
P1=temp1;
temp=P1&0xf0;
if(temp!=0xf0)
{
delayms(1);
temp=P1&0xf0;
if(temp!=0xf0)
{
while((P1&0xf0)!=0xf0);
switch(temp)
{
case 0xe0:key=4*i+0;break;
case 0xd0:key=4*i+1;break;
case 0xb0:key=4*i+2;break;
case 0x70:key=4*i+3;break;
}
key_flag=1;
break;
}
}
temp1=(temp1<<1)|0x01;
}
}
|