|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2011-10-5 19:57:07
|
显示全部楼层
程序如下,望大侠们看看,问题在哪!!!
#include <reg52.h>
#include <intrins.h>
/*************宏定义专区***************/
#define uint unsigned int
#define uchar unsigned char
#define BLKN 4 //列锁存器数(=LED显示字数*2)
#define TOTAL 8 //待显示字个数,本例共14个
sbit led1=P3^4;
sbit led2=P3^5;
/*************变量定义专区*************/
sbit G=P1^7; //P1.7为154译码器显示允许控制信号端口,0时输出,1时输出全为高阻态.
sbit CLK=P1^6; //P1.6为595输出锁存器时钟信号端,1时输出数据,从1到0时锁存输出数据.(引脚12)
sbit SCLR=P1^5; //P1.5为595移位寄存器清零口,平时为1,为0时,输出全为0.(引脚10)
sbit dat_595=P2^0; //595的14脚
sbit Shift_Clk=P2^1; //595的11脚
//unsigned char dispram[(BLKN/2)*32]={0}; //显示区缓存,1字共1*32单元
unsigned char dispram[32]={0}; //显示区缓存,1字共1*32单元
sbit START_TC=P3^2; //启动TC35i的控制端
uchar code AT[]={"AT"}; //AT指令
uchar code AT_Code[]="OK"; //GSM响应
uchar idata RsBuf[100]; //接收缓存区
uchar code Receive_Mode[]={"AT+CNMI=2,1,0,0,0"}; //短信接收模式设置:通过SIM卡接收
uchar code Read_Message[]={"AT+CMGR=1"}; //读第一条短信
uchar code Delete_All_Message[]={"AT+CMGD=1,4"}; //删除所有短信
void main(void)
{
start_TC35i();
UART_Init(); // 串口初始化
Send_Set(); //GSM设置
while(1)
{
led1=0;
Read(); //读短信
}
}
start_TC35i() //启动TC35i的函数
{
START_TC=0;//启动TC35i
delay_Xms(1500);// 时间必须大于100ms
START_TC=1;//完成启动 //此后一直保持高电平
}
delay_Xms(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=113;j>0;j--);
}
/**************************************************
*函数名称:SendByte_595
*输入:byte
*输出:无
*功能说明:595发送一个字节的数据
***************************************************/
void SendByte_595(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
byte >>=1;
dat_595=CY;
Shift_Clk=1;
_nop_();
_nop_();
Shift_Clk=0;
}
}
/**************************************************
*函数名称:display_up
*输入:word1,word2 待显示的汉字
*输出:无
*功能说明:点阵显示:上滚形式
***************************************************/
void display_up(uchar word1)
{
register unsigned char i,j,k,l,q;
//unsigned char j,k,q;
//for (i=0; i<word1; i++)
// {
if(word1==0)
{ i=0;
for (j=0; j<2; j++)
for (k=0; k<8; k++)
{
for (l=0; l<16; l++)
{
for(q=0;q<1;q++)
{
dispram[l*2+q*32] = dispram[l*2+q*32]<<1 | dispram[l*2+1+q*32]>>7;
if(q==1-1) dispram[l*2+1+q*32] = dispram[l*2+1+q*32]<<1 | Bmp1[l*2+j]>>(7-k);
else dispram[l*2+1+q*32] = dispram[l*2+1+q*32]<<1 | dispram[l*2+(q+1)*32]>>7;
}
}
delay_ms(100);
}
}
}
/****************************************
*函数名称:delay_ms
*输入:uint ms延时时间 ,注意ms的数据类型
*输出:无
*功能说明:毫秒级延时
*****************************************/
void delay_ms(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
/********************************
*函数名称:UART_Send_Byte
*输入:byte
*输出:无
*功能说明:发送单字节
*********************************/
void UART_Send_Byte(uchar ch)
{
SBUF=ch; //缓冲区装载要发送的字节数据
while(TI==0); //等待发送完毕,TI标志位会置1
TI=0; //清零发送完成标志位
}
/*************************************
*函数名称:UART_Send_Str
*输入:*str 字符串指针,len字符串长度
*输出:无
*功能说明:发送字符串
**************************************/
void UART_Send_Str(uchar * str,uint len)
{
while(len--)
{
UART_Send_Byte(*str++);
}
}
/*************************************
*函数名称:UART_Init
*输入:无
*输出:无
*功能说明:串口初始化
**************************************/
void UART_Init(void)
{
SCON=0X50;
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;//波特率为9600
TR1=1;
ES=1;
//定时器初始化,主要用于LED显示
TMOD = 0x01; //定时器T0工作方式1:16位方式
TR0 = 1; //启动定时器T0
TH0 = (65536-1000)/256; //设定显示屏刷新率每秒62.5帧(16毫秒每帧)
TL0 = (65536-1000)%256;
P1 = 0x3f; //CONIO端口初值
ET0=1; //允许定时器T0中断
EA=1;
}
/*************************************
*函数名称:ClrRsBuf
*输入:uchar * str uint len
*输出:无
*功能说明:清除接受指令缓存区
**************************************/
void ClrRsBuf(uchar * str,uint len)
{
uchar i;
for(i=0;i<len;i++)
str=0;
}
/*************************************
*函数名称:GSM_OK
*输入:无
*输出:1:返回OK;0:不返回OK
*功能说明:判断是否返回OK
**************************************/
uchar GSM_OK(void)
{
uchar i;
for(i=0; i<sizeof(RsBuf); i++)
{
if(RsBuf == 'O' && RsBuf[i+1]== 'K')
{
return 1;
}
}
return 0;
}
/***********************************************************
*函数名称:CheckAtc_Message
*输入:无
*输出:1:收到信息;0:没收到信息
*功能说明:判断是否返回"+CMTI: "SM", 41",若返回,则收到短信
**************************************************************/
uchar CheckAtc_Message(void)
{
uchar j;
for(j=0;j<sizeof(RsBuf);j++)
{
if((RsBuf[j]==0x53)&&(RsBuf[j+1]==0x4D)) //0X53 'S' 4D 'M'
return 1;
}
return 0;
}
/***********************************************************
*函数名称:GSM_Read_Message
*输入:无
*输出:1:收到佛;2:收到科;0:没有收到“佛”或“科”
*功能说明:判断读到的短信
**************************************************************/
uchar GSM_Read_Message(void)
{
uchar j;
for(j=0;j<sizeof(RsBuf);j++)
{
if((RsBuf[j]==0x34)&&(RsBuf[j+1]==0x46)&&(RsBuf[j+2]==0x35)&&(RsBuf[j+3 ]==0x42)) //收到佛(4F5B)字
return 1;
else if((RsBuf[j]==0x37)&&(RsBuf[j+1]==0x39)&&(RsBuf[j+2]==0x44)&&(RsBuf[j+3]==0x31)) //收到科(79D1)字
return 2;
}
return 0;
}
/*********************************************************************
*函数名称:Read_One_Message
*输入:无
*输出: 0,1,2
*功能说明:返回读到短信内容所指标志,如收到“佛”返回1,收到“科”返回2
************************************************************************/
uchar Read_One_Message(void)
{
ES=0;
UART_Send_Str(Read_Message,sizeof(Read_Message)-1); //发送AT+CMGR=1读第一条短信
UART_Send_Byte(0x0d);
ES=1;
delay_ms(1000); //GSM反应速度较慢,等待它反应,具体时间待定
return GSM_Read_Message();
}
/***********************************************************
*函数名称:Read
*输入:无
*输出:无
*功能说明:读一条短信完整过程
**************************************************************/
void Read(void)
{ led2=0;
if(CheckAtc_Message()) //收到短信
{
led2=1;
delay_ms(100);
if(Read_One_Message()==1) //收到“佛”
{
display_up(0);
display_up(1); //点阵显示“佛山
// Send_Set(); //重新设置
}
else if(Read_One_Message()==2) //收到“科
{
display_up(2); //点阵显示“科学
display_up(3);
Send_Set(); //重新设置
}
}
}
/**************************************************
*函数名称:GSM_AT
*输入:无
*输出:1:返回OK,连接成功;0:不返回OK,连接不成功
*功能说明:发AT指令,返回OK证明已连接
***************************************************/
uchar GSM_AT(void)
{
ES=0;
ClrRsBuf(RsBuf,sizeof(RsBuf)); //////////////////清空缓冲区
UART_Send_Str(AT,2);
UART_Send_Byte(0x0d);
ES=1;
delay_ms(1000); //GSM反应速度较慢,等待它反应,具体时间待定
return GSM_OK();
}
/**************************************************
*函数名称:GSM_Receive_Mode
*输入:无
*输出:1:返回OK,设置成功;0:不返回OK,设置不成功
*功能说明:设置接收短信模式:通过SIM卡接收
***************************************************/
uchar GSM_Receive_Mode(void)
{
ES=0;
UART_Send_Str(Receive_Mode,17);
UART_Send_Byte(0x0d);
ES=1;
delay_ms(1000); //GSM反应速度较慢,等待它反应,具体时间待定
return GSM_OK();
}
/**************************************************
*函数名称:Delete_Message
*输入:无
*输出:1:返回OK,设置成功;0:不返回OK,设置不成功
*功能说明:删除SMI卡内所有短信
***************************************************/
uchar Delete_Message(void)
{
ES=0;
UART_Send_Str(Delete_All_Message,sizeof(Delete_All_Message)-1);
UART_Send_Byte(0x0d);
ES=1;
delay_ms(1000); //GSM反应速度较慢,等待它反应,具体时间待定
return GSM_OK();
}
/**************************************************
*函数名称:Send_Set
*输入:无
*输出:无
*功能说明:设置GSM
***************************************************/
void Send_Set(void)
{
if(GSM_AT()) //发AT指令,返回OK证明已连接
{
if(Delete_Message()) //删除SMI卡内所有短信
{
if(GSM_Receive_Mode()) //设置接收短信模式,返回OK,设置成功
{
}
}
}
}
/**************************************************
*函数名称:GSM_UART
*输入:无
*输出:无
*功能说明:串口接收中断
***************************************************/
void GSM_UART(void) interrupt 2
{
static uchar k=0;
if(RI==1) //检测接收完成标志位置1
{
RI=0; //清零接收完成标志位
RsBuf[k++] = SBUF; //读取接收到的数据
if(k >= (sizeof(RsBuf)))
{
k=0;
}
}
}
/**********显示屏扫描(定时器T0中断)函数**********/
void leddisplay(void) interrupt 1 using 1
{
register unsigned char m, n=BLKN;
TH0 = (65536-1000)/256; //设定显示屏刷新率每秒62.5帧(16毫秒每帧)
TL0 = (65536-1000)%256;
m = P1; //读取当前显示的行号
m = ++m & 0x0f; //行号加1,屏蔽高4位
SCLR=1;
do {
n--;
SendByte_595(dispram[m*2+(n/2)*30 + n]); //送显示数据
}
while (n); //完成一行数据的发送 //完成一行数据的发送
G = 1; //消隐(关闭显示)
P1 &= 0xf0; //行号端口清0
CLK=1; //显示数据打入输出锁存器
P1 |= m; //写入行号
CLK=0; //锁存显示数据
G = 0; //打开显示
// P1 |= m; //写入行号
}
我测试led显示的部分没有问题,但是我发送短信的时候就进不了if(CheckAtc_Message())//收到短信,大侠们啊,我急啊!!! |
|