单片机课程实践报告电话模拟拨号器.docx
- 文档编号:4661701
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:20
- 大小:106.58KB
单片机课程实践报告电话模拟拨号器.docx
《单片机课程实践报告电话模拟拨号器.docx》由会员分享,可在线阅读,更多相关《单片机课程实践报告电话模拟拨号器.docx(20页珍藏版)》请在冰点文库上搜索。
单片机课程实践报告电话模拟拨号器
河海大学常州校区
计信学院
单片机课程设计报告
专业:
电子科学与技术
姓名:
霍宇彤
学号:
0962910216
课题:
电话模拟拨号器
指导教师:
陆晓春
摘要
单片机是一门技术性、应用新很强的学科,而课程设计给了大家一个很好的实践机会。
实验“电话模拟拨号器”是以AT89C52单片机为控制核心,使用C程序设计,3*4矩阵控制,包括输入、删除、发送等功能,简单的实现了手机的拨打功能。
关键字:
单片机,液晶显示屏,拨号
目录
目标及总体方案
1使用的主要组件及特殊零件功能说明……………………………………1
2流程图说明…………………………………………………………………3
3电路图………………………………………………………………………3
实验结果及讨论
1程序设计……………………………………………………………………4
2实验结果展示………………………………………………………………11
结论
1本课程设计的特点…………………………………………………………11
2评估结果……………………………………………………………………12
3改善建议既自我体会………………………………………………………12
参考文献………………………………………………………12
附录……………………………………………………………12
目标及总体方案
1使用的主要组件及特殊零件功能说明
单片机89C52
管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口作为AT89C51的一些特殊功能口,管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(计时器0外部输入)
P3.5T1(计时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
3×4矩阵键盘
实现1、2、3、4、5、6、7、8、9、0、SET、CLEAR的功能
1602字符液晶
1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线
VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:
引脚
符号
功能说明
1
VSS
一般接地
2
VDD
接电源(+5V)
3
V0
液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4
RS
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5
R/W
R/W为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
6
E
E(或EN)端为使能(enable)端,下降沿使能。
7
DB0
低4位三态、双向数据总线0位(最低位)
8
DB1
低4位三态、双向数据总线1位
9
DB2
低4位三态、双向数据总线2位
10
DB3
低4位三态、双向数据总线3位
11
DB4
高4位三态、双向数据总线4位
12
DB5
高4位三态、双向数据总线5位
13
DB6
高4位三态、双向数据总线6位
14
DB7
高4位三态、双向数据总线7位(最高位)(也是busyflag)
15
BLA
背光电源正极
16
BLK
背光电源负极
2流程图说明
3电路图
实验仿真图
实验结果及讨论
1实际电路设计及程序设计
程序设计
#include
#include
typedefunsignedintuint;
typedefunsignedcharuchar;
uchartemp;
ucharkey=16;
sbitrs=P2^6;
sbitrw=P2^5;
sbitlcden=P2^7;
ucharidatatable[18]="ATD+86";
ucharidatatab[18];
ucharidatatable_int[18]="ATD+86";
ucharidatareceive[7];
ucharidataerro[7]="erronum";
ucharnum=6,a=0,b=0;//b接收,a发送,num表示table[]第几位
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
/*延时子程序*/
voiddelay(ucharx)
{
uchari;
while(x--)
{
for(i=0;i<125;i++)
{
{;}
}
}
}
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据*/
bitbusy()
{
bitresult;
rs=0;
rw=1;
lcden=1;
delayNOP();
result=(bit)(P0&0x80);
lcden=0;
returnresult;
}
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/
voidlcd_com(ucharcmd)
{
while(busy());
rs=0;
rw=0;
lcden=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
lcden=1;
delayNOP();
lcden=0;
}
voidlcd_pos(ucharpos)
{//设定显示位置
lcd_com(pos|0x80);
}
/*写显示数据到LCDRS=H,RW=L,E=高脉冲,D0-D7=数据.*/
voidlcd_dat(uchardat)
{
while(busy());
rs=1;
rw=0;
lcden=0;
P0=dat;
delayNOP();
lcden=1;
delayNOP();
lcden=0;
}
/*LCD初始化设定*/
voidlcd_init()
{
delay(15);
lcd_com(0x38);//16*2显示,5*7点阵,8位数据
delay(5);
lcd_com(0x38);
delay(5);
lcd_com(0x38);
delay(5);
lcd_com(0x0c);//显示开,关光标
delay(5);
lcd_com(0x06);//移动光标
delay(5);
lcd_com(0x01);//清除LCD的显示内容
delay(5);
}
/*LCD显示*/
voiddisplay()
{
uchara=0;
lcd_pos(0);
delay(30);
while(table[a]!
='\0')//判断下一位是否为空
{
lcd_dat(table[a]);
a++;
if(a==16)
{
lcd_pos(0x40);
}
}
}
voidkeyscan()
{
temp=0;
P1=0xf0;//高四位输入行为高电平列为低电平
delay(50);
temp=P1;
temp=temp&0xf0;//屏蔽低四位
temp=~((temp>>4)|0xF0);
if(temp==1)//p1.4被拉低
key=0;
elseif(temp==2)//p1.5被拉低
key=1;
elseif(temp==4)//p1.6被拉低
key=2;
elseif(temp==8)//p1.7被拉低
key=3;
else
key=16;
P1=0x0f;//低四位输入列为高电平行为低电平
delay(50);
temp=P1;//读P1口
temp=temp&0x0f;
temp=~(temp|0xf0);
if(temp==2)//p1.1被拉低
key=key+0;
elseif(temp==4)//p1.2被拉低
key=key+4;
elseif(temp==8)//p1.3被拉低
key=key+8;
else
key=16;
P1=0x0f;
temp=P1;
if(key==0)
{
table[num]='1';
num++;
}
if(key==1)
{
table[num]='2';
num++;
}
if(key==2)
{
table[num]='3';
num++;
}
if(key==3)
{
table[num]='4';
num++;
}
if(key==4)
{
table[num]='5';
num++;
}
if(key==5)
{
table[num]='6';
num++;
}
if(key==6)
{
table[num]='7';
num++;
}
if(key==7)
{
table[num]='8';
num++;
}
if(key==8)
{
table[num]='9';
num++;
}
if(key==9)
{
table[num]='0';
num++;
}
if(key==10)
{
table[--num]='\0';//删除上一位
lcd_com(0x01);//清除LCD的所有显示内容
}
if(key==11)
{
while(table[a]!
='\0')
{
if(num==17)
{
tab[a]=SBUF=table[a];//显示输入数据
while(!
TI);//等特数据传送
TI=0;//清除数据传送标志
a++;
}
else
{//发送下一位字符
tab[a]=SBUF=erro[a];//显示输入数据
while(!
TI);//等特数据传送
TI=0;//清除数据传送标志
a++;
}
}
}
}
/*串口初始化*/
voiduart_int()
{
TMOD=0x20;//工作方式2,为常数自动重新装入的8位定时器
TH1=0xf3;
TL1=0xf3;
TR1=1;
SM0=0;
SM1=1;//串口方式1
REN=1;//允许接收
ES=1;
EA=1;
}
voidmain()
{
uart_int();
lcd_init();
while(num<=17)
{
keyscan();//键盘扫描
display();//LCD显示
if(receive[4]=='E')
{
P2=0xfe;
while(tab[a]!
='\0')
{
SBUF=tab[a];//串口发送
while(!
TI);//等特数据传送(TI发送中断标志)
TI=0;//清除数据传送标志
a++;//下一个字符
}
a=0;
receive[4]='\0';
}
elseif(receive[4]=='O')
{
P2=0xfd;
receive[4]='\0';
}
if((receive[5]='K')||(receive[6]=='R'))
{
b=0;
receive[5]='\0';
receive[6]='\0';
}
}
}
/*串口接收*/
voidser()interrupt4
{
if(RI==1)
{
receive[b]=SBUF;
b++;
RI=0;
}
}
2实际的结果显示
1)当拨打电话时,电话号码显示在动态LCD上
2)当按下SET键时,将“ATD+电话号码”(例如ATD+8612345678900)通过串口发送到PC上,并可通过调试助手观察。
3)当PC通过串口返回“ATD+OK”时,表示拨号成功,单片机接受到该指令后点亮一个LED。
4)当PC通过串口返回“ATD+ERR”时,表示拨号失败,单片机接受到该指令后点亮另一个LED,并且重拨,将电话号码再一次发送到pc机上。
5)当输入的号码不够11位时,输出的是erronum,当按键超过11个数时,自动清空。
结论
1本课程设计的特点:
让同学们在理论学习的基础上,通过完成一小系统的设计,使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行某些传感器应用系统的开发设计工作打下一定的基础。
2评估结果
本实验基本功能已经实现,包括10个数字的输入,还有删除键,发送键的使用。
3改善建议及自我体会:
●改善建议:
应该认真研究以下功能为提高部分并实现:
1)实现简易电话号码簿,最多可预存9个电话号码。
2)进入电话号码簿后可浏览、修改电话号码,按Enter键可自动拨出此号码。
3)当接受到“ATD+ERR”时可自动重拨,最多拨打3次。
4)使用LCD1602作为显示器。
●自我体会:
通过这次课程设计,我学会了使用KeilC51软件设计一些程序,并且锻炼了我的动手操作能力,使得我对单片机知识了解的更加透彻。
参考文献
【1】涂时亮等:
单片微机控制技术,复旦大学出版社,1994年11月
【2】夏宽理等:
程序设计,复旦大学出版社,2000年7月
【3】谭浩强:
C程序设计(第二版),清华大学出版社,1999年12月
【4】尹勇等:
uVision2单片机应用程序开发指南,科学出版社,2005年2月
附录:
KEILC51使用方法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程 实践 报告 电话 模拟 拨号