单片机c语言编程 时钟加日历转换,单片机C语言电子时钟加日历显示编程
一、
任务和要求设计制作一个电子表并且能够显示日历,用LED数码管直接显示,并且能够通过按键调整时间、年月日,功能为按第一个键被调整的相应调整区域开始闪烁,第二个键加一,第三个减一,第四个确认,最后一个在时分秒和年月日中间相互切换。
二、方案论证
我们在这里选用了C8051F单片机,它是完全集成的混合信号系统级芯片(SoC),具有与8051兼容的高速CIP-51内核,与MCS-51指令集完全兼容,片内集成了数据采集和控制系统中常用的模拟、数字外设及其他功能部件;内置FLASH程序存储器、内部RAM,大部分器件内部还有位于外部数据存储器空间的RAM,即XRAM。C8051F单片机具有片内调试电路,通过4脚的JTAG接口可以进行非侵入式、全速的在系统调试。
三、 系统硬件电路设计
该系统分为两个部分,主控电路和扫描电路,其中键盘扫描和LED扫描为今后节省I/O口线,我将键盘的扫描和LED的扫描共用,在扫描LED的同时也扫描键盘,这样不但方便,而且为今后的扩展留下了相当大的余地。
3.1主控制器
单片机使用c8051f310,并且使用它的开发板易于烧录,改变程序和外围电路。
3.2显示电路
显示板因为常用,是我自己画出来交给工厂做的,采用4个两位共阳数码管,从P0口输出,8位段码分别和P0相接,通过定时器实现秒钟的加一,又因为310有推挽输出,所以不必再加外部电路对数码管进行驱动,直接将它们与P0口相连就可以
3.3键盘电路
键盘是是与数码管的位选相连,通过二极管使它们具有单向性,同时将开头最终通过三极管接单片机的P3.4,只要有按键按下,P3.4就一定会发生变化,通过这个变化在去扫描位就可以得出是哪个按键了。
附电路图:
四、系统程序设计系统和程序主要包括:显示程序,键盘扫描程序,自动加秒,分,时,日,月,年,
附程序:
#include "c8051f310.h"
#define uchar unsigned char
#define unchar unsigned char
uchar code duan[10]
={0xa0,0xbd,0x26,0x2c,0x39,0x68,0x60,0xad,0x20,0x28};
//段码表 0 1 2 3 4 5 6 7 8 9
uchar code
wei[8]={0x02,0x01,0x08,0x04,0x20,0x10,0x80,0x40};//位码表
uchar code week1[7]={0xbd,0x26,0x2c,0x39,0x68,0x60,0xad}
;//星期一到星期日
uchar
dataa,sec,min,hour,ymd,year,year1=9,year2=20,month=8,day=22,week=6;//初始值是7-00:00:00,日期是2009-08-22;
uchar n,cnt,sw1=0,sw2,sw3,cnt1,sw5;
uchar key1,key2,key3,key4=0,key5=0;
sbit P3_4=P3^4;
void scan_key(void);
void delay(ms);
void init(void)
{
IE =0x8A;
TCON =0x50;
TMOD =0x11;
IP =0x0A;
TH0 =(65536-1270)/256;
TL0 =(65536-1270)%256;
TH1 =(65536-500)/256;
TL1 =(65536-500)%256;
}
void time0(void) interrupt 1
{
TH0 =(65536-1270)/256;
TL0 =(65536-1270)%256;
dataa++;
if(sw1!=0&&key4==0)
//第一个按键按下,且第四个没有按下
{
if(++cnt1==40)
{
cnt=0;
if(sw5==0&&sw1==1)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0xf3; //闪烁程序
P0 =duan[sec%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[sec/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[hour%10];
P1 =wei[4];
delay(8);
P1 =0x00;
P0 =duan[hour/10];
P1 =wei[5];
delay(8);
P1=0x00;
P0 =0x7f;
P1 =wei[6];
delay(8);
P1=0x00;
P0 =week1[week];
P1 =wei[7];
delay(8);
}
scan_key();
}
if(sw5==0&&sw1==2)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0xcf;
P0 =duan[sec%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[sec/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[min%10];
P1 =wei[2];
delay(8);
P1 =0x00;
P0 =duan[min/10];
P1 =wei[3];
delay(8);
P1 =0x00;
P0 =0x7f;
P1 =wei[6];
delay(8);
P1 =0x00;
P0 =week1[week];
P1 =wei[7];
delay(8);
}
scan_key();
}
if(sw5==0&&sw1==3)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0x7f;
P0 =duan[sec%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[sec/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[min%10];
P1 =wei[2];
delay(8);
P1 =0x00;
P0 =duan[min/10];
P1 =wei[3];
delay(8);
P1=0x00;
P0=duan[hour%10];
P1=wei[4];
delay(8);
P1 =0x00;
P0 =duan[hour/10];
P1 =wei[5];
delay(8);
P1 =0x00;
P0 =0x7f;
P1 =wei[6];
delay(8);
}
scan_key();
}
if(sw5==1&&sw1==9)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0x3f;
P0 =duan[month%10];
P1 =wei[2];
delay(8);
P1 =0x00;
P0 =duan[month/10];
P1 =wei[3];
delay(8);
P1 =0x00;
P0 =duan[year1%10];
P1 =wei[4];
delay(8);
P1 =0x00;
P0 =duan[year1/10];
P1 =wei[5];
delay(8);
P1 =0x00;
P0 =duan[year2%10];
P1 =wei[6];
delay(8);
P1 =0x00;
P0 =duan[year2/10];
P1 =wei[7];
delay(8);
}
scan_key();
}
if(sw5==1&&sw1==8)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0xf3;
P0 =duan[day%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[day/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[year1%10];
P1 =wei[4];
delay(8);
P1 =0x00;
P0 =duan[year1/10];
P1 =wei[5];
delay(8);
P1 =0x00;
P0 =duan[year2%10];
P1 =wei[6];
delay(8);
P1 =0x00;
P0 =duan[year2/10];
P1 =wei[7];
delay(8);
}
scan_key();
}
if(sw5==1&&sw1==7)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0xc3;
P0 =duan[day%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[day/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[month%10];
P1 =wei[2];
delay(8);
P1 =0x00;
P0 =duan[month/10];
P1 =wei[3];
delay(8);
P1 =0x00;
P0 =duan[year2%10];
P1 =wei[6];
delay(8);
P1 =0x00;
P0 =duan[year2/10];
P1 =wei[7];
delay(8);
}
scan_key();
}
if(sw5==1&&sw1==6)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0xc3;
P0 =duan[day%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[day/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[month%10];
P1 =wei[2];
delay(8);
P1 =0x00;
P0 =duan[month/10];
P1 =wei[3];
delay(8);
P1 =0x00;
P0 =duan[year1%10];
P1 =wei[4];
delay(8);
P1 =0x00;
P0 =duan[year1/10];
P1 =wei[5];
delay(8);
}
scan_key();
}
}
}
}
void time1(void) interrupt 3
{
TH1 =(65536-500)/256;
TL1 =(65536-500)%256;
if(++cnt>8) cnt=0;
if(sw5==0) //显示时分秒
{switch(cnt)
{
case 0: P1 =0x00;
P0 =duan[sec%10];
P1 =wei[cnt]; break;
case 1: P1 =0x00;
P0 =duan[sec/10];
P1 =wei[cnt];break;
case 2: P1 =0x00;
P0 =duan[min%10];
P1 =wei[cnt]; break;
case 3: P1 =0x00;
P0 =duan[min/10];
P1 =wei[cnt];
scan_key(); break;
case 4: P1 =0x00;
P0 =duan[hour%10];
P1 =wei[cnt];
scan_key();break;
case 5: P1 =0x00;
P0 =duan[hour/10];
P1 =wei[cnt];
scan_key();break;
case 6: P1 =0x00;
P0 =0x7f;
P1 =wei[cnt];
scan_key(); break;
case 7: P1 =0x00;
P0 =week1[week];
P1 =wei[cnt];
scan_key();break;
default: break;
}
}
if(sw5==1) //显示年月日
{switch(cnt)
{
case 0: P1 =0x00;
P0 =duan[day%10];
P1 =wei[cnt]; break;
case 1: P1 =0x00;
P0 =duan[day/10];
P1 =wei[cnt];break;
case 2: P1 =0x00;
P0 =duan[month%10];
P1 =wei[cnt]; break;
case 3: P1 =0x00;
P0 =duan[month/10];
P1 =wei[cnt];
scan_key(); break;
case 4: P1 =0x00;
P0 =duan[year1%10];
P1 =wei[cnt];
scan_key();break;
case 5: P1 =0x00;
P0 =duan[year1/10];
P1 =wei[cnt];
scan_key();break;
case 6: P1 =0x00;
P0 =duan[year2%10];
P1 =wei[cnt];
scan_key(); break;
case 7: P1 =0x00;
P0 =duan[year2/10];
P1 =wei[cnt];
scan_key();break;
default: break;
}
}
}
void conv(void)
{
if(dataa>=201)
{dataa=0;sec++;}
if(sec>=60)
{sec=0;min++;}
if(sw1==0&&min>=60)
{min=0;hour++;}
if(sw1==0&&hour>=24)
{
if(year%4==0)
{
if(month==2)
{
if(day==29)
{
day =1;
month++;
}
else day++;
}
else
{
if(month==4||month==6||month==9||month==11)
{
if(day==30)
{
day =1;
month++;
}
else day++;
}
else
{
if(day==31)
{
day =1;
month++;
if(month==13)
{
month =1;
year++;
}
}
else day++;
}
}
}
else
{
if(month==2)
{
if(day==28)
{
day =1;
month++;
}
else day++;
}
else
{
if(month==4||month==6||month==9||month==11)
{
if(day==30)
{
day =1;
month++;
}
else day++;
}
else
{
if(day==31)
{
day =1;
month++;
if(month==13)
{
month =1;
year1++;
if(year1==100)
{
year2++;
}
}
}
else day++;
}
}
}
hour=0;
week++;
}
if(sw1==0&&week>=7)
week=0;
}
void delay(ms)
{
uchar i, k;
while(ms--)
for(k=0;k<123;k++);
for(i=0;i<123;i++);
}
void scan_key(void)
{
if(cnt==7&&P3_4==0)
{
delay(3);
if(cnt==7&&P3_4==0)
{
key4 =0;
key1 =1; //检查是第一个键按下
}
}
if(sw5==0&&key1==1&&cnt==7&&P3_4==1)
//按键松手时表示真的按下,sw5判断此时是什么显示状态,时间还是年月日
{
sw1 =1; //闪烁分针
}
if(sw5==1&&key1==1&&cnt==7&&P3_4==1)
//若为年月日则闪烁第一二位
{
sw1 =9;
}
if(sw1==1&&P3_4==0&&cnt==7)
//在时间状态第一个键又一次按下
{
delay(3);
if(sw1==1&&P3_4==0&&cnt==7)
{
key1 =2; //在时间状态第一个键的第二种状态
}
}
if(sw1==9&&P3_4==0&&cnt==7)
//在年月日状态第一个键第二次按下
{
delay(3);
if(sw1==9&&P3_4==0&&cnt==7)
{
key1 =9; //在年月日状态第一个键的第二种状态
}
}
if(key1==2&&cnt==7&&P3_4==1)
//在时间确认第一个键第二次按下
{
sw1 =2; // 并闪烁时针
}
if(key1==9&&cnt==7&&P3_4==1)
//年月日状态确认第一个键第二次按下
{
sw1 =8; // 并闪烁月分
}
if(sw1==8&&P3_4==0&&cnt==7)
//在年月日状态第一个键第三次按下
{
delay(3);
if(sw1==8&&P3_4==0&&cnt==7)
{
key1 =8; //在年月日状态第一个键的第三种状态
}
}
if(key1==8&&cnt==7&&P3_4==1)
//年月日状态确认第一个键第三次按下
{
sw1 =7; // 并闪烁年的后两位 ///
}
if(sw1==2&&P3_4==0&&cnt==7)
{
delay(3);
if(sw1==2&&P3_4==0&&cnt==7)
{
key1 =3;
}
}
if(sw1==7&&P3_4==0&&cnt==7)
//在年月日状态第一个键第四次按下
{
delay(3);
if(sw1==7&&P3_4==0&&cnt==7)
{
key1 =7; //在年月日状态第一个键的第四种状态
}
}
if(key1==7&&cnt==7&&P3_4==1)
//年月日状态确认第一个键第四次按下
{
sw1 =6; // 并闪烁年的前两位 ///
}
if(sw1==2&&P3_4==0&&cnt==7)
{
delay(3);
if(sw1==2&&P3_4==0&&cnt==7)
{
key1 =3;
}
}
if(key1==3&&cnt==7&&P3_4==1)
{
sw1 =3; // 并闪烁星期
}
if(sw5==0&&P3_4==0&&cnt==6)
//检查第二个键是否按下
{
delay(3);
if(sw5==0&&P3_4==0&&cnt==6)
{
key2 =1;
}
}
if(key2==1&&cnt==6&&P3_4==1)
{
key2 =0;
sw2 =1; //在时间状态确认第二个键按下
if(sw2==1&&sw1==1)
//和sw1的值对比,加分
{
min++;
if(min>=60)
min =0;
}
if(sw2==1&&sw1==2)
//和sw1的值对比,加时
{
hour++;
if(hour>=24)
hour =0;
}
if(sw2==1&&sw1==3)
{
week++;
if(week>6)
week =0;
}
}
if(sw5==1&&P3_4==0&&cnt==6)
//在年月日检查第二个键是否按下
{
delay(3);
if(sw5==1&&P3_4==0&&cnt==6)
{
key2 =7;
}
}
if(key2==7&&cnt==6&&P3_4==1)
{
key2 =0;
sw2 =1; //确认第二个键按下
if(sw2==1&&sw1==9)
//和sw1的值对比,加day
{
day++;
if(day>31)
day =0;
}
if(sw2==1&&sw1==8)
//和sw1的值对比,加month
{
month++;
if(month>12)
month =0;
}
if(sw2==1&&sw1==7)
{
year1++;
if(year1>100)
year1 =0;
}
if(sw2==1&&sw1==6)
{
year2++;
if(year2>100)
year2 =20;
}
} //检查时间状态第三个键是否按下
if(sw5==0&&P3_4==0&&cnt==5)
//检查第三个键是否按下
{
delay(3);
if(sw5==0&&P3_4==0&&cnt==5)
{
key3 =1;
}
}
if(key3==1&&cnt==5&&P3_4==1)
{
key3 =0;
sw3 =1;
if(sw3==1&&sw1==1)
{
if(min<=0)
min =60;
min--; //分针减
}
if(sw3==1&&sw1==2)
{
if(hour<=0)
hour =24;
hour--; //时针减
}
if(sw3==1&&sw1==3)
{
if(week<=0)
week =7;
week--;
}
}
if(sw5==1&&P3_4==0&&cnt==5)
//在年月日检查第三个键是否按下
{
delay(3);
if(sw5==1&&P3_4==0&&cnt==5)
{
key3 =7;
}
}
if(key3==7&&cnt==5&&P3_4==1)
{
key3 =0;
sw3 =7;
if(sw3==7&&sw1==9)
{
if(day<=0)
day =32;
day--; //day减
}
if(sw3==7&&sw1==8)
{
if(month<=0)
month =13;
month--; //month减
}
if(sw3==7&&sw1==7)
{
if(year1<=0)
year1 =100; //year减
year1--;
}
if(sw3==7&&sw1==6)
{
if(year2<=20)
year2 =100; //year减
year2--;
}
}
if(P3_4==0&&cnt==4&&sw1!=0&&sw5==0)
{
delay(3);
if(P3_4==0&&cnt==4&&sw1!=0&&sw5==0)
{
sw1=0;sec=0;key4=1;key1=0;
}
}
if(P3_4==0&&cnt==4&&sw1!=0&&sw5==1)
{
delay(3);
if(P3_4==0&&cnt==4&&sw1!=0&&sw5==1)
{
sw1=0;key4=1;key1=0;
}
}
if(P3_4==0&&cnt==3)
{
delay(3);
if(P3_4==0&&cnt==3)
{
key5 =1;
}
}
if(key5==1&&P3_4==1&&cnt==3)
{
sw5 =1;
}
if(P3_4==0&&sw5==1&&cnt==3)
{
delay(3);
if(P3_4==0&&sw5==1&&cnt==3)
{
key5 =0;
}
}
if(P3_4==1&&key5==0&&cnt==3)
{
sw5 =0;
}
}
void main(void)
{
PCA0MD =0 ;
XBR1 =0x40 ;
P0MDOUT =0xFF ;
P1MDOUT =0xFF ;
init();
while(1)
{
conv();
year=year1+year2*100;
}
}
五、调试及性能分析
5.1
硬件调试:主要检查电路的焊接,有无虚焊,漏焊,然后检查电路与单片机的联线,为了方便自己做了一根数据线,然后用万用表测试,全部导通后进行通电检测,上电后排查电路板的各点电平是否正常,测试完毕后进行软件调试。
5.2 软件调试:主要以以编程序为主,并进行单片机输出口线高低电平的检验。本程序采用C语言编写,用Keil
C51编译器编程调试,本程序的难点之一在于让它闪烁,也就是再其它灯不变的情况下闪烁需要调整的部分。
经过测试,任务以及要求全部达到,初始化时,时间是1-00:00:00,切换后是20096.08.15,由于时间关系没能经过长时间的验证性测试,短期测试发现每一个小时快一秒钟,只进行了粗调。
单片机c语言编程 时钟加日历转换,单片机C语言电子时钟加日历显示编程相关推荐
- MSP430G2553 launchpad 口袋板 口袋实验平台 数字电子日历时钟设计 秒表 闹钟 整点报时 万年历 电子时钟
题10 数字电子日历/时钟设计 设计一个基于MSP430的电子日历和时钟. 基本要求 (1)可通过按键在日历和时间之间切换显示: (2)可由按键调整日期和时间 (3)可整点报时('铆.嘟"声 ...
- esp8266oled做时钟python_ESP8266实战一——带OLED显示屏电子时钟
ESP8266+Arduino IDE--电子时钟 项目简介 鸽了太久了,今天终于来填坑了,还记得上次记录esp8266入门时我挖的坑吗 忘了就点它.,现在他来了,怎么样?是不是有点东西[偷笑],纯手 ...
- python数码时钟代码_Python+Pyqt实现简单GUI电子时钟
本文实例为大家分享了Python+Pyqt实现简单GUI电子时钟的具体代码,供大家参考,具体内容如下 突发奇想想用GUI做一个简单的电子时钟界面,利用pyqt模块也很方便,代码如下: from PyQ ...
- c语言时钟程序整点报时,单片机开发的(带整点报时、音乐闹钟)电子时钟(一)...
整个电路由一台单片机和一些外围电路组成.它的计时采用单片机内部的定时器,其晶振频率为11.0592MHz.其主要功能都是通过C语言编程来实现的.其显示部分用四位数码管来显示,能同时显示小时和分钟.它主 ...
- c#语言中怎么样把文本转换成数字,如何将字符串转换为数字 - C# 编程指南 | Microsoft Docs...
如何将字符串转换为数字(C# 编程指南) 02/16/2021 本文内容 你可以调用数值类型(int.long.double 等)中找到的 Parse 或 TryParse 方法或使用 System. ...
- c语言课程设计进制转换摘要,C语言课程设计-进制转换.doc
沈阳航空航天大学 课 程 设 计 报 告 课程设计名称:C语言课程设计 课程设计题目: 二.八.十.进制转换程序 院(系):计算机学院 专 业:计算机科学与技术(物联网方向) 班 级学 号: 姓 名: ...
- 怎么把汇编语言转成c语言,求高手把汇编语言转换成c语言!基于AT89C2051的。
汇编程序: delaytime EQU 31H exechi EQU 32H EXECLO EQU 33H MAINHI EQU 34H MAINLO EQU 35H ORG ...
- 基于51单片机的可由按键切换12\24小时制的电子时钟proteus仿真
仿真电路图: 部分源代码: #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit lcd ...
- c语言课程设计进制转换结构图,C语言课程设计————写下流程图! 谢谢
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 printf("---You have success read data from file!!!---\n"); return h ...
最新文章
- 邮件发送 --- 纯Java、JavaWeb、Spring三种实现方式
- 基于单片机的倒车雷达系统设计c语言,基于AT89C2051单片机实现超声波倒车雷达系统的设计...
- S/4HANA的生产订单,哪个字段可以用来做生产完成的标志位
- 分布式防火墙技术及主要特点
- [转]docker入门(利用docker部署web应用)
- java异步接口转同步接口_如果今天设计了Java:同步接口
- 流媒体数据代理----Anychat
- charles的一些使用
- macOS Big Sur无法安装 Big Sur为什么安装不了?
- 4.卷1(套接字联网API)---基本TCP套接字编程
- can't find '__main__' module in '.'
- 2022年 27 个最佳 UX/UI 设计灵感网站
- kaggle 电商数据分析
- 计算机病毒课后讨论题,《防治计算机病毒》答辩题目及解析
- 微信小程序picker下拉框
- 蜗牛星际C单下实现黑群的局域网唤醒
- webpack安装使用教程
- 3.处理机调度——作业调度算法与进程调度算法
- API监控:你应该衡量什么?
- 【python与数据分析】Matplotlib数据可视化
热门文章
- 融云办政事: “小网格”也能实现“大治理”
- 数字沙盘 电子沙盘 GIS 大数据人工智能开发教程
- 2022年4月14日-1
- scratch/mblock项目:跑酷闯关(侦测、条件语句、数据与变量的应用)
- 用友 针式打印机纸张设置
- css: opacity、transparent、rgba 区别
- maven的pom的配置(上传jar包,配置私库,配置第三方库)
- 递归实现斐波那契数列 1 1 2 3 5 8 13 21 ......
- 华为 虚拟化安装部署步骤
- 【Cocos2d-X】独立开发并发布自己的第一款android手游——SpaceWar