标题:
基于51单片机的时钟设计,包涵源码及仿真电路
[打印本页]
作者:
13321764316
时间:
2018-10-29 15:38
标题:
基于51单片机的时钟设计,包涵源码及仿真电路
这是我这个周用单片机做的时钟,用数码管显示,用定时器来即时。
Clock.zip
(93.36 KB, 下载次数: 15)
2018-10-29 15:34 上传
点击文件名下载附件
程序源码及仿真电路
下载积分: 黑币 -5
QQ截图20181029153400.png
(112.53 KB, 下载次数: 58)
下载附件
2018-10-29 15:35 上传
单片机源程序:
#include"reg51.h"
#define uchar unsigned char
uchar code scan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff,0xbf};
uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
uchar data timedata[3]={0x00,0x00,0x00};
//timedata[0]: 秒计数 timedata[1] :分计数 timedata[2] :小时计数
uchar data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
//ms50:每过50ms加一 con按键按下计数 为1 改变分钟 为2改变小时
//con1 con2
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
void delay1ms(int t)
{
unsigned char a,b;
for(b=0;b<t;b++)
for(a=0;a<120;a++);
}
void keyscan() //按键检测函数
{
EA=0; //关闭总中断
if(key0==0) //判断按键是否按下
{
delay1ms(10); //延时消抖
while(key0==0); //等待按键释放
con++; //计数值加
TR0=0; //关闭定时器0
ET0=0; //关闭定时器0中断
if(con>=3) //若按下3次
{
con=0; //计数值清0
TR0=1; //开启定时器
ET0=1; //开启定时器中断
}
}
if(con!=0) //若按键0按下一次
{
if(key1==0) //如果按键1按下
{
delay1ms(10); //延时消抖
while(key1==0); //等待按键释放
timedata[con]++; //(分/时)自加
if(con==2) //若按下两次
con1=24;
else con1=60;
if(timedata[con]>=con1) //若加到最大值则将0赋值给变量
timedata[con]=0;
}
}
if(con!=0)
{
if(key2==0)
{
delay1ms(10);
while(key2==0);
timedata[con]--;
if(con==2)
con1=23;
else con1=59;
if(timedata[con]<=0)
timedata[con]=con1; //若减到最小值0则将最大值付给变量
}
}
EA=1;
}
void scan()
{
char k;
dis[0]=timedata[0]%10; //显示秒个位数据
dis[1]=timedata[0]/10; //显示秒十位数据
dis[3]=timedata[1]%10; //显示分个位数据
dis[4]=timedata[1]/10; //显示分十位数据
dis[6]=timedata[2]%10; //显示时个位数据
dis[7]=timedata[2]/10; //显示时十位数据
for(k=0;k<8;k++)
{
P0=~dis_7[dis[k]]; //段选端
P2=scan_con[k]; //位选端
delay1ms(1);
P2=0xff; //消影
}
}
void main(void)
{
TMOD=0X01; //开启定时器0
TH0=0X3C; //选择工作方式2
TL0=0XB0; //载入高位初值
TR0=1; //载入低位初值
ET0=1; //开启定时器中断0
EA=1; //全局中断使能
while(1)
{
scan();
keyscan();
}
}
void time_intt0(void) interrupt 1
{
ET0=0; //关闭定时器0中断
TR0=0; //
TH0=0X3C;
TL0=0XB0;
TR0=1; //
ms50++; //50毫秒计数
if(ms50==20) //1秒
{
ms50=0x00;
timedata[0]++;
if(timedata[0]==60)
{
timedata[0]=0;
timedata[1]++;
if(timedata[1]==60)
{
timedata[1]=0;
timedata[2]++;
if(timedata[2]==24)
{
timedata[2]=0;
}
}
}
}
ET0=1;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1