技术文档

52单片机秒表 基于proteus的51单片机开发实例16-简易秒表

小编 2024-11-24 技术文档 23 0

基于proteus的51单片机开发实例16-简易秒表

1. 基于proteus的51单片机开发实例16-简易秒表

1.1. 实验目的

本实例中我们来加深对51单片机定时器/计数器的理解,及定时器定时功能的使用方法,利用定时功能来实现一个简易秒表,该秒表通过两位数码管显示0~99秒的计时,并且可以通过按键实现秒表的启动、停止、清零。

图1 简易秒表电路

1.2. 设计思路

之所以说是简易秒表,因为我们平时所见到的秒表不仅有秒时间的变化,还有毫秒的变化,如下面的动图所示。而我们实现的秒表只有秒数的变化,没有毫秒级的变化。

图2 更精确的秒表

本例的设计思路是使用一个按键来控制秒表的启动、停止、清零功能。具体实现过程是:第一次按下按键,秒表开始工作,两位数码管从00开始显示,每秒显示的数字加1,一直加到99,然后再从00开始显示;当第二次按下按键,数码管的显示停止,同时数码管正在显示的数字不再变化;第三次按下按键,数码管的数字清零,变为显示00。

1.3. 基础知识

本例设计的基础知识有定时器的工作原理;数码管的显示原理,按键检测识别原理,这些我们在之前已经学习过了。

本例的另一个重点是程序代码比之前的代码复杂了,代码中涉及了端口位定义,位变量定义,数组的定义及初始化,函数的定义,C语言中switch case语句的使用等等;我们将在代码部分一一解释。

1.4. 电路设计

本实例的电路图如图1所示。单片机的P0和P1口接两个共阳极数码管,用于秒表显示。按键连接到P3.4端口,P3.4口在按键未按下时处于高电平,按键按下后,变为低电平。

1.5. 程序设计

本实例的程序代码如下所示。

这个程序代码中有很多知识点,我们来学习一下。

1、头文件包含#include <AT89x52.h>

这个语句的作用是将预定义好的51单片机的端口定义、寄存器定义等各种信息包含进来。例如我们在程序中用到的P3^4,EA,TH0等,我们之所以可以直接使用这些名称,就是因为在这个头文件中已经帮我们定义好了。如果程序中没有这条头文件包含的语句,则凡是用到这些名称的语句都会报错。

图3 51单片机头文件部分内容

2、位定义

在程序中有这些语句sbit K1 = P3^4; bit Key_State; 这两个都是位定义语句,只不过两者还有些区别,sbit是定义端口的某一位,而bit则定义一个位数据,这个位数据只有两个值0或1。

3、数组的定义和初始化

看一下这个语句unsigned char DSY_CODE[]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90

}

这个语句实现的功能就是在定义的同时初始化了数组中各元素的值。细心的人可能会发现,这个数组中元素个数没有定义,这是C语言的一个特色:数组定义的同时初始化的话,如果不定义数组元素的个数,那么默认按照初始化的值的个数设置。

再看这个unsigned char ViewData[2]; 只是定义了数组,没有初始化数组元素的值,所以必须指明数组元素的个数,并且如果程序中要对这个数组赋值的话,只能一个一个的赋值,ViewData[0]=0xC0;ViewData[1]=0xC0;而不能直接这样赋值ViewData[2]={0xc0,0xc0};这就是数组定义的同时初始化和数组只定义不初始化时的区别。

4、全局变量

全局变量必须在所有函数之前定义,并且全局变量在程序运行期间,它的值是不变的,除非程序中人为改变了这个值。

5、函数的定义和声明

函数可以在调用之前先声明,然后再调用它的函数之后定义,也可以在声明的同时定义,本例中就是在声明的同时定义。函数的声明只要一句话,例如void Key_Event_Handle(void);而函数的定义是指将函数要实现的功能写出来,具体说就是把函数的内容补充完善。

6、switch case语句

switch case语句属于判断语句,switch后面括号中的变量就是判断条件,这个判断条件只能是整数,不能是小数。每个case语句后面的功能执行完后,最好加一个break语句,以跳出整个判断结构,否则只要下面的case条件满足,就一直执行,这样容易造成混乱。

关于51单片机C语言编程的一些知识,今天就先说到这里,后面我们会有更多了解。

1.6. 实例仿真

编译程序后,将生成的hex文件载入proteus电路的单片机中,开始仿真,仿真时随时按下按键(要默记按键是第几次按下),观察两位数码管显示数字的变化,充分理解该实例的功能实现。

下面视频是本实例的仿真过程。

视频加载中...

1.7. 总结

通过本实例的学习,我们更加熟悉了51单片机定时器/计数器的定时功能,同时也更多的了解了51单片机C语言程序设计中的端口位定义,位变量定义,数组的定义及初始化,函数的定义,C语言中switch case语句的使用等等编程方法,这对我们继续深入掌握编程知识很有用处。

51单片机学习19-简易秒表

前面几篇我们说到了 LED灯,数码管,按键等内容,按键和数码管组合可以设计出简易秒表。

硬件组成:单片机最小系统+数码管显示电路+3个按键

功能:一个开始键,一个暂停键,一个复位键。数码管显示的精度是00:00--59:99

仿真图:

程序:

程序内容比较多,详细的参考源代码

源代码:

#include<reg52.h> //头文件

#define uint unsigned int

#define uchar unsigned char

uchar qian;

uchar bai;

uchar shi;

uchar ge;

//共阴数码管0-F 编码表

uchar smg_dm[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};

uchar smg_dm1[]={0xbf,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,}; //0. 1. 2.----9.段码表

uchar smg_wm[]={0Xef,0Xdf,0xbf,0x7f}; //位选

uchar Display_buffer[4]={0,0,0,0}; //数码管显示缓存

sbit key1=P2^0; //开始键

sbit key2=P2^1; //暂停键

sbit key3=P2^2; //复位键

void delay_ms(uint z) //延时子程序

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void key(void)

{

if(key1==0)

{

delay_ms(10);

if(key1==0)

{

TR0=1;

}

while(!key1);

}

if(key2==0)

{

delay_ms(10);

if(key2==0)

{

TR0=0;

}

while(!key1);

}

if(key3==0)

{

delay_ms(10);

if(key3==0)

{

TR0=0;qian=0;bai=0;shi=0;ge=0;

}

while(!key1);

}

}

void msg_display(void)

{

uchar i;

Display_buffer[0]=qian;

Display_buffer[1]=bai;

Display_buffer[2]=shi;

Display_buffer[3]=ge;

for(i=0;i<=3;i++)

{

if(i==1)

{

P2=smg_wm[i];//选位码

P1=smg_dm1[Display_buffer[i]];//选段码

delay_ms(5);

//P2=0XFF; //消影仿真这句加不加都一样

}

else

{

P2=smg_wm[i];//选位码

P1=smg_dm[Display_buffer[i]];//选段码

delay_ms(5);

//P2=0XFF; //消影

}

}

}

void main()

{

TMOD=0X01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

EA=1;

ET0=1;

while(1)

{

key();

msg_display();

}

}

void time0() interrupt 1

{

uchar num;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

num++;

if(num==1)

{

num=0;

ge++;

if(ge==10)

{

ge=0;

shi++;

if(shi==10)

{

shi=0;

bai++;

if(bai==10)

{

bai=0;

qian++;

if(qian==6)

{

qian=0;

}

}

}

}

}

}

仿真结果:

相关问答

51单片机 秒表 设计 怎么用按钮控制开始 停止和清零?-ZOL问答

4条回答:【推荐答案】//定义IO和变量sbitstart=P1^1;sbitstop=P1^2;sbitreset=P1^3;bitflag_start;//计数标志位uintsec;//秒/

单片机秒表 程序 80 C51 -ZOL问答

至少是2个机器周期,至于状态周期你自己查查51的几个不同的周期吧,很简单的、、、单片机里面有程序存储器,还有数据存储器,数据存储器是用来存放大量数据的。。...

单片机 倒计时 秒表 程序由什么组成?

主要由定时器控制程序组成。主要由定时器控制程序组成。

单片机 ( 秒表 制作)?,制作 单片机 服务体验如何??

[回答]很简单啊,用单片机定时器先定时20ms,再计数50次,即1s,再计数24次,即24秒。计时结束后输出控制信息值LED端口就行了!手打不易,如有帮助请采纳,谢谢!!...

在座的老铁,我想知道, 单片机 ( 秒表 制作)?,制作 单片机 费用...

[回答]我有一个秒表程序,是用郭天祥的TX-1C板子写的,你要么开发过产品,给你个网址http://www.mcu-development.com,环境设备先进,价格合理品控做的不错,...

用C语言写 51单片机 闹钟程序 - 180****7518 的回答 - 懂得

1//宏定义4102输出的i/o口为P1//******************时间延迟函数**********************//描述:用指令1653实现延时一段时间//入口参数:i......

用C语言写 51单片机 闹钟程序 - 132****9191 的回答 - 懂得

#include"reg51.h"chartab1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};unsigned...

0秒的定时器作用?

用于精确定时,如秒表,时钟。还有就是在单片机正常工作时,如果调用延时函数来延时的话,那么单片机在此期间就无法处理其他任务了,如探测其他的一些数据变化量...

求助!! 单片机 ( 秒表 制作)?,制作 单片机 费用高不高?

[回答]看什么样的舵机了,一般的小舵机不用驱动,直接接5V,GND和单片机IO口就可以了。服务热情,公司环境设备先进,价格合理品控做的不错,据说他们生意做的...

单片机 ( 秒表 制作)?,制作 单片机 哪家性价比高??

[回答]先找个输出电压和功率合适的工频变压器,得看你单片机系统的消耗功率是多少,计算出输入电流,估算变压器输出功率,尽量大点,选择个10VA的变压器就差不...

猜你喜欢