电话键盘及拨号的模拟_第1页
电话键盘及拨号的模拟_第2页
电话键盘及拨号的模拟_第3页
电话键盘及拨号的模拟_第4页
电话键盘及拨号的模拟_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课 程 设 计 课程名称 单片机课程设计 题目名称 电话键盘及拨号的模拟 学生学院 材料与能源学院 专业班级 热能与动力工程(制冷方向)1001 学 号 3110007126 学生姓名 陈光谋 指导教师 王桂棠 2013 年 06 月 21 日 目录1、 概述 1.1 课程项目名称 1.2 设计任务及要求2、 系统设计方案 2.1 硬件介绍3、 电路设计 3.1 电路原理图3.2 程序清单4、 Proteus软件仿真 4.1系统仿真电路图4.2 仿真结果分析5、 课程设计心得体会6、 参考文献 1、概述1.1课程设计项目名称电话拨号键LCD显示1.2设计任务及要求1实验要求:设计一个单片机监控

2、的电话拨号键盘,将电话键盘中拨出的某一电话号码,显示在LCD显示屏上。电话键盘共有12个键,除了“0” “9”10个数字键外,还有“*”键用于实现退格功能,即清除输入的号码;“#”键用于清除显示屏上所有的数字显示。还要求每按下一个键要发出声响,以表示按下该键。2仿真实现说明: 本实验在Proteus下按设计要求用P1口扩展了12个键盘,其中每个键盘所代表的含义已在Proteus下用文本注出。在LCD显示中,第一行为设计者名,第二行开始显示所拨的电话号码,最多为16位(因为LCD第二行功能显示16个字符)。 2、系统设计方案2.1 硬件介绍1.1 AT89C51简介AT89C51是一种带4K字节

3、FLASH存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。1.2 管脚说明如图1为AT89C51引脚图,各引脚功能说明如下:

4、图1 AT89C51引脚图VCC: 电源GND: 地P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。 P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内

5、部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX)P2口:P2口是一个具有内部上拉电阻的8位双向I/O 口,P2 输出缓冲器能驱动4个TTL逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如MOVX RI)访问

6、外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O 口,对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89C51特殊功能(第二功能)使用,如表1所示。表1 AT89C51引脚号第二功能P3.0 RXD(串行输入)P3.1 TXD(串行输出)P3.2 INT0(外部中断0)P3.3 INT0(外部中断0)P3.4 T0(定时器0外部输入)P3.5 T1(定时器1外部输

7、入)P3.6WR(外部数据存储器写选通)P3.7 RD(外部数据存储器读选通)RST:复位输入,晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出69个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时

8、,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE 仅在执行MOVX 或MOVC指令时有效。否则,ALE将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。3、流程图开始系统初始化键盘扫描设置按键是否按下? N读取按键 Y按键是否超过10位? Y显示 N 3、电路设计3.1 电路原理图3.2程序清单#include<reg51.h> / 包含单片机寄存器的头文件#include<intrins.h>/包含_nop_()函数定义的头文件typedef u

9、nsigned int uint;typedef unsigned char uchar;uchar temp;uchar key=16;sbit rs=P20; /LCD1602数据/命令选择sbit rw=P21; /LCD1602读/写选择sbit lcden=P22; /LCD1602使能端uchar idata table18="ATD+86"uchar idata table18; /LCD1602所显示的号码缓存数组uchar idata table_int18="ATD+86"uchar idata receive7;uchar idat

10、a erro7="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()/LCD忙检测 bit result; rs=0; rw=1; l

11、cden=1; delayNOP(); result=(bit)(P0&Ox80); 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_(); P0=cmd; delayNOP(); lcden=1; delayNOP(); lcden=0;void lcd_pos(uchar pos) /设定显示位置 lcd_com(pos|0x80); /数据指针=80+地址变量/*写显示

12、数据到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(); lcden=0;/*LCD初始化设定*/void lcd_init() delay(15); lcd_com(0x38);/16*2显示,5*7点阵,8位数据 delay(5);/延时 lcd_com(ox38); delay(5); lcd_com(ox38); delay(5); lcd_com(0x0c); /显示开,关光标

13、 delay(5); lcd_com(0x38); /移动光标 delay(5); lcd_com(0x38); /清除LCD的显示内容 delay(5);/* LCD 显示 */void display() uchar a=0; lcd_pos(0); delay(30); while(tablea!='0'); /判断下一位是否为空 lcd_dat(tablea); /显示字符 a+; if(a=16) lcd_pos(0x40); /设置显示位置为第二行第1个字符 void keyscan() temp=0; P1=0xf0; /高四位输入 行为高电平 列为低电平 del

14、ay(50); temp=P1; temp=temp&0xf0; /屏蔽低四位 temp=(temp>>4)0|xF0); 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&0xf0; temp=(temp|0xf0);

15、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) /以下是判断按键,显示相应的号码 tablenum='1' num+; if(key=1) tablenum='2' num+; if(key=2) tablenum='3' num+; if(key=3) tablenum='4' num+; i

16、f(key=4) tablenum='5' num+; if(key=5) tablenum='6' num+; if(key=6) tablenum='7' num+; if(key=7) tablenum='8' num+; if(key=8) tablenum='9' num+; if(key=9) tablenum='0' num+; if(key=10) table-num='0' /删除上一位 lcd_com(oxo1); /清除LCD的所有显示内容 if(key=11)

17、 while(tablea!='0') if(num=17) taba=SBUF=tablea; /显示输入数据 while(!TI); /等特数据传送 TI=0; /清除数据传送标志 a+; else /发送下一位字符 taba=SBUF=erroa; /显示输入数据 while(!TI); /等特数据传送 TI=0; /清除数据传送标志 a+; /* 串口初始化 */void uart_int() TMOD=0x20; /工作方式2,为常数自动重新装入的8位定时器 TH1=0xf3; /装定时器初值 TL1=0xf3; TR1=1; /开启定时器1 SM0=0; /串口方式

18、0 SM1=1; /串口方式1 REN=1; /允许接收 ES=1; /是开启串口中断 EA=1; /开中断总开关void main() uart_int(); lcd_int(); while(num<=17) keyscan(); /键盘扫描 display(); /LCD显示 if(receive4='E') /判断PC机返回的是否是ATD+ERR P2=0xfe; while(taba!='0') SBUF=taba; /串口发送 while(!TI); /等特数据传送(TI发送中断标志) TI=0; /清除数据传送标志 a+; /下一个字符 a=0; receive4='0' / PC机返回ATD+OK else if(receive4='0') /判断PC机返回的是否是ATD+OK P2=0xfd; receive4='0' if(receive5='K'|(receive6='R') /判断PC机返回的是否是AT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论