单片机简易电子表方案与仿真.docx
- 文档编号:29400390
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:15
- 大小:290.76KB
单片机简易电子表方案与仿真.docx
《单片机简易电子表方案与仿真.docx》由会员分享,可在线阅读,更多相关《单片机简易电子表方案与仿真.docx(15页珍藏版)》请在冰豆网上搜索。
单片机简易电子表方案与仿真
智能仪器及应用实验报告
项目名称:
基于51单片机的简易电子表设计与仿真
专业名称:
测控技术与仪器
班级:
测控0901班
学生姓名:
指导教师:
一、任务要求
使用KeiluVision编程软件以及ISIS7Professional仿真软件制作一个简易电子表,要求具备电子表基本功能<时间显示、时间调整等)。
二、总体设计方案
利用AT89C51作为控制以及1602LCD作为显示,通过6个按键实现出入时间设置状态、出入闹铃设置状态、小时位调整、分钟位调整、开关闹铃等功能。
系统的流程图如下:
图1-1系统仿真流程图
三、系统硬件
1、AT89C51引脚功能说明:
AT89C51芯片如图1-2所示
图1-2AT89C51
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口将输出电流 P3口也可作为AT89C51的一些特殊功能口,如下所示: 口管脚备选功能 P3.0RXD<串行输入口) P3.1TXD<串行输出口) P3.2 <外部中断0) P3.3 <外部中断1) P3.4T0<记时器0外部输入) P3.5T1<记时器1外部输入) P3.6 <外部数据存储器写选通) P3.7 <外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。 RST: 复位输入。 当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE: 当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。 在FLASH编程期间,此引脚用于输入编程脉冲。 在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。 因此它可用作对外部输出的脉冲或用于定时目的。 然而要注意的是: 每当用作外部数据存储器时,将跳过一个ALE脉冲。 如想禁止ALE的输出可在SFR8EH地址上置0。 此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。 另外,该引脚被略微拉高。 如果微处理器在外部执行状态ALE禁止,置位无效。 : 外部程序存储器的选通信号。 在由外部程序存储器取指期间,每个机器周期两次 有效。 但在访问外部数据存储器时,这两次有效的 信号将不出现。 : 当 保持低电平时,则在此期间外部程序存储器<0000H-FFFFH),不管是否有内部程序存储器。 注意加密方式1时, 将内部锁定为RESET;当 端保持高电平时,此间内部程序存储器。 在FLASH编程期间,此引脚也用于施加12V编程电源 XTAL1: 反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2: 来自反向振荡器的输出。 振荡器特性: XTAL1和XTAL2分别为反向放大器的输入和输出。 该反向放大器可以配置为片内振荡器。 石晶振荡和陶瓷振荡均可采用。 如采用外部时钟源驱动器件,XTAL2应不接。 有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 2、1602LCD液晶显示引脚功能说明: 1602LCD显示用来显示当前时钟与闹钟时间。 当运行仿真软件时,可以清楚的看到时间。 1602LCD芯片如图1-3所示 图1-31602LCD 编号 符号 引脚说明 编号 符号 引脚说明 1 VSS 电源地 8 D1 数据 2 VDD 电源正极 9 D2 数据 3 VL 液晶显示偏压 10 D3 数据 4 RS 数据/命令选择 11 D4 数据 5 R/W 读/写选择 12 D5 数据 6 E 使能信号 13 D6 数据 7 D0 数据 14 D7 数据 四、系统软件设计 设计仿真图: 图1-4电子表仿真图 设计程序: #include #defineDataPortP0 sbitLATCH1=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~9 UnsignedcharcodeWeiMa[]={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。 j<8。 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。 i<200。 i++> { DelayUs2x(200>。 SPK=! SPK。 Display(0,8>。 //调用数码管扫描 } SPK=0。 //防止一直给喇叭通电造成损坏 for(i=0。 i<200。 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。 //重新赋值2ms TL0=(65536-50000>%256。 //Display(0,8>。 //调用数码管扫描 num++。 if(num==20>//大致100ms { miao++。 num=0。 if(miao>=60> { miao=0。 fen++。 } //ReadTimeFlag=1。 //读标志位置1 if(fen>=60> { fen=0。 shi++。 } if(shi>=24> {shi=0。 } } } voiddelay1s(> { unsignedinti。 for(i=0。 i<1000。 i++>。 } voidDelayUs2x(unsignedchart> { while(--t>。 } voidDelayMs(unsignedchart> { while(t--> { //大致延时1mS DelayUs2x(245>。 DelayUs2x(245>。 } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 简易 电子表 方案 仿真
![提示](https://static.bdocx.com/images/bang_tan.gif)