51单片机秒表计时(protues)
51单片机实验 秒表设计
实验报告一、实验名称10秒计时的秒表设计二、实验内容精确到0.1秒的秒表三、相关模块led数码管、usb、独立键盘四、实验代码#include "reg52.h"typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit k1=P3^1;sbit k2=P3^0;sbit k3=P3^2;sbit k4=P3^3;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};u16 s,sec;unsigned int i;unsigned int j;unsigned int a,b,c,d;u8 mb[2];void Timer0Init(){TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1msTL0=0X18;TR0=0;//打开定时器}void delay(u16 n){while(n--);}void DigDisplay1(u16 i){switch(i){case(0):LSA=0;LSB=0;LSC=0; break;case(1):LSA=1;LSB=0;LSC=0; break;case(2):LSA=0;LSB=1;LSC=0; break;case(3):LSA=1;LSB=1;LSC=0; break;case(4):LSA=0;LSB=0;LSC=1; break;case(5):LSA=1;LSB=0;LSC=1; break;case(6):LSA=0;LSB=1;LSC=1; break;case(7):LSA=1;LSB=1;LSC=1; break;}if (i==1){P0=smgduan[mb[i]]+0x80;//发送段码}else{P0=smgduan[mb[i]];}delay(1); //间隔一段时间扫描P0=0x00;//消隐}void DigDisplay2(u16 i){i=i+3;switch(i){case(0):LSA=0;LSB=0;LSC=0; break;case(1):LSA=1;LSB=0;LSC=0; break;case(2):LSA=0;LSB=1;LSC=0; break;case(3):LSA=1;LSB=1;LSC=0; break;case(4):LSA=0;LSB=0;LSC=1; break;case(5):LSA=1;LSB=0;LSC=1; break;case(6):LSA=0;LSB=1;LSC=1; break;case(7):LSA=1;LSB=1;LSC=1; break;}if (i==4){P0=smgduan[a]+0x80;}else{P0=smgduan[b];}delay(1);P0=0x00;}void DigDisplay3(u16 i){i=i+6;switch(i){case(0):LSA=0;LSB=0;LSC=0; break;case(1):LSA=1;LSB=0;LSC=0; break;case(2):LSA=0;LSB=1;LSC=0; break;case(3):LSA=1;LSB=1;LSC=0; break;case(4):LSA=0;LSB=0;LSC=1; break;case(5):LSA=1;LSB=0;LSC=1; break;case(6):LSA=0;LSB=1;LSC=1; break;case(7):LSA=1;LSB=1;LSC=1; break;}if (i==7){P0=smgduan[c]+0x80;}else{P0=smgduan[d];}delay(1);P0=0x00;}void key1(){delay(10);if(k1==0){TR0=!TR0;while(!k1);}}void key2(){delay(10);if(k2==0){s=0;sec=0;while(!k2);}}void key3(){delay(10);if(k3==0){if (j==0) j=1;else j=0;if (j==1){a=mb[1];b=mb[0];}if (j==0){c=mb[1];d=mb[0];}while(!k3);}}void key4(){delay(10);if(k4==0){s=0;sec=0;a=0;b=0;c=0;d=0;while(!k2);}}void main(){Timer0Init();i=0;j=0;while(1){delay(10);key1();if(TF0==1){TF0=0;TH0=0XFC; //给定时器赋初值,定时1msTL0=0X18;s++;}if(s==60){s=0;sec++;if(sec==100)sec=100;}key2();mb[0]=sec%10;mb[1]=(sec/10)%10;key3();DigDisplay1(i);DigDisplay2(i);DigDisplay3(i);i++;i=i%2;key4();}}五、实验效果K1作用:启动、开始或暂停计时K2作用:计数位清零K3作用:记录当前时间并显示K4作用:清零所有的数码管六、实验遇到的问题经过前几次的实验,0到10秒的计数已经不成问题,本次实验的难点主要在几个按键的功能实现上。
51单片机数字时钟-proteus仿真原理图及keil C51编译的C51程序
51单片机数字时钟-proteus仿真原理图及keil C51编译的C51程序该实验采用proteus 7.4 sp3进行的仿真,仿真原理图如下图所示,该实验采用定时器0的工作方式1定时500ms,等待20次定时1s进行时钟计数。
通过定时器1的工作方式1定时500ms,用来调整数码管闪烁的时间。
K1是用来选中时分秒,按一下选中时,再按一下选中分,再按一下选中秒,再按一下退出选中状态。
K2按一下数加一,K3按一下数减一。
在调整时间时,时钟停走。
/******************************************************************* **** 程序名; 时钟实验* 功能: 数码管通过动态扫描显示时间,时间可设定,调整时间时时钟不走.* 编程者: ZPZ* 编程时间:2009/8/9******************************************************************** **/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit _led=P2^7;sbit key1=P2^0;sbit key2=P2^1;sbit key3=P2^2;uchar num=0,temp=0,count=0; uchar aa;uchar hour,min,sec;uchar codetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void delay(uint z);void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar aa);void read_key();void led();void time_change();/****************** 主函数 *******************/void main(){P2=0xff;hour=12;min=0;sec=0;TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;aa=0xff;while(1){time_change();display(table[hour/10],table[hour%10],table[min/10], table[min%10],table[sec/10],table[sec%10],0xff);}}。
51单片机电子秒表设计(Proteus)
51单片机电子秒表设计(Proteus)单片机硬件设计结课论文简易秒表设计专业:计算机科学与技术学生姓名:学号: 1307064248完成时间:2020年12月28日目录一、简述 (3)二、主要工具 (2)三、线路连接图(ISIS 7 Professional环境) (2)四、实现细则 (2)显示电路 (2)定时计数器 (3)五、程序 (4)六、模拟运行截图 (16)七、心得体会 (16)一、简述此秒表主要实现的功能是利用单片机内部定时计数器实现计时,然后通过LED组件显示出来。
因为这次设计时使用的是并排的6个数字显示LED,所以在计时时精确到10ms,最大即时59分59秒99。
实现过程中的主要部分包含显示和定时。
因为该LED与单片机相接的引脚只有14个,其中8个接在P0口上实现字形的显示,剩下的6个接在P2口用于选择6个数字型LED中的一个显示,所以每次只能显示一个数字。
要实现多个数字的显示需要快速显示每个LED,利用人的视觉差来实现多个数字同时显示。
计时只用到定时计数器T1(因为需要配合中断优先级,故没有使用T0,下文会详细讲到)。
另外还用到了两个按键,和两个LED灯(红、绿)。
按键用于控制开始计时和暂停、重置,LED 灯用于指示当前工作状态。
二、主要工具Keil uVision3,ISIS 7 Professional,AT89C51基础组件(试验箱)。
三、线路连接图(ISIS 7 Professional环境)四、实现细则显示电路数字型LED的实现原理为每个单元(共6个单元)含8个发光独立的LED灯,其中7个构成“8”字形,剩下的一个为小数点。
6个单元的每个相同位置引脚并联起来,最后通过8根线连接到单片机的P0口。
因此如果不把另外6根线连接上,每次通过P0口输出值时6个显示单元都会显示相同的图形(数字)。
LED单元组中另外6根引脚连接到单片机上,实现“按位显示”,并且是低电平选择,例如“111101”对应显示的是从右到左的第5个LED 单元。
51单片机电子秒表设计
实验二电子秒表设计(键盘状态转移法)一、实验内容用单片机实现电子秒表的功能,并采用0号键实现计时启动、停止和回零操作。
第一次按0号键,计时开始;第2次按0号键,计时停止;第3次按0号键,计时回零。
初始状态显示0.00;计时状态显示当前计时时间;停止计时显示最后计时时间。
二、实验程序设计对各个状态和各任务号分配如下:0状态:初始状态;1状态:计时状态;2状态:停止计时状态;123号任务:计时归零,显示初始值。
根据上述分析,建立状态表如下:程序流程图如图2.1所示。
表2.1 电子秒表键控状态表图2.1 电子秒表键控主程序流程图参考程序代码如下:LOAD BIT P1.2 ;串行命令加载,上升沿激活DIN BIT P1.0 ;串行数据输出,接CH451的数据输入DCLK BIT P1.1 ;串行数据时钟,上升沿激活DOUT BIT P3.3 ;INT1,键盘中断和键值数据输入,接CH451的数据输出KEY_F BIT 00H ;20H.0位作有键标志位ST EQU 21H ;存状态号KEY EQU 22H ;存放键盘中断中读取的键码KD EQU 23H ;存放键号MSEC EQU 24H ;百分之一秒计数单元SEC EQU 25H ;秒计数单元MIN EQU 26H ;分计数单元ORG 0000HAJMP MAINORG 000BH ;定时器中断入口LJMP CLOCKORG 0013HLJMP CH451_ INT1ORG 100HMAIN: MOV SP, #60H ;系统初始化MOV ST,#0CLR KEY_FMOV KD,#0MOV P1,#60H ;禁止P1接口上的其它芯片ACALL CH451_INIT ;CH451初始化DISP: LCALL DISPLAY ;当前计时值显示ML0: NOPJNB KEY_F,ML0 ;无按键等待CLR KEY_F ;有按键,清按键标志MOV DPTR, #STAB ;计算状态行地址MOV A, STMOV B, #2MUL ABADD A, DPLMOV DPL, AMOV A, BADDC A, DPHMOV DPH, A ;DPTR=#STAB + ST*2MOV A,KD ;读取次状态号RL A ;KD*2MOV R0,AMOVC A,@A+DPTR ;获得次状态号MOV ST,A ;更新STMOV A,R0INC AMOVC A,@A+DPTR ;得到任务号MOV B,#3MUL AB ;每个LJMP占3个字节MOV DPTR,#TASKJMP @A+DPTR ;散转TASK: LJMP P_0 ;跳转子程序0LJMP P_1 ;跳转子程序1LJMP P_2 ;跳转子程序2P_0: …;启动计时程序略,自己编写P_1: …;计时停止程序略,自己编写P_2: …;归零程序略,自己编写;状态表; K0;ST, PRSTAB:DB 1, 1 ; stat0DB 2, 2 ; stat1DB 0, 0 ; stat2;------------------------------------ ------------------------------------ CH451_INIT:略;CH451初始化子程序参考实验一;------------------------------------------------------------------------CH451_INT1: ;键盘中断子程序PUSH PSW ;现场保护PUSH ACCCLR EX1LCALL READ _CH451 ;读取键码ACALL GET_KD ;获得键号POP ACCPOP PSWSETB EX1CLR IE1 ;清中断标志RETI;------------------------------------------------------------------------ READ_CH451:; 略,参考实验一;------------------------------------------------------------------------GET_KD: ;获得键号子程序MOV A,KEYCJNE A,#40H,OUTMOV A,#0 ;0# 键;………在使用多个键的情况下,继续判断其它键号MOV KD,A ;存键号SETB KEY_F ;置有键标志位OUT: RET;------------------------------------------------------------------------CLOCK: ;略,定时器中断服务子程序,自己编写DISPLAY:略,显示子程序,自己编写;----------------------------------------------------------------------------END图2.2 定时器中断服务子程序流程图图2.3 显示子程序流程图二、实验操作步骤1. 打开KEILuvison3软件,建立工程,设置调试环境,实验板上电;2. 输入源程序,编译,连接,加载;3. 运行程序,观察数码管显示应为000.00;4. 按0键,启动计时,数码管显示计时时间;5. 再按0键,停止计时,数码管显示累计时时间;6. 再按0键,计时归零,数码管显示返回初始状态。
51单片机秒表计时(protues)
一、课设思路(1)利用单片机定时器中断和定时器计数方式实现秒定时。
(2)通过LED显示程序的调整,熟悉单片机与LED的接口技术,熟悉LED动态显示的控制过程。
(3)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。
(4)进一步学习单片机开发系统的整个流程。
二、所需元件名称数量7段数码管 2电阻10kΩ 1电阻1kΩ 8键盘开关 1电容10 µf 1电容30 pf 2晶振12 MHz 189C51 1万能板 1导线若干三、元件介绍AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL 的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:与MCS-51 兼容·4K字节可编程FLASH存储器·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24MHz·三级程序存储器锁定·128×8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路特性概述:AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
单片机基于PROTEUS仿真的秒表的课程设计
1 引言1.1 课程设计的目的1) 通过本次课程设计加深对单片机课程的全面认识和掌握,对单片机课程的应用进一步的了解。
2) 通过本次课程设计将单片机软硬件结合起来,对程序进行编辑,校验,锻炼理论联系实际的能力。
3) 综合运用《单片机原理及应用》课程的理论知识、与设计课题相关的参考资料、基本开发仪器及工具和实验室所具有的其它软硬件环境,设计一个典型的单片机应用系统并通过仿真调试出结果。
4) 通过本次课程设计提高学生的综合能力、动手能力、文献资料查阅能力,为毕业设计和以后工作打下一个良好的基础。
1.2 课程设计的任务用Proteus仿真MCS51系列单片机及其外围电路,用它与Keil开发工具结合,搭建单片机开发平台。
设计一个单片机控制的秒表系统。
利用单片机的定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及按键来设计秒表计时器。
基本功能要求:用AT89C51设计一个2位LED数码显示“秒表”,开始时,显示“00”:第一次按下SP1后就开始从0~9.9计时,显示精度为0.1s;第二次按SP1后,计时停止,显示当前计时值;第三次按SP1后,及时停止归零。
1.3 课程设计的要求1)硬件设计:根据任务要求,完成单片机最小系统及其扩展设计,组成功能完整的系统;2)软件设计:根据秒表的设计要求,完成控制软件的编写与调试;3)用PROTEUS ARES绘制电路原理图并生成PCB图;4)PROTEUS仿真。
2 硬件设计2.1 设计方案介绍及工作原理说明该实验要求进行计时并在数码管上显示时间,则可利用proteus仿真软件设计电路并仿真AT89C51。
使用AT89C51单片机作为核心控制部件,采用12M晶体振荡器及微小电容构成振荡电路;用两个共阴极数码显示管作为显示部分,构成数字式秒表的主体结构,配合独立式键盘和复位电路完成此秒表的计时、清零、停止各项功能。
对于时钟,它有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大。
51单片机,实现秒表功能
#define uchar unsigned char
#define uint unsigned int
char cent=0;
char second=0;
char minite=0;
bit s2=0;
bit s3=0;
bit s4=0;
bit s5=0;
bit s6=0;
/********************************************************/
//函数名:void Delay1ms(uint count)
//功能:延时时间为1ms
//输入参数:count,1ms计数
//说明:总共延时时间为1ms乘以count,crystal=12Mhz
/*共阳数码管字型码*/
/*0,1,2,3,4,5,6,7,8,9,p.,灭*/
char code dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c,0xff,0xbf};
/*P点显示代码序号*/
char data find_code[]={0,0,12,0,0,12,0,0};
/********************************************************/
/*延迟函数*/
void Delay1ms(uint count)
{
uint j;
while(count--!=0)
{
for(j=0;j<80;j++);
}
}
/************************************************************************/
51单片机,实现秒表功能
严*****************************************************************************实现秒表功能说明:用5键控制.启动•停止・暂停.继续•清零采用中断控制方式.******************************************************************************/ #mclude<reg52.h>#inc lude<iiitrms.h> ^define uchar unsigned char ^define umt unsigned mt char cent=O;char second=0;char ininite=O;bit s2=0;bit s3=0;bit s4=0;bit s5=0;bit s6=0;严共阳数码管字型码引 严 0,1,2,3,4,5,6,7、&9,p ・,灭*/chai code dis_code[]={Oxc0,Oxf9,Oxa4>OxbO,0x99,0x92,0x82,0xf&0x80,0x90,0x0c,Ox 览Oxbf}; /*P 点显示代码序号可chai data fiiid_code[]={0,0.12.0,0,12,0.0};严*******************************************************/〃函 数名: void Delaylms(uint count)〃功能: 延时时间为Inis〃输入参数:countjms 计数 〃说明:总共延时时间为1 ms 乘以countxrystal= 12Mhz 严*******************************************************//*延迟函数*/void Delaylms(umt count) {uiiit j;wliile(count~!=0)foi(j=0;j<80:j++); }按S 2启动 按S3停止 按S4暂停按S 5继续按S6清零只有在清零或没有开始的情况下才有效 只有在启动的情况下才有效 只有在启动的情况下才有效 只有在暂停的情况下才有效 只有在停止的情况下才有效严***********************************************************************//*显示函数*/严***********************************************************************/ void dispQchar ij=Oxfe; chai- k; fbr(i=0;i<8;i-H-){P2=J ; k=find_code[i]; PO=dis_code[k]; Delaylms(l); j=_crol_(j4); }PO=Oxff;}*函数原型:keychuliQ; * 功 能:处理与键盘相连的Pl 丨1的内容,作为键值。
基于51单片机的数字秒表设计(最新整理)
ATMEL 公司的 89 系列单片机以其卓越的性能、完善的兼容性、 快 捷 便 利 的 电 擦 写 操 作 、 低 廉 的 价 格 完 全 替 代 了 87C51/62 和 8751/52,低电压、低功耗,有 DIP、PLCC、QFP 封装,是目前性 能最好、价格最低、最受欢迎的单片机之一。
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST/VPD P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
XTAL2 XTAL1
VSS
VCC P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 VPP ALE PSEN P2.7 P2.6 P2.5 P2.4 P2.3
AT89S52 为 40 脚双列直插封装的 8 位通用微处理器,采用工业 标准的 C51 内核,在内部功能及管脚排布上与通用的 8XC52 相同, 其主要用于汇聚调整时的功能控制。功能包括对汇聚主 IC 内部寄存 器、数据 RAM 及外部接口等功能部件的初始化,汇聚调整控制,汇 聚测试图控制等。 单片机外部结构 AT89S52 单片机采用 40 脚的 DIP 封装,如下所示。
数码管显示可以分为静态显示和动态显示两种。由于本设计需要 采用四位数码管显示时间,如果静态显示则占用的口线多,硬件电路 复杂,所以采用动态显示。
动态显示是一位一位地轮流点亮各位数码管,这种逐位点亮显示
器的方式称为位扫描。通常各位数码管的段选线相应并联在一起,由 一个 8 位的 I/O 口控制;各位的公共阴极位选线由另外的 I/O 口线控 制。动态方式显示时,各数码管轮流选通,要使其稳定显示必须采用 扫描方式,即在某一时刻只选通一位数码管并送出相应的段码,在另 一时刻选通另一数码管,并送出相应的段码,依次规律循环,即可以 使各位数码管显示将要显示的字符,虽然这些字符是在不同时刻分别 显示,但由于人眼存在视觉暂留效应,只要每位显示间隔足够短就可 以给人同时显示的感觉。
非常好的资料-秒表时钟程序-c语言-51单片机-Proteus仿真-均包括
电子工程训练实验报告题目:秒表系统的设计和工程实现系班:学号:姓名:大连理工大学电工电子实验中心电子安装实验室一.单片机系统设计方案描述系统设计基本指标:1.实现最大时间长度超过5分钟的正常倒计时2.可以在5分钟范围内自由方面设置秒表的开始时间3.进入最后一分钟时,三声蜂鸣器响提示4.秒表计时到,五声蜂鸣器响,同时小灯亮提示电子工程训练是一个综合性实验。
秒表系统设计总体上分为硬件设计和软件设计两个部分,并要充分考虑它们的匹配设计。
硬件设计特别是引脚的配置要充分考虑软件实现的需要,反过来,软件设计也要建立在硬件的基础上,并且充分利用硬件提供的资源。
硬件电路大体上可分为最小系统板电路、数码管显示电路和按键电路。
最小系统板电路和数码管显示电路在老师指导下很快得以完成。
按键电路为充分考虑以后软件设计的灵活性和可扩展形,采用了排线将引脚引出。
软件设计上,为方便秒表的操作使用,设置了“修改”、“增加”、“移位”和“开始/暂停”四个按键功能。
“修改”键按下,进入修改状态,相应的修改位闪烁,提示按“增加”键修改该位时间参数,操作“移位“按键可以移动修改位。
“开始暂停”则用于秒表的开始运行和暂停运行。
按键处理通常有查询和中断两种方式处理,查询占用较多的单片机运行资源,而且延迟防抖效果较差,容易多次触发,而中断方式消抖则操作更为灵敏。
同时考虑到A T89S52只有两个外部中断,将使用较多的“增加”和“开始/暂停”两个按键处理分配给两个外部中断。
另外两个按键则采用查询方式检测处理。
软件设计整体上利用了“有限状态机”的思想,按键控制状态的转换,并在相应的状态下执行相应的操作。
一共设置了3个状态:state=0(暂停状态),state=1(开始运行状态),state=2(修改状态),它们的相互转化如下:由于本人之前接触过一些仿真软件Proteus的知识,而本系统设计所需要的单片机、按键、数码管、蜂鸣器等硬件均可在Proteus得到仿真。
51单片机实现秒表
delay(300);
P0=0x40; //显示秒个位
P2=3;
delay(300);
P0=Dis_Shiwei;//显示十位
P2=4;
delay(300);//短暂延时
P0=Dis_Gewei; //显示个位
P2=5;
delay(300);
}
}
/********************************/
{
second=0; //利用外部中断清零
msecond=0;
Dis_Shiwei=tab[msecond/10];//十位显示值处理
Dis_Gewei=tab[msecond%10]; //个位显示处理
S_Dis_Shiwei=tab[second/10];//十位显示值处理
S_Dis_Gewei=tab[second%10]; //个位显示处理
}
/*定时中断*/
/********************************/
void tim(void) interrupt 1 using 1
{
TH0=0xd8;//重新赋值
TL0=0xf0;
msecond++;
if (msecond==100)
{
msecond=0;
second++;//秒加1
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管0-9
unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
unsigned char S_Dis_Shiwei;//定义秒十位
基于51单片机的时钟秒表
摘要 (1)1 设计目的及要求 (2)1.1 设计目的 (2)1.2 设计要求 (2)2 设计方案选择 (3)2.1 芯片简介 (3)2.2 总体设计思路 (3)2.3 单元电路设计 (4)2.3.1 时钟模块 (4)2.3.2 复位电路模块 (4)2.3.3 控制模块 (5)2.3.4 显示模块 (5)3 软件设计 (6)3.1整体程序设计思路 (6)3.2 程序流图 (6)3.3 主要程序代码 (8)4 仿真调试 (11)4.1 keil简介 (12)4.1 keil与protues联调 (11)4.2仿真实现 (12)5 硬件实现 (13)5.1 程序下载步骤 (13)5.1 硬件调试 (14)6 拓展 (14)6.1 设计原理 (14)6.2 主要程序清单 (14)6.3 仿真实现 (15)7 心得体会 (16)参考文献 (17)本设计的数字秒表系统采用STC89C52单片机为中心器件,利用其定时器/计数器原理,结合LED数码管以及按键电路来设计计时器。
将软、硬件有机地结合起来,使得系统能够实现四位LED显示,显示时间为00.00~99.99秒,计时精度为0.01秒,能正确地进行计时。
同时,我在此基础上,又设计了时钟秒表定时器,可以显示年、月、日、星期、时间进制、时、分、秒、、以及闹钟启/停状态,可以实现时间的调整,时钟/秒表功能的转换,闹钟的启/停。
其中软件系统采用C语言编写程序,包括显示程序,定时中断服务,延时程序等,并在keil中调试运行,硬件系统利用PROTEUS强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态,利用单片机开发板可下载程序,实现硬件实现。
关键词:秒表,时钟,定时/计数器1 设计目的及要求1.1 设计目的本设计主要是应用Proteus软件和嵌入式C语言编程工具,结合单片机原理及应用、微机原理与接口技术等专业课程,强化和巩固专业理论基础,掌握Proteus仿真的技巧和嵌入式C语言编程工具,提高单片机开发能力,并为嵌入式开发打下基础。
51单片机秒表计时(protues)
51单片机秒表计时器目录摘要 (3)一、实训目的 (3)二、实训设备与器件 (3)(1)实验设备 (3)(2)实训器件 (3)三、实训步骤与要求 (4)(1)要求 (4)(2)方法 (4)(3)实训线路分析 (4)(4)软件设计 (4)(5)程序编制 (4)四、硬件系统设计 (4)五、软件系统设计 (5)六、系统调试 (9)七、实训总结与分析 (10)八、参考资料: (11)九、附录 (12)摘要:秒表是由单片机的P0口和P2口分别控制两个数码管,使数码管工作,循环显示从00—59。
同时,用一个开关控制数码管的启动与停止,另外加上一个复位电路,使其能正常复位,通常还使用石英晶体振荡器电路构成整个秒表的结构电路。
一、目的(1)利用单片机定时器中断和定时器计数方式实现秒定时。
(2)通过LED显示程序的调整,熟悉单片机与LED的接口技术,熟悉LED动态显示的控制过程。
(3)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。
(4)进一步学习单片机开发系统的整个流程。
二、元件(1)实训设备:单片机开发系统、微机、万用表、电烙铁等。
(2)实训器件:名称数量7段数码管 2电阻10k 1电阻1k 8键盘开关 1电容10微法 1电容30皮法 2晶振12M 189C51 1万能板 1导线若干三、步骤(1)要求:利用实训电路板,以2位LED右边1位显示个位,左边1位显示十位,实现秒表计时显示。
以一个按键开关实现启动、停止、清零等功能。
(2)方法:用单片机定时器T0中断方式,实现1秒定时;利用单片机定时器0方式1计数,实现00--59计数。
(3)实验线路分析:采用实训电路板,其原理图参见附录。
两个7段LED 数码管分别由单片机的P0口和P2口控制,使数码管显示从00—59的字样。
用一个开关控制数码管的启动与停止,另外加上一个复位电路,使其能正常复位。
利用51单片机制作一个秒表的详细过程
利用51单片机制作一个秒表的详细过程利用51单片机制作一个秒表的详细过程前面的话:和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大家一样,百思不得其解,最后头都弄大了才把这个秒表制作出来,为了给以后的朋友们一些思路,一些参考,所以在这里我把自己制作的整个详细过程整理出来供大家参考。
我调试出来是没有问题的,各方面都稳定运行,由于我水平有限,中间可能会有不对的地方,欢迎大家指正,我们一起学习,一起进步!我将分为三个部分来介绍:1.整体思路,2.硬件电路方面,3.软件编程方面。
1.整体思路利用51单片机制作秒表时,我介绍精确到十分位(即0.1s)的制作,并让其拥有启动,暂停,复位三个功能。
用到的单片机部分:定时器部分,独立按键的检测与应用,数码管的显示,并结合一些简单的程序即可实现。
用5位数码管来进行显示,分别显示秒的十分位,秒的个位,秒的十位,分的个位,分的十位。
用定时器定时50ms,2个定时器中断即是0.1s,即秒的十分位,20个定时器中断即是1s,60个1s即是1分钟,通过程序将5位数码管的值分离出来,并进行显示。
这就是我在数码管显示方面的思路,如果不是太清楚,结合我下面软件编程方面的程序来看你可能就会明白,我会在那部分做详细介绍,看完了可能你就懂了。
利用独立按键设置启动/暂停键和清零键,利用独立按键的检测,若启动/暂停按键按下,秒表则启动或者暂停,按下复位键,秒表清零复位。
我在程序后面全都有注释,不用担心。
看完你就会明白了。
这是我制作的的流程图:“ms100”表示秒的十分位,'s'表示秒的个位,“s1”表示秒的十位,“min”表示分的个位,“min1”表示分的十位。
“cnt”表示秒的计数位,即多少个一秒,定时满一秒加1,“minu”表示分的计数位,即多少个一分钟,一分钟加1,这个流程图提供了大致思路,要结合下面的程序部分一起看。
51单片机定时器的应用proteus仿真+源程序
TR0=1;
EA=1;
while(key==0)
display();
while(key==1)
display();
EA=0;
while(key==0);
display();
while(key==1)
display();
time=0;
while(key==0)
display();
}
本人有给学生做课程设计的经验,欢迎亲们来本店咨询哦
淘宝店铺地址: ;
QQ:1203026348;496617571
邮箱:1203026348@;496617571@
电话:小陈:15225093569
实例原理:用定时器设计一个秒表,其中设有一个按键,定时器T0工作在方式1。当第一次按下按键时,定时器开始计时。第二次按下按键时,停止计时并计算第一次按下键盘与第二次按下键盘的时间,送人P0口和P2口并将时间显示出来,P0口显示十位,P2口显示各位。第三次按下键盘时使定时器清零,等待下一次按键。
源程序:
{
P0=dis[time%10];
ge=0;
delay(3);
ge=1;
P0=dis_dot[time/10];
shi=0;
delay(3);
shi=1;
}
void main()
{
TMOD=0x01;TH0=0x3c;TL0=0xb0;IE=0x82;//定时器T0工作在方式1
while(1)
{
while(key==1)
小张:15838040206
阿里旺旺:tb3569_1968;zwjyln
我们拥有40G!!超大容量!!!是单片机入门者的首选经典资料!!!
51单片机做可调时钟(带秒表)另附proteus仿真图
/*********************信息学院09级电一***********************/
/**************************柳剑*******************************/
void display(uchar hour,uchar min,uchar sec)
{
unsigned char i;
TempData[0]=duanma[hour/10];
TempData[1]=duanma[hour%10];
TempData[2]=0x40;
TempData[3]=duanma[min/10];//用于显示分
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit menu=P3^2;
sbit reset=P1^0;//清零,秒表状态下也是清零
sbit add_min=P1^1;//调分时加一
sbit add_hour=P1^2;//调时时加一,秒表时按下不动跑表,松开暂停,再次按下继续跑表
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}
/*************按键扫描1****************/
void keyscan1()
{
//display(hour0,min0,sec0);
if(reset==0)
{
51单片机制作的电子时钟的proteus仿真
通过proteus仿真51单片机制作的电子钟----------by lyz这是一个利用proteus仿真简易电子钟的例子,通过c51单片机和一块1602液晶显示屏来工作,十分简单,这样的实践是初学者不错的练习。
第一步:首先,点开isis.exe(切记不是ARES.EXE),如图1通过proteus把原理图布好。
单片机可以选用AT89c51,液晶显示可通过搜索关键字LM016L得到。
由于本电路选用P0口,因此加上了RP1排阻作为上拉电阻。
图1第二步:编写程序如下,时间略有误差(us级),可通过keil中的debug调试地更为精确:#include<reg52.h>typedef unsigned char uchar;typedef unsigned int uint;sbit rs=P3^2;sbit wr=P3^3;sbit lcden=P3^4;uchar timecount=0;void delay(uint i){uint a,b;for(a=i;a>0;a--)for(b=10;b>0;b--);}/********************1602*****************/ void write_com(uchar com){P0=com;rs=0;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void write_date(uchar date){P0=date;rs=1;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void init(){wr=0;write_com(0x38);delay(20);write_com(0x0f);delay(20);write_com(0x06);delay(20);write_com(0x01);delay(20);}/*********************************************************主函数**********************************************************/void main(){uchar a,second=0,minute=0,hour=0;uchar table[8];TMOD|=0x01; //定时/计数器0工作于定时器模式,方式1TH0=(65536-5000)/256;TL0=(65536-5000)%256; //50ms定时常数EA=1; //开总中断ET0=1; //允许定时/计数器0 中断TR0=1; //启动定时/计数器0 中断P0=0;P2&=0x1F;init();while(1){if(timecount>19) //*****20乘50为1000ms {timecount=0;second++;}if(second==60){second=0;minute++;}if(minute==60){minute=0;hour++;}if(hour==24){hour=0;}table[0]=hour/10+48; //***数字加上48对应的它的ascll码,用来显示在液晶上table[1]=hour%10+48;table[2]=58; //***58对应冒号table[3]=minute/10+48;table[4]=minute%10+48;table[5]=0;table[6]=second/10+48;table[7]=second%10+48;write_com(0x80);delay(20);for(a=0;a<8;a++){write_date(table[a]);delay(20);}}}/*********************************************************中断服务函数**********************************************************/void Time0(void) interrupt 1 // using 0{TH0=(65536-5000)/256;TL0=(65536-5000)%256; //50ms定时常数timecount++;}/*********************************************************/第三步:双击电路图中的单片机,如下添加hex文件。
非常好的资料秒表时钟程序c语言-51单片机-proteus仿真-均包括
电子工程训练实验报告题目:秒表系统的设计和工程实现系班:学号:姓名:大连理工大学电工电子实验中心电子安装实验室一.单片机系统设计方案描述系统设计基本指标:1.实现最大时间长度超过5分钟的正常倒计时2.可以在5分钟范围内自由方面设置秒表的开始时间3.进入最后一分钟时,三声蜂鸣器响提示4.秒表计时到,五声蜂鸣器响,同时小灯亮提示电子工程训练是一个综合性实验。
秒表系统设计总体上分为硬件设计和软件设计两个部分,并要充分考虑它们的匹配设计。
硬件设计特别是引脚的配置要充分考虑软件实现的需要,反过来,软件设计也要建立在硬件的基础上,并且充分利用硬件提供的资源。
硬件电路大体上可分为最小系统板电路、数码管显示电路和按键电路。
最小系统板电路和数码管显示电路在老师指导下很快得以完成。
按键电路为充分考虑以后软件设计的灵活性和可扩展形,采用了排线将引脚引出。
软件设计上,为方便秒表的操作使用,设置了“修改”、“增加”、“移位”和“开始/暂停”四个按键功能。
“修改”键按下,进入修改状态,相应的修改位闪烁,提示按“增加”键修改该位时间参数,操作“移位“按键可以移动修改位。
“开始暂停”则用于秒表的开始运行和暂停运行。
按键处理通常有查询和中断两种方式处理,查询占用较多的单片机运行资源,而且延迟防抖效果较差,容易多次触发,而中断方式消抖则操作更为灵敏。
同时考虑到AT89S52只有两个外部中断,将使用较多的“增加”和“开始/暂停”两个按键处理分配给两个外部中断。
另外两个按键则采用查询方式检测处理。
软件设计整体上利用了“有限状态机”的思想,按键控制状态的转换,并在相应的状态下执行相应的操作。
一共设置了3个状态:state=0(暂停状态),state=1(开始运行状态),state=2(修改状态),它们的相互转化如下:“修改”键按下State=1开始运行状态State=0暂停状态”开始/暂停“键按下State=2修改状态”开始/暂停“键按下“修改”键按下“移位”键和“增加”键修改时间参数,修改数码位闪烁提示秒表计时,自动修改时间参数数码管显示暂停的时间由于本人之前接触过一些仿真软件Proteus 的知识,而本系统设计所需要的单片机、按键、数码管、蜂鸣器等硬件均可在Proteus 得到仿真。
电子跑秒表计时器设计——基于PROTEUS
【转】电子跑秒表计时器设计——基于PROTEUS使用Protues软件绘制的电路图,使用的89C51型单片机。
与之相应的使用KEIL软件编写的C语言程序代码:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit P20=P2^0;sbit P21=P2^1;sbit P22=P2^2;sbit P17=P1^7;uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段位码uchar ms;uint LED0,LED1,LED2,LED3,LED4,LED5; // 各位的数字int m,n,delay;bit add;bit sub;bit scankey;bit start;bit stop;bit ready;bit start0;void begin1() //初始化子程序{m=0;n=0;ms=0;LED0=0;LED1=0;LED2=0;LED3=0;LED4=0;LED5=0;add=0;sub=0;start=0;ready=0;start0=0;scankey=0;}void display(){ switch (ms%6){ //显示子程序 case 0:P3=0xfe;P1=table[LED3];P17=0;break;case 1:P3=0xfd;P1=table[LED2];P17=0;break;case 2:P3=0xfb;P1=table[LED1];P17=1;break;case 3:P3=0xf7;P1=table[LED0];P17=0;break;case 4:P3=0xef;P1=table[LED4];P17=1;break;case 5:P3=0xdf;P1=table[LED5];P17=0;break;default: return;}}void time0(void) interrupt 1 using 1 //中断程序{TL0=0x18 ;TH0=0xfc;ms++;if(ms==10){ ms=0;scankey=1; //扫描键盘标志位有效 }display(); //显示程序调用}void add1(time)uint time;{ uint n,a;a=time/1000;LED0=a; //计算十秒位数值n=time%1000;LED1=(n/100); //计算秒位数值n=n%100;LED2=(n/10); //计算十分一秒位数值LED3=n%10; //计算百分一秒位数值}void add2(t){ LED5=(t/10); //计算分钟十位数值LED4=t%10; //计算分钟个位数值}void scan() //扫描开关输入子程序{ P2=0xff;if(P20==0&&ready==0&&start0==0) //K1计时与暂停{ for(delay=0;delay<=200;delay++);P2=0xff;if(P20==0)start=!start;}if(P21==0&&ready==0&&start0==0) //K2计时 { for(delay=0;delay<=200;delay++);P2=0xff;if(P21==0)stop=1;}if(P22==0&&ready==0&&start0==0) //K3进入倒计时状态{ for(delay=0;delay<=200;delay++);P2=0xff;if(P22==0)ready=1;}if(P20==0&&ready==1&&start0==0) //K1调整倒计值加标志位有效{ for(delay=0;delay<=200;delay++);P2=0xff;if(P20==0&&ready==1)add=1;}if(P21==0&&ready==1&&start0==0) //K2调整倒计值减标志位有效{ for(delay=0;delay<=200;delay++);P2=0xff;if(P21==0&&ready==1)sub=1;}if(P22==0&&start0==1) //K3倒计时暂停{ for(delay=0;delay<=200;delay++);P2=0xff;if(P22==0&&start0==1)start0=0;}if(P22==0&&ready==1&&start0==0) //K3倒计时开始{ for(delay=0;delay<=200;delay++);P2=0xff;if(P22==0&&ready==1)start0=1;}if(P21==0&&start0==1) //K2倒计时清零,只能在倒进行时使用{ for(delay=0;delay<=200;delay++);P2=0xff;if(P21==0&&start0==1)start=0;ready=0;start0=0;stop=1;}}void main(){begin1();TMOD=0x01;TL0=0x18;TH0=0xfc;EA=1;ET0=1;TR0=1;for(;;){if(scankey==1) //进行键盘扫描{ scankey=0;scan();if(start==1&ready==0) //计时开始{ m++;if(m==6000){m=0; n++;if(n==60){n=0;start=0;}}add1(m);add2(n);}if(stop==1&ready==0) //计时清零{m=0;n=0;start=0;stop=0;add1(m);add2(n);}if(add==1) //倒计时初值加10 { m=m+10;add=0;if(m==6000){m=0; n++;if(n==60)n=0;}add1(m);add2(n);}if(sub==1) //倒计时初值减10 { m=m-10;sub=0;if(m==-1&&n!=0){n--;m=5999;}if(m==-1&&n==0){m=0;}add1(m);add2(n);}if(start0==1) //倒计时{ m--;if(m==-1&&n!=0){n--;m=5999;}if(m==-1&&n==0){m=0;ready=0;start0=0;start=0;}add1(m);add2(n);}}}。
51单片机秒表计时
实验设汁报告按廿题目:51单片机外扩8155秒表廿时班级:__________ 廿算机091班 _________________姓名:学号:指导老师: 日期:51单片机秒表廿时一、按廿目的(1 ) f'J用单片机定时器中断和定时器廿数方式实现秒定时。
(2) 通il LED显示程序的调整,熟悉单片机与LED的接口技术,熟悉LED动态显示的控制过程。
(3) 掌握8155芯片的用法及口地址的廿算方法。
(3) 通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示和定时器中断等多种功能的综合程序。
(4) 进一步学习单片机开发系统的整个流程。
二、投廿任务首先以89C51单片机的原理图为背景,利用51单片机的PO、P2 口外扩一片8155芯片。
将6个共阳极数码管的断码用8155的B 口控制,位码用8155的A 口控制。
其次,用51单片机的P30、P31接两个独立的按鍵。
最后用keil C编写软件,驱动各个外围设备。
三、披廿需求和用STC-89C52单片机作为系统核心控制部分,用外围6个数码管、两个独立按建实习秒表廿时的助能。
当接P30的按键按下时,枚表开始ii■时,当接P30的按鍵打开时暂停,当接P31的按建按下时数码管清零。
四、设廿林料内容要求一、題目分林,功能要求。
(1) 1求:利用实训电路檢,用6个共阳极数码管实现秒表廿时显示。
以一个按建开关实现启动、停止,另一个实现清零功能。
(2) 方法:用单片机定时器TO中断方式,实现100毫秒定时;利用单片机定时器0方式1廿数。
(3) 实验线路分析:采用实训电路板,其原理图参见附录。
6彳、7 段LED数码管分别由8155的A 口和B 口控制,使数码管显示00-00-00 的字样。
用一个开关控制数码管的启动与停止,另外一个实现淸零。
另外再抽上一个晶振电路就晞成了整个秒表的电路。
(4) 软件设廿:软件整体设廿思路是主程序进行初始化,以开关的因合与打开判断秒表是否开始计时,LED通过定时廿算器中断的方式进行显示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机秒表计时器目录摘要 (3)一、实训目的 (3)二、实训设备与器件 (3)(1)实验设备 (3)(2)实训器件 (3)三、实训步骤与要求 (4)(1)要求 (4)(2)方法 (4)(3)实训线路分析 (4)(4)软件设计 (4)(5)程序编制 (4)四、硬件系统设计 (4)五、软件系统设计 (5)六、系统调试 (9)七、实训总结与分析 (10)八、参考资料: (11)九、附录 (12)摘要:秒表是由单片机的P0口和P2口分别控制两个数码管,使数码管工作,循环显示从00—59。
同时,用一个开关控制数码管的启动与停止,另外加上一个复位电路,使其能正常复位,通常还使用石英晶体振荡器电路构成整个秒表的结构电路。
一、目的(1)利用单片机定时器中断和定时器计数方式实现秒定时。
(2)通过LED显示程序的调整,熟悉单片机与LED的接口技术,熟悉LED动态显示的控制过程。
(3)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。
(4)进一步学习单片机开发系统的整个流程。
二、元件(1)实训设备:单片机开发系统、微机、万用表、电烙铁等。
(2)实训器件:名称数量7段数码管 2电阻10k 1电阻1k 8键盘开关 1电容10微法 1电容30皮法 2晶振12M 189C51 1万能板 1导线若干三、步骤(1)要求:利用实训电路板,以2位LED右边1位显示个位,左边1位显示十位,实现秒表计时显示。
以一个按键开关实现启动、停止、清零等功能。
(2)方法:用单片机定时器T0中断方式,实现1秒定时;利用单片机定时器0方式1计数,实现00--59计数。
(3)实验线路分析:采用实训电路板,其原理图参见附录。
两个7段LED 数码管分别由单片机的P0口和P2口控制,使数码管显示从00—59的字样。
用一个开关控制数码管的启动与停止,另外加上一个复位电路,使其能正常复位。
另外在加上一个晶体振荡电路就够成了整个秒表的电路。
(4)软件设计:软件整体设计思路是主程序进行初始化,以按键开关按下的次数确定定时器的启动与否,LED通过中断的方式进行显示。
后二者间的联系是:按键按下,则定时器开始计时,中断后在LED上显示,不断循环;按键第二次按下时,定时器停止计时,LED不显示;按键第三次按下时,返回到初始状态重新开始。
秒定时采用定时器T0中断方式进行,60秒计数由定时器0采用方式1完成,中断及计数的开启与关闭受控于按键处理程序。
由上述设计思路可设计出软件流程图如图7.1所示。
(5)程序编制:编程时第一次按键为“启动”,第二次按键为“停止”,第三次按键为“清零”,因按键较少,在处理按键值时未采用散转指令“JMP”,而是采用条件转移指令“CJNE”,。
2位LED显示的数据由显示缓冲区30H~31H单元中的数据决定。
四、设计硬件电路的设计应从两个方面予以考虑。
一是根据应用系统总体设计的参数范围、测控速度与精度等技术指标要求选择单片机。
不同系列单片机或同一系列不同型号单片机芯片内部提供的资源状况各不相同,如ROM、RAM容量,定时/计数器、I/O接口、中断系统等硬件配置,应选择性价比最适合的单片机型。
二是在已选定单片机型号的基础上,根据应用系统的功能要求扩展单片机外部设备的配置,如键盘、打印机、A/D、D/A、报警电路、驱动电路及通用/专用I/O接口等。
硬件电路的设计原则如下:(1)在性价比满足应用系统要求的基础上,选择更可靠、更熟悉的单片机,缩短研制周期。
(2)尽可能选择较成熟的典型应用电路,以提高系统的可靠性。
(3)单片机内部的资源与外部扩展资源应在满足应用系统设计要求的基础上留有余地,为进一步升级和扩展其功能提供方便。
(4)应充分结合软件方案统筹考虑硬件结构,通常硬件功能较完善,其相应的软件就简单,但硬件成本较高;而硬件功能略低,其相应的软件就复杂。
实际中应尽量以软件替代硬件来降低成本。
(5)整个系统的相关器件应尽可能做到性能匹配,如电平、速度的匹配等。
(6)充分考虑整个系统的抗干扰设计,如选择具有抗干扰设计的单片机并充分筛选芯片与器件,在电路中采取隔离和屏蔽措施等。
根据以上设计原则,选择较熟悉的MCS-51系列单片机中具有内部程序存储器的89C51单片机;为实现LED数码显示和键盘控制,直接将开关键盘接到单片机的P3.7口,是单片机直接控制开关,其中:按第一次,定时器启动,即数码管开始显示数。
按第二次,定时器停止,即数码管上显示的数停止,显示当前的秒数。
按第三次,使数码管上的数复位。
五、软件系统设计待硬件电路接线完成后,通常可先编写简单的测试程序对硬件电路进行测试,排除硬件电路设计中存在的错误。
然后根据设计任务的要求确定系统程序的整体结构,尽可能采用模块化程序设计的方法,将任务划分为相对独立的功能模块,明确各模块的功能、时间顺序和相互关系,如系统管理、数据与信息采集、报警处理、误差处理、标度变换、数据处理、输出控制等;列出详细的资源划分表,确定各模块的出口和入口状态;建立必要的数学模型,正确描述出系统中输入和输出间的数学关系;画出各程序模块的详细流程图;根据流程图逐一编写程序;最后将各个模块连接成完整的程序。
(1)软件设计的基本原则。
①程序整体结构清晰、简洁、流程合理,主程序尽可能简单明了。
②各种功能的实现应采用模块化、子程序化,以便于编制、阅读、连接、移植、修改和调试。
③对各子程序的入口、出口条件,占用的资源要明确,以便于分析、调试和共享。
④程序存储区、数据存储区、寄存器区、位寻址区、堆栈区应规划合理,做到既节约资源又不会发生相互间的冲突。
⑤运行状态标志化管理,对各功能程序的运行结果、操作状态应设置状态标志,以便查询和实现运行控制。
⑥运用软件或软硬件相结合等方法抑制干扰,提高系统的抗干扰能力。
⑦必要时可结合硬件采取加密措施。
(2)资源分配:选用定时/计数器T0,定时方式1工作,每隔50ms溢出中断一次。
(3) 软件流程框图(5)程序清单SECOND EQU 30HTCOUNT EQU 31HKCOUNT EQU 32HKEY BIT P3.7ORG 00HSJMP STARTORG 0BHLJMP INT_T0START: MOV DPTR,#TABLEMOV P0,#3FHMOV P2,#3FH ;开始,数码管显示"00"MOV SECOND,#00HMOV TCOUNT,#00HMOV KCOUNT,#00HMOV TMOD,#01H ;定时器0工作在方式1MOV TL0,#(65536-50000)/256MOV TH0,#(65536-50000)%256K1: JB KEY,$ ;等待按键LCALL DELAYJB KEY,$MOV A,KCOUNTCJNE A,#00H,K2 ;判断按键次数SETB TR0 ;第1次按键,启动定时器MOV IE,#82HJNB KEY,$INC KCOUNT ;按键抬起,按键次数值加1LJMP K1K2: CJNE A,#01H,K3CLR TR0 ;第2次按键,关闭定时器MOV IE,#00HJNB KEY,$INC KCOUNT ;按键抬起,按键次数值加1LJMP K1K3: CJNE A,#02H,K1 ;第3次按键,返回初始状态JNB KEY,$LJMP STARTINT_T0: MOV TH0,#(65536-50000)/256MOV TL0,#(65536-50000)%256INC TCOUNTMOV A,TCOUNTCJNE A,#2,I2 ;是否计够0.1秒MOV TCOUNT,#00HINC SECONDMOV A,SECONDCJNE A,#100,I1 ;是否计够10秒MOV SECOND,#00HI1: MOV A,SECONDMOV B,#10DIV ABI3:CJE A,#6,I4CJE A,#7,I4CJE A,#8,I4CJE A,#9,I4I4: CLR AMOVC A,@A+DPTR ;显示时间MOV P0,AMOV A,BMOVC A,@A+DPTRMOV P2,AI2: RETITABLE: DB 3FH,06H,5BH,4FH,66H6DH,7DH,07H,7FH,6FHDELAY: MOV R6,#20D1: MOV R7,#250DJNZ R7,$DJNZ R6,D1RETEND六、系统调试1)输入源程序输入源程序时,应以西文方式输入字母和符号,且中文注释前要加分号。
2)对源程序进行汇编和纠错根据自动汇编提供的错误信息逐条纠正错误,直至汇编信息提示“错误(0)”、“汇编结束”。
3)确定调试方案在调试程序前一定要认真分析源程序,明确各功能程序运行的预期结果。
然后结合源程序应达到的结果,确定出如何通过某些关键参数和实验现象检验程序运行结果正确与否。
例如:程序运行过程中路径的变化、累加器A内容的变化、其他特殊寄存器内容的变化等。
并针对具体的分析和观察对象选择较合适的调试方法。
如单步运行、跟踪运行、连续运行、快速运行至光标处、设置断点等调试方法。
4)调试程序(1)调试主程序。
主程序运行后,在无任何按键输入时观察有无显示,时钟是否工作,其时、分、秒显示的变化过程是否正确。
若运行结果不正确,首先应根据程序运行的实际现象分析判断哪些因素可引起相关故障,再通过调试方法逐一认证和排除。
例如:若定时/计数器的初始化出错,则时钟将不能工作;若显示程序出错,则将不能正确显示时钟单元内容;若定时/计数器中断服务子程序出错,则其显示数据的变化规律将不正常。
(2)调试子程序。
在调试主程序时,必然要调用相关的功能子程序。
因此,首先应明确子程序的具体功能,通过对子程序的分析,确定子程序的入口、出口参数及相关标识位的状态,然后在满足入口条件的状态下,设法检查从主程序进入子程序,再由子程序返回到主程序的运行过程。
可采用跟踪运行或运行至光标处的方法,检查从主程序进入子程序内部的运行过程,再通过单步运行等方法检查子程序内部的运行情况和返回主程序的过程。
通过反复调试,发现并排除软件与硬件存在的各类问题,以满足系统设计的预期目的。
5)脱机运行将调试已通过的程序写入单片机内部(或外部)程序存储器中,再将写好程序的单片机(或存储器)插入已设计好的单片机用户板上,把仿真系统与用户板脱离开来,最后将所设计的单片机应用系统独立通电运行。
七、实训总结与分析通过本次智能仪器仪表的课程设计,各方面又得到了进一步的提高。
从整个单片机开发系统的把握上,感觉比以前更具有信心,当然,在焊接、调试的时候也显得更轻松,至少知道从哪些地方入手,怎样判断正确与否。
尤其是在调试大型程序时,需先根据要求划分模块,优化结构;再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用;再根据各模块性质和功能将各模块细化,设计出程序流程图;最后才根据各模块流程图编制具体程序。