基于51单片机的简易电子时钟
功能要求:显示基本的时、分、秒,并且有按键可以用于暂停(启动)、清零、调时功能。
功能实现思路:设置四个按键分别用于总开关(启动/暂停)、调时移位(切换调整的是小时还是分钟)、调时(加)、清零
电路连接:(Proteus仿真)
单片机原理及其应用课程实验作业,做的不好,代码写的很烂,仅供参考,大佬别骂qaq
Keil uVision5编程+Proteus 8 Professional仿真
AT89C51、7SEG-MPX6-CA、BUTTON、LED-BLUE、RES
代码部分:
#include <reg51.h>
#define uchar unsigned char
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit bt4=P3^0;
sbit bt3=P3^1;
sbit bt2=P3^2;
sbit bt1=P3^3;
sbit LED=P1^2;
sbit LED2=P1^1;
sbit LED3=P1^0;
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar dgt[8]={2,1,5,9,5,5,0,0};
uchar i=0,j=0;
unsigned int t0=0,t1=0,k=1;
void delay(unsigned int d)
{
while(d--);
}
void Timer0Init(void)
{
TMOD &=0xf0;
TMOD |=0x01;
TL0=t0;
TH0=t0>>8;
ET0=1;
TR0=1;
}
void Timer1Init(void)
{
TMOD &=0x0f;
TMOD |=0x10;
TL1=t1;
TH1=t1>>8;
ET1=1;
TR1=1;
}
void ButtonScan(void)
{
static bit flag=0;
if(bt1 == 0)
{
delay(300);
while(bt1 == 0);
if(flag==0)
{
flag=1,TR1=0;
LED = !LED;
}
else
{
flag=0,TR1=1;
LED = !LED;
}
}
if(bt2 == 0)
{
delay(300);
while(bt2 == 0);
if(k>=3)
{
k=1;
LED2=!LED2;
LED3=!LED3;
}
else
{
k=k+2;
LED3=!LED3;
LED2=!LED2;
}
}
if(bt3 == 0)
{
delay(300);
while(bt3 == 0);
{
if(k==1&dgt[0]<3&dgt[1]<9)
{
dgt[1]++;
}
else if(k==1&dgt[0]<3&dgt[1]==9)
{
dgt[1]=0;
dgt[0]++;
}
else if(k==1&dgt[0]==2&dgt[1]>3)
{
dgt[1]=0;
dgt[0]=0;
}
else if(k==3&dgt[2]<6&dgt[3]<9)
{
dgt[3]++;
}
else if(k==3&dgt[2]<5&dgt[3]==9)
{
dgt[3]=0;
dgt[2]++;
}
else if(k==3&dgt[2]==5&dgt[3]==9)
{
dgt[3]=0;
dgt[2]=0;
}
}
}
if(bt4 == 0)
{
delay(300);
while(bt4 == 0);
{
dgt[0]=0;
dgt[1]=0;
dgt[2]=0;
dgt[3]=0;
dgt[4]=0;
dgt[5]=0;
dgt[6]=0;
dgt[7]=0;
}
}
}
int main(void)
{
P1 = 0x00;
t0=65536-1000;
t1=65536-13500;
Timer0Init();
Timer1Init();
EA=1;
LED2=!LED2;
while(1)
{
ButtonScan();
}
}
void Time0(void) interrupt 1
{
TL0=t0;
TH0=t0>>8;
switch(i)
{
case 0:P27=0;P20=1;P0=table[dgt[i]];break;
case 1:P20=0;P21=1;P0=table[dgt[i]];break;
case 2:P21=0;P22=1;P0=table[dgt[i]];break;
case 3:P22=0;P23=1;P0=table[dgt[i]];break;
case 4:P23=0;P24=1;P0=table[dgt[i]];break;
case 5:P24=0;P25=1;P0=table[dgt[i]];break;
case 6:P25=0;P26=1;P0=table[dgt[i]];break;
case 7:P26=0;P27=1;P0=table[dgt[i]];break;
}
i++;
if(i>7)
i=0;
if(k==1&dgt[0]==2&dgt[1]>3)
{
dgt[1]=0;
dgt[0]=0;
}
}
void Time1(void) interrupt 3
{
TL1=t1;
TH1=t1>>8;
dgt[7]++;
if(dgt[7]>9)
{
dgt[7]=0; dgt[6]++;
if(dgt[6]>5)
{
dgt[6]=0;dgt[5]++;
if(dgt[5]>9)
{
dgt[5]=0;dgt[4]++;
if(dgt[4]>5)
{
dgt[4]=0;dgt[3]++;
if(dgt[3]>9)
{
dgt[3]=0;dgt[2]++;
if(dgt[2]>5)
{
dgt[2]=0;dgt[1]++;
if(dgt[2]>2)
{
dgt[1]=0;dgt[0]++;
dgt[0]=0;
}
}
}
}
}
}
}
if(dgt[0]==2&dgt[1]>3)
{
dgt[0]=0;
dgt[1]=0;
}
}
switch(i)
{
case 0:P27=0;P20=1;P0=table[dgt[i]];break;
case 1:P20=0;P21=1;P0=table[dgt[i]];break;
case 2:P21=0;P22=1;P0=table[dgt[i]];break;
case 3:P22=0;P23=1;P0=table[dgt[i]];break;
case 4:P23=0;P24=1;P0=table[dgt[i]];break;
case 5:P24=0;P25=1;P0=table[dgt[i]];break;
case 6:P25=0;P26=1;P0=table[dgt[i]];break;
case 7:P26=0;P27=1;P0=table[dgt[i]];break;
}
i++;
if(i>7)
i=0;
if(k==1&dgt[0]==2&dgt[1]>3)
{
dgt[1]=0;
dgt[0]=0;
}
仿真测试:
一切正常
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 时易よへん
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果