基于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语句的使用等等编程方法,这对我们继续深入掌握编程知识很有用处。
5152单片机13课练习:99秒以内可调定时报警器
#include <reg51.h>
code unsigned char sz []={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P15=P1^5;
sbit sw1=P3^7;
sbit sw2=P3^6;
sbit sw3=P3^5;
unsigned int a,c,t,i,b;
unsigned char bit1000,bit100,bit10,bit1;
void xianshi (unsigned char bit1000,unsigned char bit100,unsigned char bit10,unsigned char bit1);//声明显示程序
void csh();//声明初始化程序
void delay (unsigned int t);//声明延时程序
void delay (unsigned int t)//延时程序
{
unsigned int i;
i=t;
while(i--);
}
void csh()//初始化程序
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
b=0;
a=b;
}
void xianshi (unsigned char bit1000,unsigned char bit100,unsigned char bit10,unsigned char bit1)//显示程序
{
bit1000=a/1000; //整除,提取千位
bit100=a%1000/100;//提取百位3
bit10=a%100/10; //提取十位
bit1=a%10; //提取个位
P0=sz[bit1];
P13=0;
delay (10);
P13=1;
P0=sz[bit10];
P12=0;
delay (10);
P12=1;
}
void main ()//主程序
{
csh(); //调用初始化程序
while(1)
{
xianshi (bit1000,bit100,bit10,bit1);
if (sw1==0)
{
delay(50);
if(sw1==0)
{
do
{
while(sw1==0);
delay(50);
}
while (sw1==0);
bit1++;
if (bit1>9) bit1=0;
a=bit10*10+bit1;
}
}
if (sw2==0)
{
delay(50);
if(sw2==0)
{
do
{
while(sw2==0);
delay(50);
}
while (sw2==0);
bit10++;
if (bit10>9) bit10=0;
a=bit10*10+bit1;
}
}
if (sw3==0)
{
TR0=1;
}
}
}
void t0 () interrupt 1//定时器0中断子程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
c++;
if(c==20)//1秒
{
c=0;
a--;
if(a==0)
{
P15=0;
TR0=0;
}
}
}
相关问答
怎么用51 单片机 设计一个0-9.9 秒 的定时器?朋友们好,我是电子及工控技术,我来回答这个问题。用单片机实现一个定时器只要对单片机里的特殊寄存器进行设置就可以实现了,下面我与朋友们说说这个0到9.9秒定...
数字式电子 秒 表设计程序(max7219与 单片机 连接8位数码管显示)?你好!7219驱动两位数码管完成99秒计时,通过按键控制开始和复位你好!7219驱动两位数码管完成99秒计时,通过按键控制开始和复位
51 单片机 定时闹铃(c语言) - R6OWXQ1Id 的回答 - 懂得我来发一个C语言51单片机2113时钟程序,希望5261能帮到你/*程序功能:带定时闹4102铃时钟*//*----------------------------------------------...
单片机 ( 秒表 制作)?,制作 单片机 服务体验如何??很简单啊,用单片机定时器先定时20ms,再计数50次,即1s,再计数24次,即24秒。计时结束后输出控制信息值LED端口就行了!手打不易,如有帮助请采纳,谢谢!!...
51 单片机 秒表 设计 怎么用按钮控制开始 停止和清零?-ZOL问答chartable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳...TH0=(65536-922)/256;//1毫秒...
如何利用 单片机 设计八路抢答器?用单片机来设计八路抢答器是一个常见的小课题,本人之前在大学期间就设计过八路抢答器的课程设计,也正是这个课程设计,让我喜欢上了单片机,以后也是从事的嵌入...
求一基于AT89C52 单片机 的交通灯程序:要求:(1)主、支干道交替...[最佳回答]这个这么简单,你不要老是把老是的作业拿来问大家,我记得我们大学的后门有这么一句话,市场经济不相信眼泪的这个这么简单,你不要老是把老是的作业拿...
【如何提高超声波测距距离?用51 单片机 做处理器,超声波发射电...[最佳回答]1秒10次?10秒1次?1、如果测距的周期较长,可以进一步提高发射电压,应达到200~800Vp-p(视探头而定),建议用脉冲变压器,驱动不能用74HC04了,换成开关管...
用C语言写51 单片机 闹钟程序 - 180****7518 的回答 - 懂得1//宏定义4102输出的i/o口为P1//******************时间延迟函数**********************//描述:用指令1653实现延时一段时间//入口参数:i......
用 protel99 画 单片机 时引脚名称上的横线怎么打上去?就是画芯...[最佳回答]P\S\E\N\