博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程实现让单片机在lpm0模式下_奥运倒计时器,请看单片机如何编程实现
阅读量:5732 次
发布时间:2019-06-18

本文共 2763 字,大约阅读时间需要 9 分钟。

倒计时器简介

单片机倒计时器是基于定时而设计的实现及时报警的装置。它由键盘扫描、动态LED显示电路、报警三大部分构成,以实现对计时时间的控制。同时装置还用一个由电平控制的报警装置,用以实现倒计时时间到时进行声音提示。

倒计时器的实时性强,可操作性好,能应对不同要求进行过相应的调整以适应不同环境,倒计时器使用范围非常广泛,不难忘记奥运倒计时,场面让人震撼。

f39b95722491b8cf52c236f3a1e9371c.png

倒计时

工程设计

以proters仿真工程为例,建立一个倒计时工程,主要器件需要用到AT89C51单片机芯片,采用两个数码管显示,数码管采用共阴极,一个倒计时开启按钮,按钮按下低电平有效,一个扬声器,扬声器在工作时发出声音,PR1上拉排阻,一般可以根据亮度强弱调节电阻大小。

63cab03643d2b151bdf907530d92e75b.png

工程设计

单片机程序设计

程序设计可以分为几部的工作,1,定时器timer()初始化和开启;2,数码管显示驱动模块;3,倒计时器功能设计。4,按键检测和扬声器工作。用定时器主要就是可以做到更精确倒计时,数码管扫描显示也不好抖动,然而刷新显示数码管的周期也要选择一个合理的时间范围,一般不能大于50ms,不然人眼是可以看出来。

d97db1138f2be05323e3416e87a18c1c.png

程序设计

程序代码

#include

#include

typedef unsigned char uint08;

typedef unsigned short int uint16;

typedef unsigned long int uint32;

#define INIT_TIME_VAR 10000 // 10 ms

#define BIT(a) (1<

sbit BezzerIO = P1^6;

//共阴 数码管段码

char code LedDisplayCode1[] =

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//共阳 数码管段码

char code LedDisplayCode2[] =

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

// 数码管显示 缓存

uint08 AppRefreshDisplayBuf[2];

// 数码管显示 开启显示标志

uint08 AppRefreshDisplayflag=0;

uint16 time10msCount;

/*

void delay_ms(uint16 ms)

{

uint16 i,j;

for(i=0;i

{

for(j=0;j<255;j++)

{

_nop_();

}

}

}

*/

// 定时器初始化

void TimerInit()

{

TMOD = 0X01; // 设置工作模式1

TH0 = (65536 - INIT_TIME_VAR)/256;//(65536-X)设定初值10ms,X=10000

TL0 = (65536 - INIT_TIME_VAR)%256; //(65536-X)设定初值10ms,X=10000

EA = 1; // 允许全部中断

ET0 = 1; // 允许定时器中断

TR0 = 1; // 开启定时

}

static uint08 BitFlag=0;

// 刷新显示数码管

void refreshDisplay(void)

{

uint08 code refreshDisplayCode[2]={0x01,0x02};

static uint08 refreshDisplayPt; // 刷新位地址

static uint08 refreshDisplayBuf[2]; // 刷新位段码

if(AppRefreshDisplayflag)

{

refreshDisplayBuf[0] = AppRefreshDisplayBuf[0];

refreshDisplayBuf[1] = AppRefreshDisplayBuf[1];

AppRefreshDisplayflag = 0;

}

refreshDisplayPt ++;

if(refreshDisplayPt>1) refreshDisplayPt=0;

P0 = 0x00; // 关闭上次的数码

P2 = 0x03; // 关闭上次的数码

_nop_();

_nop_();

P2 = refreshDisplayCode[refreshDisplayPt]; // 第一个数码管点亮

P0 = LedDisplayCode1[refreshDisplayBuf[refreshDisplayPt]];

}

void main()

{

uint08 CountDown;

// 定时器初始化

TimerInit();

// 初始化端口

P0 = 0x00;

P2 = 0x00;

P1 = 0x80;

CountDown = 0;

while(1)

{

if(!(P1 & BIT(7)))

{

CountDown = 15;

// 倒计时器 开始运行

AppRefreshDisplayBuf[0] = CountDown%10;

AppRefreshDisplayBuf[1] = CountDown/10%10;

AppRefreshDisplayflag = 1;

time10msCount = 0;

BezzerIO = 0; // 扬声器关闭

}

if( CountDown )

{

if(time10msCount>100) // 1 S

{

time10msCount = 0;

CountDown--;

if( CountDown == 0)

{

BezzerIO = 1; // 扬声器开启

}

// 倒计时器 开始运行

AppRefreshDisplayBuf[0] = CountDown%10;

AppRefreshDisplayBuf[1] = CountDown/10%10;

AppRefreshDisplayflag = 1;

}

}

}

}

void timer1() interrupt 1 //定时2ms

{

TH0 = (65536 - INIT_TIME_VAR)/256;//(65536-X)设定初值10ms,X=10000

TL0 = (65536 - INIT_TIME_VAR)%256; //(65536-X)设定初值10ms,X=10000

refreshDisplay(); // 刷新数码管

time10msCount++;

}

b1b8757435518a31c165de7c914eae66.gif

效果图

转载地址:http://etowx.baihongyu.com/

你可能感兴趣的文章
Eclipse打开时“发现了以元素'd:skin'”开头的无效内容。此处不应含有子元素的解决方法...
查看>>
C#Contains方法的错误理解
查看>>
python实战===一行代码就能搞定的事情!
查看>>
linux卸载一个源码包安装的软件的流程
查看>>
python 基础复习 13
查看>>
该公众号暂时无法提供服务请稍后再试
查看>>
Android自定义组件系列【8】——遮罩文字动画
查看>>
使用OpenCV读取摄像头图像并显示
查看>>
Flask 上下文管理
查看>>
堆排序
查看>>
C++中const用法总结
查看>>
Java基础加强-代理
查看>>
Arduino和C51开发光敏传感器
查看>>
java_泛型方法使用实例
查看>>
guava cache简单学习笔记
查看>>
选课系统
查看>>
无线电导航
查看>>
run-sequence
查看>>
大聊Python----SocketServer
查看>>
Hadoop 面试题 之Hive
查看>>