标题:
单片机单计时器 调做时钟,求给个思路
[打印本页]
作者:
zzffw
时间:
2018-7-6 17:44
标题:
单片机单计时器 调做时钟,求给个思路
#include "BS87D20A-3.h"
#define com1 _pc1
#define com2 _pc0
#define com3 _pc2
#define com4 _pc3
#define key1 _pd2
#define key2 _pd3
#define key3 _pa1
#define key4 _pa4
volatile bit Flag_T1ms;
volatile bit Flag_T5ms;
volatile bit flag_keylong;
volatile bit flag_keyshort;
const unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char strtab[3];//缓冲区
unsigned char key_number=0;
unsigned char sec=0,min=0,hour=0;
unsigned char temp;
unsigned long s; //秒级
unsigned long ms5;
unsigned char keyvalue;
void read_key()
{
static char key_state=0x00,press_20ms;
unsigned char keybak;
keybak=0;
if(!key1)keybak|=0x01;
if(!key2)keybak|=0x02;
if(!key3)keybak|=0x04;
if(!key4)keybak|=0x08;
switch (key_state)
{
case 0x00: // 按键初始态
if (keybak!=0)
{
press_20ms=0;
key_state=0x01; // 键被按下,状态转换到键确认态
}
break;
case 0x01: // 按键确认态
if (keybak!=0)
{
if(++press_20ms>3)
{
key_state=0x02;
press_20ms=0;
keyvalue=keybak;
}
}
else
{
key_state=0x00;
}
break;
case 0x02:
if (keybak==0)
{
flag_keyshort=1;
}
else if(++press_20ms>100)
{
flag_keylong=1;
}
case 0x04:
if(keybak==0)
{
if(++press_20ms>3)
{
key_state=0x00;
}
}
else
{
press_20ms=0;
}
break;
default:
break;
}
}
void key_do()
{
if(flag_keyshort)
{
switch(keyvalue)
{
case 0x01:
break;
case 0x02:
break;
case 0x04:
break;
case 0x08:
break;
default:
break;
}
flag_keyshort=0;
}
}
void displaypro()
{
strtab[0]=tab[sec%10];
strtab[1]=tab[sec/10];
strtab[2]=tab[min%10];
strtab[3]=tab[min/10];
}
void display_drive()
{
com1=1;com2=1;com3=1;com4=1;
switch(temp)
{
case 0:com4=0;
_pb=strtab[temp]; break;
case 1:com3=0;
_pb=strtab[temp]; break;
case 2:com2=0;
_pb=strtab[temp]; break;
case 3:com1=0;
_pb=strtab[temp]; break;
default:break;
}
temp++;
if(temp==4)
temp=0;
}
void init()
{
_ctm0c0=0x20; // fh/16 2us
_ctm0c1=0xc1; // 定时/计数器模式 比较器a ctm0
_ctm0al=0xf4; // 1ms
_ctm0ah=0x01;
_ctm1c0=0x20; // fh/16 2us
_ctm1c1=0xc1; // 定时/计数器模式 比较器a ctm1
_ctm1al=0xf4; // 1ms
_ctm1ah=0x01;
_pbc=0; //输出
_pcc0=0;
_pcc1=0;
_pcc2=0;
_pcc3=0;
_pac1=1;
_pac4=1;
_pdc2=1;
_pdc3=1;
_pdpu3=1;
_pdpu2=1;
_papu1=1;
_papu4=1;
s=1000;
ms5=5;
temp=0;
_mfe=1; //开多功能中断
_ctm1ae=1;
_ctm0ae=1; //CTM a中断使能
_emi=1; //开总中断
_ct0on=1; //开定时器0
_ct1on=1;
}
void main()
{
init();
while(1)
{
if(Flag_T5ms)
{
Flag_T5ms=0;
read_key();
displaypro();
}
GCC_CLRWDT();
}
}
void __attribute__((interrupt(0x20))) ISR_CTM1(void)
{
_ctm1af=0;
ms5--;
if(!ms5)
{
ms5=5;
Flag_T5ms=1;
}
display_drive();
s--;
if(! s)
{
s=1000;//1s电子钟计数
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
void __attribute__((interrupt(0x14))) ISR_CTMO(void)
{
_ctm0af=0;
}
复制代码
作者:
zl2168
时间:
2018-7-7 15:34
本帖最后由 zl2168 于 2018-7-7 15:35 编辑
给你介绍一个正确有效看得懂的参考案例,自己对照查错吧!
实例
94
模拟电子钟(由
80C51
定时器产生秒时基)
先
Proteus
仿真一下,
确认有效。
实例94 模拟电子钟(由80C51定时器产生秒时基).rar
(43.05 KB, 下载次数: 4)
2018-7-7 15:35 上传
点击文件名下载附件
模拟电子钟.jpg
(306.12 KB, 下载次数: 40)
下载附件
2018-7-7 15:35 上传
以上摘自张志良编著《
80C51
单片机仿真设计实例教程
——
基于
Keil C
和
Proteus
》清华大学出版社
ISBN 978-7-302-41682-1
,
内有常用的单片机应用
100
案例,用于仿真实验操作,
电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1