单片机原理课程设计GSM手机设计.docx
《单片机原理课程设计GSM手机设计.docx》由会员分享,可在线阅读,更多相关《单片机原理课程设计GSM手机设计.docx(25页珍藏版)》请在冰豆网上搜索。
单片机原理课程设计GSM手机设计
河南科技大学
课程设计报告
课程名称__单片机原理课程设计_
题目名称_GSM手机设计
学生学院___信息工程学院_____
专业班级___自动化122
学号
学生姓名
指导教师
2015年7月5日
课程设计任务书
(指导教师填写)
课程设计名称单片机原理学生姓名专业班级
设计题目GSM手机设计
一、课程设计目的
1.培养学生文献检索的能力,如何利用Internet检索需要的文献资料。
2.培养学生综合分析问题、发现问题和解决问题的能力。
3.培养学生综合运用知识的能力和工程设计的能力。
4.培养学生理论联系实际的能力。
5.提高学生课程设计报告撰写水平。
二、设计内容、技术条件和要求
1设计内容
GSM手机设计主要功能是用单片机实现手机的通讯功能,要求能打电话、发短信,显示来电信息及通讯录,能显示信号标识、信号强弱、电池信息等。
(1)选用LCD屏幕显示各种相关信息;
(2)设计4X4按键,实现键盘输入号码和拔号挂断等功能;
2设计要求
•设计单片机最小系统(包括复位按钮、晶振电路等);
•绘制实现本设计内容的硬件电路(原理图),系统的组成框图。
•相应的控制状态表;
•编写本课程设计内容的软件设计(包含程序流程图和对程序注释)。
3总体设计思想(供参考)
•利用矩阵键盘实现输入;
•采用LCD12864作为显示屏;
•利用串口实现与GSM模块的连接。
4设计参考
GSM手机设计主要包含单片机主控电路、显示电路、键盘电路、GSM通讯模块电路等组成。
5知识点准备:
•+5V电源原理及设计;
•GSM手机工作原理及设计;
•单片机复位电路工作原理及设计(元件选择的依据);
•单片机晶振电路工作原理及设计(元件选择的依据);
•LCD显示特性、驱动设计及应用;
•单片机引脚资源、引脚分配等;
•单片机汇编语言及程序设计(中断、延时子程序的设计)。
三时间进度安排
按教学计划规定,单片机原理课程设计总学时为1周,其进度安排和时间大致分配如下:
1.十七周周一至周二查阅资料、进行软、硬件初步设计;
2.十七周周三至周四上机调试,发现问题,解决问题,完善课程设计;
3.十五周周五 总结设计过程,编写课程设计报告书。
四主要参考文献
1、何立民.单片机高级教程.第1版.北京:
北京航空航天大学出版社,2001
2、徐爱钧KEILCxV7.0单片机高级语言编程与uVision2应用实践,北京,电子工业出版社,2004
3、李全利、仲伟峰、徐军,单片机原理及应用,北京:
清华大学出版社,2006
五、设计分组及选题安排
自动化122班所有学生及自动化123班部分学生。
指导教师签字:
2015年06月25日
单片机课程设计报告
一、设计项目简介
随着科技的飞速发展和人民生活水平的不断提高,手机的普及率越来越高,更新也越来越快,价格也越来越便宜。
因为手机工作的无线网络覆盖范围广,在信息传递方面性能稳定、可靠,所以把手机作为信息传递的载体,与单片机结合起来构成应用系统有着强大的生命力和广阔的应用空间,特别是在远程数据传输、远程监控等领域更是受到电子设计应用工程师的关注。
GSM系统是目前基于时分多址技术的移动通信体制中最成熟、最完善、应用最广的一种系统。
GSM的短消息业务,由于其方便、快捷、廉价等特点而受到用户的青睐,它作为GSM网络的一种基本业务,已得到越来越多的系统运营商和系统开发商的重视。
本系统主要研究如何运用GSM手机模块在计算机终端实现短信息的收发。
设计中采用STC89C52单片机和Siemens公司的GSM模块TC35实现具有短信手法功能和通话功能的GSMModem原型。
通过RS232串口将该Modem与PC机或程序控制STC89C52单片机相连,并在PC机上开发前台软件,实现中英文短信点对点的双向收发和来电呼叫,从而实现与用户手机或GSM模块的远程通信功能。
二、总体设计
本次设计的整体方案以单片机STC89C52为控制器,利用串口通信与GSM模块进行通讯,通过AT指令发送指令实现打电话,挂电话,以及短信的接收和发送。
通过AT指令能够读取网络信号的强弱等各种信息。
通过4*4矩阵键盘实现按键的输入,通过LCD12864实现屏幕的显示。
三、硬件设计
1.矩阵键盘
本系统中的4*4矩阵式键盘结构简单,按键数较少,采用非编码式键盘,当有键按下时,由单片机通过程序扫描确定键值,并将获得的键值通过LED数码管显示出来,4*4矩阵式键盘结构及键值分布如下图:
2.LED数码管
LED(发光二级管)显示器件是计算机控制控制系统中的廉价输出设备,它由多个发光二极管组成,能显示许多种字符。
由于制作材料不同,LED可以发出红、黄、篮、紫等各种单色光,一个发光二级管正常发光时的电流大约为10mA,本系统中使用的是七段共阴极LED数码管。
图4、5所示为七段共阴极LED显示器件的结构及外形图。
七段LED显示器件就是将7个发光二极管按一定的方式组合在一起,如图1所示。
图1
本次设计51开发板原理图如图2
图2
3.液晶屏12864
带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
图3
4.GSM模块
TC35/TC35I模块是一款双频900/1800MHZ高度集成的GSM模块。
如图4
图4
TC35/TC35I模块技术特点 :
低功耗,支持数据、语音、短消息和传真。
SIM应用工具包 ,AT命令集控制 , R&TTE认证、GCF认证 ,SMS:
MT/MO/CB/PDU模式 。
音频:
最高速率,升级最高速率和半速率 。
支持电压范围:
3.3至4.4V。
电流消耗:
3.0 mA(睡眠)10.0 mA(闲置)。
模块工作需要5V2A以上的电源供电。
四、软件设计
1.矩阵键盘
按键采用线反转法先把列线置成低电平,行线置成输入状态,读行线;再把行线置成低电平,列线输入状态,读列线。
当有键按下时,由两次所读状态即可确定所按键的位置,不需扫描,键盘响应速度大大加快。
2.12864液晶显示
1.lcd初始化;对屏进行设置;
1)关屏;2)设置起始X地址3)设置起始行地址;4)设置起始Y地址;5)开屏;6)清屏。
2.显示内容;
1)设置起始坐标(x,y);2)发送显示内容。
根据12864的技术手册和操作时序,12864的初始化流程图图11如下:
图11初始化流程图
图12汉字显示流程图
3.GSM模块
GSM模块的使用时通过AT指令进行操作的,使用简单方便。
发短信:
首先串口发送字符串“AT+CMGF=1\r”给GSM模块,设置短信为TXT模式;然后发送“AT+CMGS=15737937092\r”,设置收信方的手机号码;接着将待发送短信的内容发给GSM模块;最后发送十六进制的0x1A(回车)确认发送。
打电话:
(1)串口发送ATD***; (***为被叫电话号码,后面有分号);
(2)发送“发送命令”指令“0x1A”(回车)确认发送;
(3)被拨电话将会收到来电号码,产生振铃信号(移动台没有振铃声音),被叫可以挂机或接通;
(4)串口发送ATH ,再发送“发送命令”指令“0x1A”(回车)确认发送,主叫GSM进行挂机操作。
图13短信发送流程图
五、程序清单
//DELAY.C延时子函数
#include"delay.h"//delay.h头文件
voiddelayMS(unsignedintms)
{
unsignedinti,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
//KEY.C按键子函数
#definePOINTP1//宏定义POINT为P1,矩阵键盘端
#defineIX0XF0//FINDXPOITANDSETX1111RETY0000
#defineIY0X0F//FINDYPOITANDSETY1111RETX0000
unsignedcharcodePOINTX[]={0XE0,0XD0,0XB0,0X70};//识别X轴的匹配值
unsignedcharcodePOINTY[]={0X0E,0X0D,0X0B,0X07};//识别Y轴的匹配值
unsignedcharKEYSCAN()
{
unsignedinti,X,Y,KEY=0xFF;//无按键时返回0xFF
POINT=IX;//列识别
if(POINT!
=IX)//是否有按键按下
{
delayMS(100);//延时100ms,按键消抖
if(POINT!
=IX)//是否有按键按下
for(i=0;i<4;i++)//识别列,X=i
if(POINT==POINTX[i])
{
X=i;
i=4;//识别完成后,i=4跳出判断
};
}
POINT=IY;//行识别
if(POINT!
=IY)//是否有按键按下
for(i=0;i<4;i++)//识别列,Y=i
{
if(POINT==POINTY[i])
{
Y=i;
i=4;//识别完成后,i=4跳出判断
KEY=X+Y*4;//键值换算
};
}
}
returnKEY;//返回按键值0-15
}
//LCD12864.C
#include"LCD12864.h"
#include"reg52.h"
voiddelay(unsignedchari)//延时
{
for(;i>0;i--);
}
voidwrite_com(unsignedcharcmd)//写指令子函数
{
RS=0;
RW=0;
P0=cmd;
EN=1;
delay
(2);
EN=0;
delay(10);
}
voidwrite_date(unsignedchardate)//写数据子函数
{
RS=1;
RW=0;
P0=date;
EN=1;
delay(5);
EN=0;
delay(20);
}
voidLCD_clear()//清屏子函数
{
unsignedchari,j;
for(i=0;i<8;i++)//128*64逐个置低位
{
write_com(PAG_ADD+i);
write_com(COL_ADD);
for(j=0;j<64;j++)
{
write_date(0x00);//写数据0x00
}
}
}
voidLCD_init()//LCD初始化
{
write_com(LCD_OFF);//关屏幕
write_com(START_LINE);//行起始地址
write_com(PAG_ADD);//页起始地址
write_com(COL_ADD);//列起始地址
write_com(LCD_ON);//LCD开屏
LCD_clear();//LCD清屏
}
voiddisplay_8(unsignedcharpag,unsignedcharcol,unsignedcharm,unsignedcharn,unsignedchartemp[])//显示字符子函数,pag页地址,col字符地址,
//m数组中的第m位,n数组中的第n位,temp【】字符组
{
unsignedcharx,y,p,q;
p=col;//第p个字符的位置
q=col*8;//q转化为初始位置的位地址,字符和位的转换
for(m;m<=n;m++)//判断程序,自动片选
{
if(p<8)//左半屏
{
CS1=1;
CS2=0;
col=p*8;
}
else//右半屏
{
CS1=0;
CS2=1;
col=(p-8)*8;
}
for(x=0;x<2;x++)//显示程序
{
write_com(PAG_ADD+pag+x);
write_com(COL_ADD+col);
for(y=0;y<8;y++)
{
write_date(temp[x*8+m*8*2+y]);//数据写
}
}
p++;
}
}
voiddisplay_16(unsignedcharpag,unsignedcharcol,unsignedcharm,unsignedcharn,unsignedchartemp[])//汉字显示,pag页地址,col字地址,m数组中的第
//m位,n数组中的第n位,temp【】字符组
{
unsignedcharx,y,p,q;
p=col;//第p个字的位置
q=col*16;//q转化为初始位置的位地址,字符和位的转换
for(m;m<=n;m++)//判断程序,自动片选
{
if(p<4)//左半屏
{
CS1=1;
CS2=0;
col=p*16;
}
else//右半屏
{
CS1=0;
CS2=1;
col=(p-4)*16;
}
for(x=0;x<2;x++)
{
write_com(PAG_ADD+pag+x);//换页
write_com(COL_ADD+col);
for(y=0;y<16;y++)
{
write_date(temp[x*16+m*16*2+y]);//数据写
}
}
p++;
}
voiddisplay_tx(unsignedchartemp[])//图片显示子函数128*64
{
unsignedcharx,y,m;
for(m=0;m<8;m=m+2)
for(x=0;x<2;x++)
{
for(y=0;y<128;y++)
{
if(y<64)//片选,左半屏
{
write_com(PAG_ADD+x+m);//页地址
CS1=1;
CS2=0;
write_com(COL_ADD+y);
}
else//有半屏
{
CS1=0;
CS2=1;
write_com(COL_ADD+y-64);
}
write_date(temp[x*128+m*128+y]);//写数据
}
}
}
//串口初始化部分
#include
voiduart_init(void)
{
TMOD=0x20;//定时器/计数器1,工作方式2
TH1=0xfd;//设置波特率为9600
TL1=0xfd;
SCON=0x50;//串行工作方式1,允许串行控制
PCON=0x00;//设置SMOD
IE=0x90;//允许串口进行中断
TI=1;//发送中断标志位
TR1=1;//启动定时器/计数器1
}
//SIM900A.c
#include
#include
#include"uart.h"
#include"Key.h"
#include"lcd12864.h"
#include"zi.h"
ucharTelePhone[12]={'\0'};
ucharMsgstore[12]="\0";
ucharchose_key=0;
staticvoiddelay(unsignedintt)//延时
{
for(;t!
=0;t--);
}
voidClear_Buffer(uchar*buffer)//轻除保存电话号码缓存
{
uchari;
for(i=0;i<12;i++)
{
buffer[i]='\0';
}
}
voidShow_Logo(void)//显示主界面
{
display_tx(tx2);
display_16(6,0,0,1,hz1);
display_16(6,6,4,5,hz1);
}
voidShow_view(charflag)//显示选择菜单界面
{
uchari;
for(i=0;i<2;i++)
{
if(flag==1)
fh_disp_x_y_black(16,16,6,i*16,7+i,hz);
else
fh_disp_x_y(16,16,6,i*16,7+i,hz);
}
for(i=0;i<3;i++)
{
if(flag==2)
fh_disp_x_y_black(16,16,6,80+i*16,9+i,hz);
else
fh_disp_x_y(16,16,6,80+i*16,9+i,hz);
}
}
voidShow_Viewtel(void)//显示电话界面
{
uchari;
for(i=0;i<3;i++)
{
fh_disp_x_y(8,16,6,(i*8),14+i,zf);
}
fh_disp_x_y(8,16,6,(i*8),12,zf);
}
voidShow_Viewmsg(void)//显示短信界面
{
uchari;
for(i=0;i<3;i++)
{
fh_disp_x_y(8,16,6,(i*8),17+i,zf);
}
fh_disp_x_y(8,16,6,(i*8),12,zf);
}
voidShow_Tel(uchar*buff)//LCD屏上显示电话号码
{
uchari;
ucharDisplay_Buffer[12]="\0";//LCD屏显示缓存
for(i=0;i<12;i++)
{
if(*buff=='\0')
{
break;
}
Display_Buffer[i]=buff[i];
}
for(i=0;i<11;i++)
{
if(Display_Buffer[i]!
='\0')
fh_disp_x_y(8,16,6,(i*8+32),Display_Buffer[i]-'0',zf);
else
fh_disp_x_y(8,16,6,(i*8+32),13,zf);
}
}
voidChose_view(void)//选择菜单函数
{
ucharGet_Key;
while
(1)
{
Get_Key=Key();
switch(Get_Key)
{
case'0':
Show_view(0);chose_key=0;break;
case'1':
Show_view
(1);chose_key=1;break;
case'2':
Show_view
(2);chose_key=2;break;
case'E':
if(chose_key)gotopp1;
}
}
pp1:
Clr_Scr();delay(1000);Show_Logo();
}
voidTel_function(void)//打电话功能函数
{
ucharGet_Key;
ucharCounter=0;
Show_Viewtel();
while
(1)
{
Get_Key=Key();
if(Get_Key!
=0xff)
{
if(Get_Key==12)//后退
{
if(Counter>0)
{
Counter--;
TelePhone[Counter]='\0';//修改输入的数
}
}
elseif(Get_Key==14)//电话拨出按键
{
printf("\r\n");//串口显示整齐
printf("ATD%s;\r\n",TelePhone);//往外打电话
delay(900000);
delay(900000);
Counter=0;
}
elseif(Get_Key==15)//电话挂断
{
printf("\r\n");//串口显示整齐
printf("ATH\r\n");
delay(900000);
delay(900000);
Counter=0;
Clear_Buffer(TelePhone);
}
elseif(Get_Key==13)//电话接听键
{
printf("ATA\r\n");//接听电话
}
elseif(Get_Key==11)
{
Clear_Buffer(TelePhone);
break;
}
else
{
//放入缓冲区
if(Counter<12)
TelePhone[Counter++]=Get_Key;//保存按键值
}
}
Show_Tel(TelePhone);//12864显示电话号码
}
}
voidMsg_function(void)//发短信功能函数
{
ucharGet_Key;
ucharflag_tel_msg=0;
ucharCounter=0;
Show_