/******************************************************************************************
名称:功能完备的数字钟
共有6种工作模式:正常计时、按键调时、按键调分、按键调秒、闹钟调时、
闹钟调秒,按设置键切换工作模式。
本数字钟能够自动在显示时间与显示温度之间进行切换,切换过程如下:
显示时间15S——>显示温度5S——>显示时间15S——>显示温度5S……………… 如此循环!
******************************************************************************************/
#include<reg52.h>
#include"DS18B20.H"
#define uint unsigned int
#define uchar unsigned char
uchar code segcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc6};
//0,1,2,3,4,5,6,7,8,9,-,C
uchar code dispbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选码
uchar buffer[]={0,0,0,0,0,0,0,0};
uint hour,min,sec;
uint ringhour,ringmin;
uint status,T;
sbit beep=P1^0; //闹钟
bit ringoff;
bit flag;
void keyprocess(unsigned char);
/**********延时函数************/
void delayMS(uint t) // 晶振频率12M
{
uint i;
while(t--)
for(i=0;i<125;i++);
}
void delay() //闹铃的延时
{
uint m,n;
for(m=0;m<20;m++)
for(n=0;n<20;n++);
}
/************数码管显示函数****************/
void display()
{
uchar i,j;
if (status==4||status==5) //闹钟调时、调分状态
{
buffer[0]=ringhour/10;
buffer[1]=ringhour%10;
buffer[3]=ringmin/10; // 显示分的十位
buffer[4]=ringmin%10; // 显示分的个位
for(i=0;i<8;i++)
{
P0=segcode[buffer[i]];
P2=dispbit[i];
delayMS(1); //防止数码管显示的时候闪动
P2=0x0;
}
}
else if(status==0&&flag==1) //显示温度
{
buffer[5]=T/100;
buffer[6]=T/10%10;
buffer[7]=11;
for(j=5;j<8;j++)
{
P0=segcode[buffer[j]];
P2=dispbit[j];
delayMS(1); //防止数码管显示的时候闪动
P2=0x0;
}
}
else //正常计时显示
{
buffer[0]=hour/10; // 显示时的十位
buffer[1]=hour%10; // 显示时的个位
buffer[2]=10; // 显示‘-’
buffer[3]=min/10; // 显示分的十位
buffer[4]=min%10; // 显示分的个位
buffer[5]=10;
buffer[6]=sec/10; // 显示秒的十位
buffer[7]=sec%10; // 显示秒的个位
for(i=0;i<8;i++)
{
P0=segcode[buffer[i]];
P2=dispbit[i];
delayMS(1); //防止数码管显示的时候闪动
P2=0x0;
}
}
}
main() //主函数
{
bit keyrelease;
uchar buf;
uchar keyinput;
keyrelease=1;
buf=0xff;
ringoff=1;
TMOD=0x01; //T0工作在方式1,16位计数器
TH0=(65536-1000)/256; // 定时器0设置延时1ms中断初始值
TL0=(65536-1000)%256;
TR0=1;
IE=0x82; //开定时器0中断
status=0;
while(1) //死巡环
{
/****************************************************
键扫描程序,全扫描,逐行扫描。按键弹起后才处理
*****************************************************/
keyinput=P1&0xf0;
if(keyinput!=0xf0)
{
delayMS(10);
if(keyinput!=0xf0)
{
if(keyrelease==1)
{
keyrelease=0;
buf = keyinput; //buf用来暂时存放键值
}
}
else
{
keyrelease=1;
keyprocess(buf); //调用按键处理函数
// display();
buf = 0xff;
}
}
else
{
keyrelease=1;
keyprocess(buf);
// display();
buf=0xff;
}
if(ringoff==0&&hour==ringhour&&min==ringmin) //闹钟打开,定时报警,报警时长1分钟
{ beep=0;
delay();
beep=1; }
T = ReadTemperature();
display();
}
}
/***************定时器0中断函数****************/
void timer0() interrupt 1 using 2
{
static uint count;
TH0=(65536-1000)/256; // 定时器0设置初始值1ms中断初始值
TL0=(65536-1000)%256;
TR0=1;
count++; //正常计时
if(count>=1000) // 定时 1S 到,以下为时钟的正常走钟逻辑
{
count=0;
sec++;
if(sec>= 60)
{
sec=0; min++;
if(min>= 60)
{
min=0; hour++;
if(hour>= 24)
{
hour=0;
}
}
}
if(sec==15||sec==35||sec==55) flag=1;
else if(sec==20||sec==40||sec==0) flag=0;
}
}
/**************按键处理函数***************/
void keyprocess(unsigned char key) //键值处理,6种状态,正常计时,设置时分秒,设置闹铃时分
{
switch (key)
{
case 0xe0:status++; //按下设置键
if (status>=6) status = 0;
break;
case 0xd0:switch(status) //按下加1键,5种模式下加1
{
case 0x01:if(hour<23) hour++;
else hour=0; break;
case 0x02:if(min<59) min++;
else min=0; break;
case 0x03:if(sec<59) sec++;
else sec=0; break;
case 0x04:if(ringhour<23) ringhour++;
else ringhour=0; break;
case 0x05:if(ringmin<59) ringmin++;
else ringmin=0; break;
}
break;
case 0xb0:switch(status) //按下减1键
{
case 0x01:if(hour>0) hour--;
else hour=23; break;
case 0x02:if(min>0) min--;
else min=59; break;
case 0x03:if(sec>0) sec--;
else sec=59; break;
case 0x04:if(ringhour>0) ringhour--;
else ringhour=23; break;
case 0x05:if(ringmin>0) ringmin--;
else ringmin=59; break;
}
break;
case 0x70: ringoff=~ringoff; //闹钟的开和关
break;
default:break;
}
}
shizizhong.zip_数字钟_自动循环
版权申诉
37 浏览量
2022-09-24
02:57:28
上传
评论
收藏 100KB ZIP 举报
四散
- 粉丝: 52
- 资源: 1万+
最新资源
- typora-x64-v0.9.93,windows,64位,markdown工具,文本编辑器
- 基于C语言的neon_osd_Draw ARM Neon加速OSD点阵设计源码
- 目标检测-工地工人安全设备佩戴检测数据集-3500张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本+训练日志
- 运筹学运输问题综合实验的实验报告
- home - 副本.vue
- imageProcess.py
- typora-linux-v0.11.18-amd64,linux,64位,markdown工具,文本编辑器
- 基于Java的sky-take-out云霄外卖管理系统设计源码
- SAP-可用性检查应用测试.docx
- 基于Javascript的cgb网页设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈