备电源进行涓细电流充电的能力。S1302是SPI总线型,因此与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。 2.2.3 LCD1602液晶显示电路
2.2.4 键盘电路
第三章 系统的软件设计
3.1 主程序流程图
开始 初始化LCD及DS1302 判断设置按键 是否按下 进入调节模式 读取DS1302中的时间、日期 将时间/日期写入显示时间、 日期 主程序流程图
6
3.2 时钟程序流程图
第四章 结束语
在整个设计过程中,发挥团队精神,分工合作,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识,完成了对万年历的设计,达到了预期的目的。在最初的设计中,发挥“三个臭皮匠,顶个诸葛亮”的作用,相互学习、相互讨论、研究,完成了最初的设想。在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成,反而达到事半功倍的效果。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,理清了思路,终于能够完成它。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我们的耐心,做什么事都在有耐心。此次设计中学到了很多很多东西,这是最重要的。
附录
PCB板展示:
7
程序展示:
#include
#define uchar unsigned char #define uint unsigned int sbit lcden=P1^2; sbit lcdwr=P1^1; sbit lcdrs=P1^0; sbit sda=P2^1; sbit rst=P2^2; sbit sck=P2^0; sbit s1=P3^3; sbit s2=P3^4; sbit s3=P3^5; sbit s4=P3^6; sbit ACC0=ACC^0; sbit ACC7=ACC^7; sbit BELL=P1^3; char
fen,shi,miao,ri,yue,nian,zhou,s1num,s
8
2num,s4num,flag1,flag2,lshi,lfen;
uchar code table[]={\20 - - \
uchar code table1[]={\\
uchar code table2[]={\Welcome To Lcd!\
uchar code table3[]={\Every Day!\
/*延时函数 z ms*/ void delay(uint z) {
uint x,y;
for(x=z;x>0;x--) for(y=110;y>0;y--); }
/*蜂鸣器函数*/ void didi() {
uchar i;
for(i=0;i<60;i++) {
BELL=0; delay(1); BELL=1; delay(1); } }
/*向1602液晶中写一个指令*/ void write_com(uchar com) {
lcdwr=0; lcdrs=0; // lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; }
/*向液晶写数据*/
void write_data(uchar date) {
// lcdwr=0; lcdrs=1; // lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; }
/*初始化1602液晶*/ void init_1602() {
lcdwr=0; lcden=0;
write_com(0x38); //设置LCD为16*2显示,5*7点阵,8位数据口模式
write_com(0x0c); //开显示,不显示光标
write_com(0x06); //写一个字符后,地址指针加1
9
write_com(0x01);//显示清0 }
void gudingtime_1602() {
uchar num;
write_com(0x80);
for(num=0;num<16;num++) write_data(table[num]);
write_com(0x80+0x40); //将指针指向液晶第二行
for(num=0;num<16;num++)
write_data(table1[num]); }
//显示欢迎界面函数 void displaystar(void) {
uchar i;
write_com(0x80); for(i=0;i<16;i++)
write_data(table2[i]); write_com(0x80+0x40); for(i=0;i<16;i++)
write_data(table3[i]); }
//显示时间、日期子函数 void write_sfm(uchar add,uchar time)//add为显示位置,time为要显示内容 {
uchar shiwei,gewei; shiwei=time/16; gewei=time;
write_com(add+0x80);
write_data(0x30+shiwei);//由1602液晶字库可知,0~9的数据码分别对应0x30~0x39
write_data(0x30+gewei); }
//写数据字节 子函数
void Input_1byte(uchar TD)//写一字节数据
{
uchar i; ACC=TD;
for(i=8;i>0;i--) {
sda=ACC0; sck=1; sck=0;
ACC=ACC>>1; } }
//读数据字节 子函数
uchar Output_1byte(void) {
uchar i;
for(i=8;i>0;i--) {
ACC=ACC>>1; ACC7=sda; sck=1; sck=0; }
return(ACC); }
//写ds1302数据函数
void write_1302(uchar DS_ADD,uchar DS_DAT)//写操作 {
rst=0; sck=0; rst=1;
Input_1byte(DS_ADD); Input_1byte(DS_DAT); sck=1; rst=0; }
//读ds1302数据函数
uchar read_1302(uchar DS_ADD)//读操作 {
uchar DS_INF; rst=0; sck=0;
10
rst=1;
Input_1byte(DS_ADD); DS_INF=Output_1byte(); sck=1; rst=0;
return(DS_INF); }
//初始化ds1302子函数 void inital_1302() {
// rst=0; // sck=0;
write_1302(0x8e,0x00);//禁止写保护
write_1302(0x90,0xaa);//定义充电 write_1302(0x80,0x53);//最初显示53秒
write_1302(0x84,0x09);//最初显示13时
write_1302(0x82,0x10);//分 write_1302(0x8c,0x14);//nian write_1302(0x88,0x07);//yue write_1302(0x86,0x06);//ri
//write_1302(0x8a,0x04);//星期1 write_1302(0xc0,0x09);//闹钟小时08
write_1302(0xfc,0x12);//闹钟00分 write_1302(0x8e,0x80);//开保护 }
//扫描函数 void keyscan() {
if(s1==0&&s4num==0) //按键1按下且s4在这之前没按下 {
delay(5);
if(s1==0&&s4num==0) {
flag1=1; s1num++;
while(!s1); didi(); if(s1num==1) {