您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于51单片机的简易电子表设计与仿真
智能仪器及应用实验报告项目名称:基于51单片机的简易电子表设计与仿真专业名称:测控技术与仪器班级:测控0901班学生姓名:指导教师:一、任务要求使用KeiluVision编程软件以及ISIS7Professional仿真软件制作一个简易电子表,要求具备电子表基本功能(时间显示、时间调整等)。二、总体设计方案利用AT89C51作为控制以及1602LCD作为显示,通过6个按键实现出入时间设置状态、出入闹铃设置状态、小时位调整、分钟位调整、开关闹铃等功能。系统的流程图如下:图1-1系统仿真流程图三、系统硬件1、AT89C51引脚功能说明:AT89C51芯片如图1-2所示图1-2AT89C51VCC:供电电压。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.2INT0(外部中断0)P3.3INT1(外部中断1)P3.4T0(记时器0外部输入)P3.5T1(记时器1外部输入)P3.6WR(外部数据存储器写选通)P3.7RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次PSEN有效。但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。EA:当EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。振荡器特性:XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。2、1602LCD液晶显示引脚功能说明:1602LCD显示用来显示当前时钟与闹钟时间。当运行仿真软件时,可以清楚的看到时间。1602LCD芯片如图1-3所示图1-31602LCD编号符号引脚说明编号符号引脚说明1VSS电源地8D1数据2VDD电源正极9D2数据3VL液晶显示偏压10D3数据4RS数据/命令选择11D4数据5R/W读/写选择12D5数据6E使能信号13D6数据7D0数据14D7数据四、系统软件设计设计仿真图:图1-4电子表仿真图设计程序:#includereg52.h#defineDataPortP0sbitLATCH1=P2^6;//定义锁存使能端口段锁存sbitLATCH2=P2^7;//位锁存sbitKeyPort1=P3^4;//小时+1按钮sbitKeyPort2=P3^5;//分钟+1按钮sbitKeyPort3=P3^2;//定时开关sbitKeyPort4=P3^3;//定时设定sbitSPK=P1^2;//定义喇叭端口unsignedcharcodeDuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//显示段码值0~9UnsignedcharcodeWeiMa[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//分别对应相应的数码管点亮,即位码unsignedcharTempData[8];//存储显示值的全局变量voidDelayUs2x(unsignedchart);//us级延时函数声明voidDelayMs(unsignedchart);//ms级延时voidDisplay(unsignedcharFirstBit,unsignedcharNum);//数码管显示函数unsignedcharshi;//小时unsignedcharfen;//分钟unsignedcharmiao;//秒unsignedchardingshi;//设定小时unsignedchardingfen;//设定分钟unsignedcharquxiao;//取消定时voidInit_Timer0(void);//定时器初始化voiddelay1s();//消抖延时voidDelayUs2x(unsignedchart);//函数声明voidDelayMs(unsignedchart);voidmain(void){unsignedchardisplaynum=0,i,j;Init_Timer0();//初始化for(j=0;j8;j++)//清屏TempData[j]=0xff;while(1)//主循环{if(!KeyPort3)//判断是时间界面还是设定闹钟时间{delay1s();if(!KeyPort3){displaynum++;if(displaynum==2){displaynum=0;}}}if(!KeyPort4)//判断是否开启闹钟{delay1s();if(!KeyPort4){quxiao++;}if(quxiao=2){quxiao=0;P1=0xff;}}if(quxiao==1){P1=0xfe;}//P1.1灯亮起为开启闹钟否则为关闭闹钟else{P1=0xff;}if(displaynum==0)//时间显示界面{if(!KeyPort1)//按键扫描设定小时{delay1s();if(!KeyPort1){while(!KeyPort1);shi++;}}if(!KeyPort2)//按键扫描设定分钟{delay1s();if(!KeyPort2){while(!KeyPort2);fen++;}}TempData[7]=DuanMa[shi/10];//时TempData[6]=DuanMa[shi%10];TempData[5]=0xbf;//加入-TempData[4]=DuanMa[fen/10];//分TempData[3]=DuanMa[fen%10];TempData[2]=0xbf;TempData[1]=DuanMa[miao/10];//秒TempData[0]=DuanMa[miao%10];Display(0,8);//调用数码管扫描}elseif(displaynum==1)//闹钟显示界面{if(!KeyPort1)//按键扫描设置闹钟小时{delay1s();if(!KeyPort1){while(!KeyPort1);dingshi++;if(dingshi=24){dingshi=0;}}}if(!KeyPort2)//按键扫描设定闹钟分钟{delay1s();if(!KeyPort2){while(!KeyPort2);dingfen++;if(dingfen=60){dingfen=0;}}}TempData[7]=0xff;TempData[6]=DuanMa[dingshi/10];TempData[5]=DuanMa[dingshi%10];TempData[4]=0xbf;TempData[3]=0xbf;TempData[2]=DuanMa[dingfen/10];TempData[1]=DuanMa[dingfen%10];TempData[0]=0xff;Display(0,8);//调用数码管扫描}if((shi==dingshi)&&(fen==dingfen)&&quxiao)//闹钟滴答函数{if(!KeyPort4){quxiao=0;}for(i=0;i200;i++){DelayUs2x(200);SPK=!SPK;Display(0,8);//调用数码管扫描}SPK=0;//防止一直给喇叭通电造成损坏for(i=0;i200;i++){DelayMs(1);Display(0,8);//调用数码管扫描}}}}voidDisplay(unsignedcharFirstBit,unsignedcharNum){staticunsignedchari=0;DataPort=0xff;//清空数据,防止有交替重影LATCH1=1;//段锁存LATCH1=0;DataPort=WeiMa[i+FirstBit];//取位码LATCH2=1;//位锁存LATCH2=0;DataPort=TempData[i];//取显示数据,段码LATCH1=1;//段锁存LATCH1=0;i++;if(i==Num)i=0;}voidInit_Timer0(void){TMOD|=0x01;//使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响//TH0=0x00;//给定初值//TL0=0x00;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开}voidTimer0_isr(void)interrupt1{staticunsignedintnum;TF0=0;TH0=(65536-50000)/256;//重新赋值2msTL0=(65536-50000)%256;//Display(0,8);//调用数码管扫描num++;if(num==20)//大致100ms{miao++;num=0;if(miao=60){miao=0;fen++;}//ReadTimeFlag=1;//读标志位置1if(fen=60){fen=0;shi++;}if(shi=24){shi=0;}}}voiddelay1s(){unsignedinti;for(i=0;i1000;i++);}voidDelayUs2x(uns
本文标题:基于51单片机的简易电子表设计与仿真
链接地址:https://www.777doc.com/doc-5699892 .html