@单片机电子表
先介绍下所要实现的功能
一、按键实现功能
常用的电子表可以利用4个按键实现调整,这四个按键分别为KEY1、KEY2、KEY3、KEY4,其中 1.1KEY1作为调整设定键,按下后进入调整状态,第一次按下在当前时间基础上调小时,第二次按下调分钟,第三次按下调秒,第四次按下在原定闹时间基础上调整定闹的小时,第五次按下调定闹的分钟。再按循环。
1.2 KEY2、KEY3分别对将要调整的对象进行加、减调整,如在调整小时状态下,按下KEY2后,小时加1,按下KEY3后,小时减一。在调整状态下,按下KEY4退出调整。
二、时间显示
小时、分钟和秒的每个数据对象需显示出个位和十位,因此每个时间对象要占用两个数码管显示。在正常走时状态进入调整时间状态后,要求对应的调整对象以周期为1/2s的速率闪烁,以区别正常走时状态。在调时状态下,小时、分钟和秒所在位置不变,但在定闹时间调整时,6个数码管的后四位显示定闹时、分,前两和数码管显示一个特定字符,如“L1”,用来区分调时状态。
三、定闹输出问题
当电子表走时状态下的时间与定闹时间相同时,可以通过控制继电器吸合接通负载动作达到定闹输出目的,也可以驱动蜂鸣器发出声响提示。如果采用有源蜂鸣器时,只需在蜂鸣器上加上高电平即可产生1kHz声响。在本项目中使用的是无源蜂鸣器,其内部只是一个电磁铁和一个铁质共振模,需加上1kHz方波信号时才发出声响,因此需在程序中设计一个产生1kHz左右方波程序,以驱动蜂鸣器发声。
四、介绍一下我的思路
1、电子表的核心是中断服务函数和按键
2、大的思路是:利用按键一的次数来调整模式,第二三 按键来加减,最后一个来退出,封装为key函数。
3、关于调整时间的问题 我们f封装为函数display,调时、调分、调秒,调闹钟的时和分总共五个
五、代码
main函数 主要思路有利用中断服务函数来记录半秒,一秒和一分钟,一小时,第一个调整模式按键记录了六种模式分别为 正常,调时,调分,调秒,调闹钟的时和分
#include<reg51.h>
sbit P1_0=P1^0;
sbit P3_2=P3^2;
unsigned char key_mode ;
unsigned int code seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 声明数组
char sec=55,min=30,hour=12,hour_n,min_n;
unsigned char cp1,cp2,flash;
unsigned int cp;
#include<key.c>
#include<diaplay.c>
void timer0_isr(void) interrupt 1
{
TH0=(65535-2000)/255; // 2ms
TL0=(65535-2000)%255;
cp++;
if(cp>=250) //半秒
{
cp=0;
flash=~flash; // 小数点闪烁
if(key_mode==0) cp2++; //判断模式
}
if(cp2>=2) // 1m
{
cp2=0;
sec++;
if(sec>=60){sec=0;min++;}
if(min>=60){min=0;hour++;}
if(hour>=24)hour=0;
}
P0=0xff;//消隐
//锁存器所存
//key();
if(key_mode==0)diaplay0();
if(key_mode==1)diaplay1();
if(key_mode==2)diaplay2();
if(key_mode==3)diaplay3();
if(key_mode==4)diaplay4();
if(key_mode==5)diaplay5();
cp1++;
if(cp1>=8)
cp1=0;
}
void timer0_init(void)
{
TMOD=0x01;
TH0=(65536-2000)/256;
TH0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main(void)
{
timer0_init() ; //初始化
while(1)
{
key();
if(hour==hour_n&&min==min_n)
P3_2=0;
else
P3_2=1;
}
}
下面时key函数
sbit key_set=P2^0;
sbit key_up=P2^1;
sbit key_down=P2^2;
sbit key_rst=P2^3;
void delay(unsigned int x)
{while(x--);}
void key(void)
{
if(key_set==0)
{
delay(300);
if(key_set==0)
{
key_mode++;
if(key_mode>=6)
key_mode=1;
}
while(key_set==0);
}
if(key_rst==0)
{ delay(500);
if(key_rst==0)
{
key_mode=0;
}
while(key_rst==0);
}
if(key_up==0)
{
delay(500);
if(key_up==0)
{
if(key_mode==1) sec++;if(sec>=60)sec=59;
if(key_mode==2) min++;if(sec>=60)min=59;
if(key_mode==3) hour++;if(hour>=24)hour=23;
if(key_mode==4) hour_n++;if(hour_n>=24)hour_n=59;
if(key_mode==5) min_n++;if(min_n>=60)min_n=59;
}
while(key_up==0);
}
if(key_down==0)
{
delay(500);
if(key_down==0)
{
if(key_mode==1) sec--;if(sec<=0)sec=0;
if(key_mode==2) min--;if(min<=0)min=0;
if(key_mode==3) hour--;if(hour<=0)hour=0;
if(key_mode==4) hour_n--;if(hour_n<=0)hour_n=0;
if(key_mode==5) min_n--;if(min_n<=0)min_n=0;
}
while(key_down==0);
}
}
diapllay函数
void diaplay0(void)
{
switch(cp1)
{
case 0:P1_0=0; P0=0x01; P1_0=1; P1_0=0; P0=seven_seg[sec% 10]; break;
case 1:P1_0=0; P0=0x02; P1_0=1; P1_0=0; P0=seven_seg[sec/10]; break;
case 2:P1_0=0; P0=0x04; P1_0=1; P1_0=0; P0=0xbf |flash; break;
case 3:P1_0=0; P0=0x08; P1_0=1; P1_0=0; P0=seven_seg[min% 10]; break;
case 4:P1_0=0; P0=0x10; P1_0=1; P1_0=0; P0=seven_seg[min /10]; break;
case 5:P1_0=0; P0=0x20; P1_0=1; P1_0=0; P0=0xbf|flash; break;
case 6:P1_0=0; P0=0x40; P1_0=1; P1_0=0; P0=seven_seg[hour% 10]; break;
case 7:P1_0=0; P0=0x80; P1_0=1; P1_0=0; P0=seven_seg[hour/10]; break;
}
}
void diaplay1(void)
{
switch(cp1)
{
case 0:P1_0=0; P0=0x01; P1_0=1; P1_0=0; P0=seven_seg[sec% 10]|flash; break;
case 1:P1_0=0; P0=0x02; P1_0=1; P1_0=0; P0=seven_seg[sec/10]|flash; break;
case 2:P1_0=0; P0=0x04; P1_0=1; P1_0=0; P0=0xbf ; break;
case 3:P1_0=0; P0=0x08; P1_0=1; P1_0=0; P0=seven_seg[min% 10]; break;
case 4:P1_0=0; P0=0x10; P1_0=1; P1_0=0; P0=seven_seg[min /10]; break;
case 5:P1_0=0; P0=0x20; P1_0=1; P1_0=0; P0=0xbf; break;
case 6:P1_0=0; P0=0x40; P1_0=1; P1_0=0; P0=seven_seg[hour% 10]; break;
case 7:P1_0=0; P0=0x80; P1_0=1; P1_0=0; P0=seven_seg[hour/10]; break;
}
}
void diaplay2(void)
{
switch(cp1)
{
case 0:P1_0=0; P0=0x01; P1_0=1; P1_0=0; P0=seven_seg[sec% 10]; break;
case 1:P1_0=0; P0=0x02; P1_0=1; P1_0=0; P0=seven_seg[sec/10]; break;
case 2:P1_0=0; P0=0x04; P1_0=1; P1_0=0; P0=0xbf ; break;
case 3:P1_0=0; P0=0x08; P1_0=1; P1_0=0; P0=seven_seg[min% 10]|flash; break;
case 4:P1_0=0; P0=0x10; P1_0=1; P1_0=0; P0=seven_seg[min /10]|flash; break;
case 5:P1_0=0; P0=0x20; P1_0=1; P1_0=0; P0=0xbf; break;
case 6:P1_0=0; P0=0x40; P1_0=1; P1_0=0; P0=seven_seg[hour% 10]; break;
case 7:P1_0=0; P0=0x80; P1_0=1; P1_0=0; P0=seven_seg[hour/10]; break;
}
}
void diaplay3(void)
{
switch(cp1)
{
case 0:P1_0=0; P0=0x01; P1_0=1; P1_0=0; P0=seven_seg[sec% 10]; break;
case 1:P1_0=0; P0=0x02; P1_0=1; P1_0=0; P0=seven_seg[sec/10]; break;
case 2:P1_0=0; P0=0x04; P1_0=1; P1_0=0; P0=0xbf ; break;
case 3:P1_0=0; P0=0x08; P1_0=1; P1_0=0; P0=seven_seg[min% 10]; break;
case 4:P1_0=0; P0=0x10; P1_0=1; P1_0=0; P0=seven_seg[min /10]; break;
case 5:P1_0=0; P0=0x20; P1_0=1; P1_0=0; P0=0xbf; break;
case 6:P1_0=0; P0=0x40; P1_0=1; P1_0=0; P0=seven_seg[hour% 10]|flash; break;
case 7:P1_0=0; P0=0x80; P1_0=1; P1_0=0; P0=seven_seg[hour/10]|flash; break;
}
}
void diaplay4(void)
{
switch(cp1)
{
case 0:P1_0=0; P0=0x01; P1_0=1; P1_0=0; P0=seven_seg[min_n% 10]; break;
case 1:P1_0=0; P0=0x02; P1_0=1; P1_0=0; P0=seven_seg[min_n/10]; break;
case 2:P1_0=0; P0=0x04; P1_0=1; P1_0=0; P0=0xbf ; break;
case 3:P1_0=0; P0=0x08; P1_0=1; P1_0=0; P0=seven_seg[hour_n% 10]|flash; break;
case 4:P1_0=0; P0=0x10; P1_0=1; P1_0=0; P0=seven_seg[hour_n/10]|flash; break;
case 5:P1_0=0; P0=0x20; P1_0=1; P1_0=0; P0=0xbf; break;
case 6:P1_0=0; P0=0x40; P1_0=1; P1_0=0; P0=0xc0; break;
case 7:P1_0=0; P0=0x80; P1_0=1; P1_0=0; P0=0xc8; break;
}
}
void diaplay5(void)
{
switch(cp1)
{
case 0:P1_0=0; P0=0x01; P1_0=1; P1_0=0; P0=seven_seg[min_n% 10]|flash; break;
case 1:P1_0=0; P0=0x02; P1_0=1; P1_0=0; P0=seven_seg[min_n/10]|flash; break;
case 2:P1_0=0; P0=0x04; P1_0=1; P1_0=0; P0=0xbf ; break;
case 3:P1_0=0; P0=0x08; P1_0=1; P1_0=0; P0=seven_seg[hour_n% 10]; break;
case 4:P1_0=0; P0=0x10; P1_0=1; P1_0=0; P0=seven_seg[hour_n/10]; break;
case 5:P1_0=0; P0=0x20; P1_0=1; P1_0=0; P0=0xbf; break;
case 6:P1_0=0; P0=0x40; P1_0=1; P1_0=0; P0=0xc0; break;
case 7:P1_0=0; P0=0x80; P1_0=1; P1_0=0; P0=0xc8; break;
}
}
六、仿真电路
欢迎指教,这是为了期末考试复习一遍才写的 ~~hahaha