课程设计课程名称单片机课程设计题目名称电话键盘及拨号的模拟学生学院材料与能源学院专业班级热能与动力工程(制冷方向)1001学号3110007126学生姓名陈光谋指导教师王桂棠日21月06年2013.目录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.实验要求:设计一个单片机监控的电话拨号键盘,将电话键盘中拨出的某一电话号码,显示在LCD显示屏上。电话键盘共有12个键,除了“0”~“9”10个数字键外,还有“*”键用于实现退格功能,即清除输入的号码;“#”键用于清除显示屏上所有的数字显示。还要求每按下一个键要发出声响,以表示按下该键。2.仿真实现说明:本实验在Proteus下按设计要求用P1口扩展了12个键盘,其中每个键盘所代表的含义已在Proteus下用文本注出。在LCD显示中,第一行为设计者名,第二行开始显示所拨的电话号码,最多为16位(因为LCD第二行功能显示16个字符)。2、系统设计方案2.1硬件介绍1.1AT89C51简介AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。1.2管脚说明:各引脚功能说明如下,引脚图AT89C51为1如图引脚图1AT89C51图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”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(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)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89C51特殊功能(第二功能)使用,如表1所示。表1AT89C51引脚号第二功能P3.0RX(串行输入P3.1TX(串行输出P3.2INT(外部中P3.3INT(外部中P3.4T(定时外部输入P3.5T(定时外部输P3.6WR(外部数据存储器写选通)P3.7RD(外部数据存储器读选通)RST:复位输入,晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST脚输出69个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。否则,ALE将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。3、流程图开始系统初始键盘扫N设置按键是否按下?Y读取按Y1按键是否超位?N显示3、电路设计3.1电路原理图3.2程序清单#includereg51.h//包含单片机寄存器的头文件#includeintrins.h//包含_nop_()函数定义的头文件typedefunsignedintuint;typedefunsignedcharuchar;uchartemp;ucharkey=16;sbitrs=P2^0;//LCD1602数据/命令选择sbitrw=P2^1;//LCD1602读/写选择sbitlcden=P2^2;//LCD1602使能端ucharidatatable[18]=ATD+86;ucharidatatable[18];//LCD1602所显示的号码缓存数组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;i125;i++){{;}}}}/*检查LCD忙状态*//*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据*/bitbusy()//LCD忙检测{bitresult;rs=0;rw=1;lcden=1;delayNOP();result=(bit)(P0&Ox80);lcden=0;returnresult;}*//*写指令数据到LCD*/高脉冲,D0-D7=指令码。/*RS=L,RW=L,E=voidlcd_com(ucharcmd){while(busy());rs=0;rw=0;lcden=0;_nop_();P0=cmd;delayNOP();lcden=1;delayNOP();lcden=0;}voidlcd_pos(ucharpos){//设定显示位置lcd_com(pos|0x80);//数据指针=80+地址变量}/*写显示数据到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(ox38);delay(5);lcd_com(ox38);delay(5);lcd_com(0x0c);//显示开,关光标delay(5);lcd_com(0x38);//移动光标delay(5);lcd_com(0x38);//清除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);//设置显示位置为第二行第1个字符}}}voidkeyscan(){temp=0;P1=0xf0;//高四位输入行为高电平列为低电平delay(50);temp=P1;temp=temp&0xf0;//屏蔽低四位temp=~((temp4)0|xF0);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;elsekey=16;P1=0x0f;//低四位输入列为高电平行为低电平delay(50);temp=P1;//读P1口temp=temp&0xf0;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;elsekey=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(oxo1);//清除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;//开启定时器1SM0=0;//串口方式0SM1=1;//串口方式1REN=1;//允许接收ES=1;//是开启串口中断EA=1;//开中断总开关}voidmain(){uart_int();lcd_int();while(num=17){keyscan();//键盘扫描display();//LCD显示if(receive[4]=='E')//判断PC机返回的是否是ATD+ERR{P2=0xfe;while(tab[a]!='\0