|
#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[]={
" 歡迎使用 "
" "
" 輸入號(hào)碼 "
" "
};
uchar code pic2[]={
" "
" "
"短信發(fā)送中......"
" "
};
uchar code pic3[]={
" "
" "
" 短信已發(fā)送 "
" "
};
uchar data pic6[]={
" "
" "
"choose "
" "
};
uchar code pic5[]={
" "
" "
" 無(wú)可用柜 "
" "
};
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)//確認(rèn)鍵
{
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; // 定時(shí)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; //進(jìn)入中斷50ms +1次
TIME_BASE++;
if(TIME_BASE == 20) // 20ms * 50ms = 剛好等于1000ms 也就是1秒
{
TIME_BASE = 0;
MACT_ENDB++; // 一秒加一次
if(MACT_ENDB==20) // 等于剛好20秒時(shí)間到
{
MACT_ENDB = 0;
Rece_Errp=1;
}
}
}
void SerialInti()//初始化程序(必須使用,否則無(wú)法收發(fā))
{
TMOD=0x20;//定時(shí)器1操作模式2:8位自動(dòng)重載定時(shí)器
#ifdef FOSC_12M //在這里根據(jù)晶振大小設(shè)置不同的數(shù)值初始化串口
TH1=0xf3;//裝入初值,波特率2400
TL1=0xf3;
#else
TH1=0xfd;//裝入初值,波特率9600
TL1=0xfd;
#endif //end of SOC_12M
TR1=1;//打開(kāi)定時(shí)器
SM0=0;//設(shè)置串行通訊工作模式,(10為一部發(fā)送,波特率可變,由定時(shí)器1的溢出率控制)
SM1=1;//(同上)在此模式下,定時(shí)器溢出一次就發(fā)送一個(gè)位的數(shù)據(jù)
REN=1;//串行接收允許位(要先設(shè)置sm0sm1再開(kāi)串行允許)
EA=1;//開(kāi)總中斷
ES=1;//開(kāi)串行口中斷
}
/*串行通訊中斷,收發(fā)完成將進(jìn)入該中斷*/
void Serial_interrupt() interrupt 4
{
unsigned char temp_rec_data_uart0;
temp_rec_data_uart0 = SBUF;//讀取接收數(shù)據(jù)
RI=0;//接收中斷信號(hào)清零,表示將繼續(xù)接收
Buffer_Uart0_Rec[rec_data_len_uart]=temp_rec_data_uart0; //接收數(shù)據(jù)
rec_data_len_uart++;
if(rec_data_len_uart>24)
{
rec_data_len_uart=0; //從頭開(kāi)始接收數(shù)據(jù)
}
}
void Uart1Send(uchar c)
{
SBUF=c;
while(!TI);//等待發(fā)送完成信號(hào)(TI=1)出現(xiàn)
TI=0;
}
//串行口連續(xù)發(fā)送char型數(shù)組,遇到終止號(hào)/0將停止
void Uart1Sends(uchar *str)
{
while(*str!='\0')
{
SBUF=*str;
while(!TI);//等待發(fā)送完成信號(hào)(TI=1)出現(xiàn)
TI=0;
str++;
}
}
//延時(shí)函數(shù)大概是1s鐘,不過(guò)延時(shí)大的話(huà)不準(zhǔn)...
void DelaySec(int sec)
{
uint i , j= 0;
for(i=0; i<sec; i++)
{
for(j=0; j<65535; j++)
{
}
}
}
void initinal(void) //LCD字庫(kù)初始化程序
{
delay(40); //大于40MS的延時(shí)程序
PSB=1; //設(shè)置為8BIT并口工作模式
delay(1); //延時(shí)
RES=0; //復(fù)位
delay(1); //延時(shí)
RES=1; //復(fù)位置高
delay(10);
TransferData(0x30,0); //Extended Function Set :8BIT設(shè)置,RE=0: basic instruction set, G=0 :graphic display OFF
delay(100); //大于100uS的延時(shí)程序
TransferData(0x30,0); //Function Set
delay(37); ////大于37uS的延時(shí)程序
TransferData(0x08,0); //Display on Control
delay(100); //大于100uS的延時(shí)程序
TransferData(0x10,0); //Cursor Display Control光標(biāo)設(shè)置
delay(100); //大于100uS的延時(shí)程序
TransferData(0x0C,0); //Display Control,D=1,顯示開(kāi)
delay(100); //大于100uS的延時(shí)程序
TransferData(0x01,0); //Display Clear
delay(10); //大于10mS的延時(shí)程序
TransferData(0x06,0); //Enry Mode Set,光標(biāo)從右向左加1位移動(dòng)
delay(100); //大于100uS的延時(shí)程序
}
/********************************************************************
* 名稱(chēng) : Main()
* 功能 : 主函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void main(void)
{
while(1)
{
start: initinal(); //調(diào)用LCD字庫(kù)初始化程序
delay(20); //大于100uS的延時(shí)程序
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(); //開(kāi)始定時(shí)
do
{
for(m=17;m<=27;m++) //號(hào)碼清除
{
pic1[m]=' ';
}
memset(cabinet,0,sizeof(cabinet));//初始化可用柜號(hào)數(shù)組
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) //存確認(rèn)
{
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);//延時(shí)大約3秒 1
Uart1Sends("AT+CMGF=1\r\n");
DelaySec(1);//延時(shí)3秒
Uart1Sends("AT+CSCA?\r\n");
DelaySec(1);//延時(shí)3秒
Uart1Sends("AT+CSMP=17,167,0,241\r\n");
DelaySec(1);//延時(shí)3秒
Uart1Sends(PH);//號(hào)碼
DelaySec(1);//延時(shí)3秒
Uart1Sends(contain);//修改短信內(nèi)容,短信內(nèi)容可為英文和數(shù)字
Uart1Send(0x1a);
DelaySec(1);//延時(shí)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;
}
}
}
/********************************************************************
* 名稱(chēng) : 信息發(fā)送
* 功能 :
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
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++;
}
}
/********************************************************************
* 名稱(chēng) : 信息判斷
* 功能 :
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void TransferData(char data1,bit DI) //傳送數(shù)據(jù)或者命令,當(dāng)DI=0是,傳送命令,當(dāng)DI=1,傳送數(shù)據(jù).
{
WRD=0;
RS=DI;
delay(1);
P2=data1;
E=1;
delay(1);
E=0;
}
/********************************************************************
* 名稱(chēng) : 延時(shí)
* 功能 :
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void delayms(unsigned int n) //延時(shí)10×n毫秒程序
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<2000;j++);
}
/********************************************************************
* 名稱(chēng) : 延時(shí)
* 功能 :
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void delay(unsigned int m) //延時(shí)程序
{
unsigned int i,j;
for(i=0;i<m;i++)
for(j=0;j<10;j++);
}
void KeyScan() //鍵盤(pán)掃描程序,key應(yīng)定義為全局無(wú)符號(hào)字符型
{
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;
}
}
|
|