定时器应用例子源码

发布者:渤海湾最新更新时间:2017-11-30 来源: eefocus关键字:定时器  源码 手机看文章 扫描二维码
随时随地手机看文章

#include "stdio.h"
#include "reg51.h"

// 0 - 9 的编码
unsigned char code table[] = { 0x11,0xb7,0x29,0x23,0x87,0x43,0x41,0x37,0x01,0x03,0x00 } ;
unsigned int count2 ;

//第1-6 位的片选线
unsigned char code dig[] = { 0x7f,0xfd,0xdf,0xf7,0xef,0xfb } ;
unsigned char buffer[8],val[6] ;
unsigned char count1,scan,i,ch,KeyVal,modify,OverTime ;
bit fKey,fSec,Key1,Key2,Key3,OldKey1,OldKey2,OldKey3,blink,fTimer,fSTOP ;
unsigned long int cn,tmp ;

void init(void) ; 
void display(void) ;
void Cal_cn(void) ;
void Cal_val(void) ;

main()
{
init() ;


while(1) {


if(fSec) { // 秒标志被置位?
fSec = 0 ; // 清除秒标志
if(!fSTOP && modify==0) {
if(cn!=0) cn-- ; else { fTimer = 1 ; fSTOP = 1 ; }
}
display() ;
}


if(fKey) { // 有按键按下?
fKey = 0 ; // 清除按件标志,并处理该按键

if(KeyVal==1) { // 是调整按钮?
fSTOP = 0 ; modify++ ; // 进入相应状态,并重置超时定时器
if(modify==7) { modify = 0 ; OverTime = 0 ; } else OverTime = 10 ;
}

if(KeyVal==2 && modify!=0) { // +1按钮,相应位+1
Cal_val() ;
if(val[modify-1]<9) val[modify-1]++ ;
Cal_cn() ;
display() ; OverTime = 10 ; // 刷新显示,并重置超时定时器
}

if(KeyVal==3 && modify!=0) { // -1按钮,相应位-1
Cal_val() ;
if(val[modify-1]>0) val[modify-1]-- ;
Cal_cn() ;
display() ; OverTime = 10 ; // 刷新显示,并重置超时定时器
}

}

}
}

void init(void) {

count1 = count2 = 0 ; scan = 0 ; KeyVal = 0 ;
cn = 0 ; for(i=0 ;i<6 ;i++) val = 0 ;
fKey = 0 ; modify = 0 ; blink = 0 ; OverTime = 0 ; fTimer = 0 ; fSTOP = 0 ;
Key1 = Key2 = Key3 = 0 ;
OldKey1 = OldKey2 = OldKey3 = 1 ;

for(i=0 ;i<6 ;i++) buffer = 0 ;

TCON &= 0xCF ; // 初始化Timer0
TMOD &= 0xF0 ; 
TMOD |= 0x01 ; 
TH0 = TL0 = 0 ; 
EA = 1 ;
ET0 = 1 ;
TR0 = 1 ;

}


timerint () interrupt 1 {

TR0 = 0 ;
TL0 = 0x12 ;
TH0 = 0xf7 ; // 0xf712 for 2.5ms
TR0 = 1 ;


if(scan==1 && !fKey) { // 扫描调整按钮
Key1 = P30 ;
if(!Key1 && OldKey1) { fKey = 1 ; KeyVal = 1 ; }
}


if(scan==3 && !fKey) { // 扫描+1按钮
Key2 = P30 ;
if(!Key2 && OldKey2) { fKey = 1 ; KeyVal = 2 ; }
}

if(scan==4 && !fKey) { // 扫描-1按钮
Key3 = P30 ;
if(!Key3 && OldKey3) { fKey = 1 ; KeyVal = 3 ; }
}

OldKey1 = Key1 ; OldKey2 = Key2 ; OldKey3 = Key3 ;


P1 = 0xff ; P3 = dig[scan] ;
ch = buffer[scan] ; // 依次显示6位

if(modify==0) {
if(fTimer) P1 = table[ch] & 0xfe ; // 倒计时结束,启动P10(P10低电平)
else P1 = table[ch] ;
}
else if(modify==1 && blink && scan==0) P1 = 0xff ;
else if(modify==2 && blink && scan==1) P1 = 0xff ;
else if(modify==3 && blink && scan==2) P1 = 0xff ; 
else if(modify==4 && blink && scan==3) P1 = 0xff ; 
else if(modify==5 && blink && scan==4) P1 = 0xff ;
else if(modify==6 && blink && scan==5) P1 = 0xff ;
else P1 = table[ch] ;

scan++ ; if(scan==6) scan = 0 ;

count1++ ;
if(count1==200) { count1 = 0 ; blink = ~blink ; } // 0.5s闪烁定时器

count2++ ; 
if(count2==400) {
count2 = 0 ; fSec = 1 ; fTimer = 0 ; // 秒脉冲标志置位,并关闭P10输出

if(OverTime) { OverTime-- ; if(OverTime==0) modify = 0 ; } // 10s超时定时器

}

}

void Cal_cn(void) {

cn = 0 ;
for(i=0 ;i<6 ;i++) {
cn *= 10 ; cn += val ;
}

}

void Cal_val(void) {

tmp = cn ;
for(i=0 ;i<6 ;i++) {
val[5-i] =(unsigned char) ( tmp % 10 ) ;
tmp = tmp / 10 ;
}

}

void display(void) {

tmp = cn ;
for(i=0 ;i<6 ;i++) {
buffer[5-i] =(unsigned char) ( tmp % 10 ) ;
tmp = tmp / 10 ;
}

}


关键字:定时器  源码 引用地址:定时器应用例子源码

上一篇:微型打印机C51控制程序
下一篇:51基址偏址的间接寻址方式详解

推荐阅读最新更新时间:2024-03-16 15:47

stm32 基于TIM1定时器的PWM输出
void PWM_TIM1(uint16_t arr,uint16_t psc) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //定时器TIM1时钟使能 TIM_DeInit(TIM1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Period =arr; //设置用来作为TIMx时钟频率出书的预分频值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟分割 TIM_TimeBaseStru
[单片机]
MEGA16单片机定时器(16位)源代码
/* 程序名: mega16a 芯片16位定时计数器; 概括: 学会了控制8位定时器,16位定时器和它如出一辙,It's a piece of cake! 在芯片开发板上实现精确一秒闪烁... 心得 : 电子技术和音乐一样 ,都是一门艺术,令人回味... finish time: 2014年3月8日19:33:10; 作者 : 肖邦; */ #include avr/io.h //头文件; typedef unsigned char uint8 ; //在程序中用 uint8 相当于写 unsigned cha
[单片机]
MSP430-Timer(三)
查询数据手册可知,有四个定时器,分别是TimerA0,A1,A2,B0,接下来主要针对TimerA进行主要探究. Timer_A介绍 Timer_A是一个16位的计时器/计数器,有多达7个捕获/比较寄存器。 Timer_A可以支持多个捕获/比较,PWM输出,间隔计时。 Timer_A还具有广泛的中断功能。在溢出条件下,可以从计数器和每个捕获/比较寄存器中生成中断。 Timer_A功能包括:异步16位定时器/计数器,四种操作模式可选择和可配置的时钟源最多可配置7个捕获/比较寄存器具有脉宽调制(PWM)能力的可配置输出异步输入和输出闭锁 中断向量寄存器用于快速解码 单脉冲的PWM输出 1.设置IO口为输出模式 //P2.0
[单片机]
MSP430-Timer(三)
STM32CubeMX系列 | 定时器中断
1. 定时器中断简介 STM32的定时器功能十分强大,有高级定时器(TIM1和TIM8)、通用定时器(TIM2~TIM5)和基本定时器(TIM6和TIM7);本实验主要介绍难度适中的通用定时器,通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。 使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。 每个定时器都是完全独立的,没有互相共享任何资源。 通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括: 16位向上、向下、向上/向下自动装载计数器 16位
[单片机]
C8051F与80C51系列单片机的不同初始化
1 引言 近30年来,世界各主要电子元器件生产厂商纷纷推出自己各具特色的单片机产品。而在百花齐放的单片机家族中,80C5l系列一直扮演着重要的角色。该单片机在教学、科研等领域已经成为入门单片机并成为单片机应用的首选,该产品以其易读性好、扩展能力强而著称,从而成为广大从事单片机开发者最熟悉、最具代表的机型。但人们往往在熟悉80C51单片机之后又选择别的系列单片机开发产品,这是因为80C51具有运算速度慢、功耗大、内部资源少等不足,所以限制了其使用范围。Cygnal公司推出的C805lF系列单片机既弥补了80C51系列的不足,又与MCS—5l指令集兼容。C805lFxxx系列单片机是完全集成的混合信号系统级芯片,具有与8051指令集
[单片机]
Atmega16的定时器2使用
//经验正以下程序是正确的,可以实现LED 1s亮 1s灭 #include avr/io.h #include avr/interrupt.h #define uchar unsigned char #define uint unsigned int uint count; void init() { DDRB|=_BV(PB4)|_BV(PB5)|_BV(PB6)|_BV(PB7); PORTB&=~(_BV(PB4)|_BV(PB5)|_BV(PB6)|_BV(PB7)); TCNT2=155;//初值为155,即记数到255-155=100次溢出并进入定时器2中断函数 TIMSK|=_BV(TOIE2);//溢出
[单片机]
ATmega16的定时器0、1、2的比较
定时器0和2的ctc模式可生成任意频率占空比50%的方波, 快速pwm和相位修正pwm模式可产生任意占空比的方波。 但是其频率只和分频系数有关,这样就无法调节频率,只能调节占空比。 但是定时器1可以设定一个比较匹配和一个可调的top值来达到真正的调频调占空比
[单片机]
PIC18F4520定时器初值设置
PIC18F4520运行一条指令所需的时间,等于4个机器周期=1us(4M晶振) 定时器初值设置:以5ms为例 TMR0H=(65536-5000)/256=0XEC; TMR0L=(65536-5000)%256=0X77;
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved