首页 单片机课程实践报告-电话模拟拨号器

单片机课程实践报告-电话模拟拨号器

举报
开通vip

单片机课程实践报告-电话模拟拨号器单片机课程实践报告-电话模拟拨号器 河海大学常州校区 计信学院 单片机课程设计报告 专 业:电子科学与技术 姓 名: 学 号: 课 题:电话模拟拨号器 指导教师: 摘要 1 单片机是一门技术性、应用新很强的学科,而课程设计给了大家一个很好的实践机会。实验“电话模拟拨号器”是以AT89C52单片机为控制核心,使用C程序设计,3*4矩阵控制,包括输入、删除、发送等功能,简单的实现了手机的拨打功能。 关键字:单片机,液晶显示屏,拨号 目录 目标及总体方案 2 1使用的主要组件及特殊零件功能说明...

单片机课程实践报告-电话模拟拨号器
单片机课程实践报告-电话模拟拨号器 河海大学常州校区 计信学院 单片机课程 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 报告 专 业:电子科学与技术 姓 名: 学 号: 课 题:电话模拟拨号器 指导教师: 摘要 1 单片机是一门技术性、应用新很强的学科,而课程设计给了大家一个很好的实践机会。实验“电话模拟拨号器”是以AT89C52单片机为控制核心,使用C程序设计,3*4矩阵控制,包括输入、删除、发送等功能,简单的实现了手机的拨打功能。 关键字:单片机,液晶显示屏,拨号 目录 目标及总体 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 2 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口输出地址3 的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口作为AT89C51的一些特殊功能口,管脚 备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(计时器0外部输入) P3.5 T1(计时器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端保4 持高电平时,此间内部程序存储器。在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位(最高位)(也是busy flag) 15 BLA 背光电源正极 16 BLK 背光 电源负极 2流程图说明 5 3电路图 实验仿真图 实验结果及讨论 6 1实际电路设计及程序设计 程序设计 #include #include typedef unsigned int uint; typedef unsigned char uchar; uchar temp; uchar key=16; sbit rs=P2^6; sbit rw=P2^5; sbit lcden=P2^7; uchar idata table[18]="ATD+86"; uchar idata tab[18]; uchar idata table_int[18]="ATD+86"; uchar idata receive[7]; uchar idata erro[7]="erronum"; uchar num=6,a=0,b=0; //b接收,a发送,num表示table[]第几位 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; /* 延时子程序 */ void delay(uchar x) { uchar i; while(x--) { for(i = 0; i< 125; i++) { {;} } } } /*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */ bit busy() { bit result; rs = 0; 7 rw = 1; lcden = 1; delayNOP(); result = (bit)(P0 & 0x80); lcden = 0; return result; } /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ void lcd_com(uchar cmd) { while(busy()); rs = 0; rw = 0; lcden = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); lcden = 1; delayNOP(); lcden = 0; } void lcd_pos(uchar pos) { //设定显示位置 lcd_com(pos | 0x80); } /*写显示数据到LCD RS=H,RW=L,E=高脉冲,D0-D7=数据. */ void lcd_dat(uchar dat) { while(busy()); rs = 1; rw = 0; lcden = 0; P0 = dat; delayNOP(); lcden = 1; delayNOP(); 8 lcden = 0; } /* LCD初始化设定 */ void lcd_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显示 */ void display() { uchar a=0; lcd_pos(0); delay(30); while(table[a]!='\0') //判断下一位是否为空 { lcd_dat(table[a]); a++; if(a==16) { lcd_pos(0x40); } } } void keyscan() { 9 temp = 0; P1=0xf0; //高四位输入 行为高电平 列为低电平 delay(50); temp=P1; temp=temp&0xf0; //屏蔽低四位 temp=~((temp>>4)|0xF0); if(temp==1) // p1.4 被拉低 key=0; else if(temp==2) // p1.5 被拉低 key=1; else if(temp==4) // p1.6 被拉低 key=2; else if(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; else if(temp==4) // p1.2 被拉低 key=key+4; else if(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) 10 { 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的所有显示内容 } 11 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++; } } } } /* 串口初始化 */ void uart_int() { TMOD=0x20; //工作方式2,为常数自动重新装入的8位定时器 TH1=0xf3; TL1=0xf3; TR1=1; SM0=0; SM1=1; //串口方式1 REN=1; //允许接收 ES=1; EA=1; } void main() { uart_int(); lcd_init(); while(num<=17) 12 { 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'; } else if(receive[4]=='O') { P2=0xfd; receive[4]='\0'; } if((receive[5]='K')||(receive[6]=='R')) { b=0; receive[5]='\0'; receive[6]='\0'; } } } /* 串口接收 */ void ser() interrupt 4 { if(RI==1) { receive[b]=SBUF; b++; RI=0; } 13 } 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作为显示器。 ? 自我体会: 通过这次课程设计,我学会了使用Keil C51软件设计一些程序,并且锻炼了我的动手操 作能力,使得我对单片机知识了解的更加透彻。 参考文献 【1】 涂时亮等:单片微机控制技术,复旦大学出版社,1994年11月 【2】 夏宽理等:程序设计,复旦大学出版社,2000年7月 【3】 谭浩强:C程序设计(第二版),清华大学出版社,1999年12月 14 【4】 尹勇等:uVision2单片机应用程序开发指南,科学出版社,2005年2月附录: KEILC51使用方法 15
本文档为【单片机课程实践报告-电话模拟拨号器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_597436
暂无简介~
格式:doc
大小:126KB
软件:Word
页数:21
分类:生活休闲
上传时间:2017-09-01
浏览量:199