开发环境:

Proteus:是比较好的仿真单片机及外围器件的工具。

keil5:嵌入式开发的软件。

原理图和PCB:

原理图:

功能和操作说明:

本系统以C51单片机为核心,通过软件在LCD1602上显示具体时间日期的系统。本质是一个简易电子时钟。同时可以通过4个按键来调整时间。

在仿真开始后,LCD显示屏会显示初始时间,同时随着定时器工作,时钟会走动。若按下“MODEL”按键,则定时器停止工作,光标定位到年,同时可按下“+”,“-”键来完成对时间的更改,按下两次“MODEL”键,光标定位到月,三次,光标定位到周,四次到日,五次到时,六次到分钟,七次到秒。最后按下“CONFIRM”键,光标消失,定时器重新开始工作,时钟走动。

代码:

#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RW=P2^1;//定义1602液晶RW端,
sbit RS=P2^0;  //定义1602液晶RS端
sbit EN=P2^2;//定义1602液晶EN端
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
sbit LED=P2^5;
uchar count,s1_num,year,month,day,week,second,hour,minu;
uchar code OP[]=" 20  -  -   ";//定义初始上显示状态
void DELAY_1(uint k)
{int j;for(;k!=0;k--){for(j=112;j>0;j--);}
}
void write_com(uchar com)//写命令函数
{RS=0; RW=0;EN=0;   P0=com;DELAY_1(5);EN=1;DELAY_1(5);EN=0;
}
void write_da(uchar dat)//写数据
{RS=1;RW=0;EN=0;P0=dat;DELAY_1(5);EN=1;DELAY_1(5);EN=0;//执行
}
void write_yea(uchar pla,uchar date1)//LCD第一行写入
{uchar hour1,hour2;hour1=date1/10;hour2=date1%10;write_com(0x80+pla);write_da(0x30+hour1);write_da(0x30+hour2);
}
void write_sec(uchar add,uchar date)//LCD第二行写入
{uchar hour1,hour2;hour1=date/10;hour2=date%10;write_com(0xC0+add);write_da(0x30+hour1);write_da(0x30+hour2);
}
void write_week(char week)//星期显示函数
{write_com(0x80+13);//第一行第12个位置switch(week){case 1:    write_da('M');DELAY_1(5);write_da('O');DELAY_1(5);write_da('N');break;case 2:    write_da('T');DELAY_1(5);write_da('U');DELAY_1(5);write_da('E');break;case 3:    write_da('W');DELAY_1(5);write_da('E');DELAY_1(5);write_da('D'); break;case 4:    write_da('T');DELAY_1(5);write_da('H');DELAY_1(5);write_da('U');break;case 5:    write_da('F');DELAY_1(5);write_da('R');DELAY_1(5); write_da('I');break;case 6:    write_da('S');DELAY_1(5); write_da('A');DELAY_1(5); write_da('T');break;case 7:    write_da('S');DELAY_1(5);write_da('U');DELAY_1(5);write_da('N');break;default: break;}
}
void writemon()//溢出判断
{day=1;month++;if(month==13){month=1;year++;if(year==100)year=0;write_yea(3,year);//年若变化则重新写入}write_yea(6,month);//月若变化则重新写入
}
void timeint()//定时器初始化
{TMOD=0x01;ET0=1;EA=1;TR0=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;
}
void init()//初始化LCD函数
{uchar num;EN=0;RS=0;RW=0;year=22;//初始化种变量值month=7;day=4;week=1;hour=10;minu=59;second=50;count=0;s1_num=0;LED=0;write_com(0x38);//初始化LCD1602write_com(0x0c);//开显示write_com(0x06);//写读地址指针自动加一write_com(0x01);write_com(0x80);//设置显示第一行for(num=0;num<15;num++)//显示年月日星期{write_da(OP[num]);DELAY_1(5);}DELAY_1(5);write_com(0xc4);//写出时间显示部分的两个":"write_da(':');DELAY_1(5);write_com(0xc7);write_da(':');DELAY_1(5);write_week(week);write_yea(3,year);//显示write_yea(6,month);write_yea(9,day);write_sec(8,second);//显示write_sec(5,minu);write_sec(2,hour);
}
void keyscan()//按键扫描函数
{if(s1==0)        {DELAY_1(5);if(s1==0)//确认功能键被按下{        s1_num++;//功能键按下次数记录while(!s1);                   if(s1_num==1)//第一次被按下时{TR0=0;  //关闭定时器write_com(0x84);//光标定位到年位置write_com(0x0f); //光标开始闪烁}if(s1_num==2)//第二次按下光标闪烁定位到月位置{write_com(0x87);//第一行第六个}if(s1_num==3)//第三次按下光标闪烁定位到日位置{write_com(0x8a);}if(s1_num==4)//第四次按下光标闪烁定位到星期位置{write_com(0x8e);}  if(s1_num==5)//第五次按下光标闪烁定位到时位置{write_com(0xC3);}if(s1_num==6)//第六次按下光标闪烁定位到分位置{write_com(0xc6);}if(s1_num==7)//第七次被按下时光标定位到秒位置{write_com(0xc9);}if(s1_num==8){s1_num=0;//记录按键数清零write_com(0x0c);//取消光标闪烁TR0=1;        //启动定时器使时钟开始走}               }}if(s1_num!=0)//只有功能键被按下后,增加和减小键才有效{if(s4==0)//确认按键        {DELAY_1(5);if(s4==0){        while(!s4);//释放确认s1_num=0;//记录按键数清零write_com(0x0c);//取消光标闪烁TR0=1;        //启动定时器使时钟开始走   }}if(s2==0)//+键{DELAY_1(5);if(s2==0){while(!s2);//按键释放if(s1_num==1)//若功能键第一次按下{year++; //则调整年加1if(year==100)//若满100后将清零year=0;write_yea(3,year);//每调节一次送液晶显示一下write_com(0x84);//显示位置重新回到调节处}if(s1_num==2)//若功能键第二次按下{month++;//则调整月加1if(month==13)//若满12后将置一month=1;write_yea(6,month);//每调节一次送液晶显示一下write_com(0x87);//显示位置重新回到调节处}if(s1_num==3)//若功能键第三次按下{day++;//则调整日加1if(year%4==0&&month==2){if(day==30)//若满29后将置一day=1;}if(year%4!=0&&month==2){if(day==29)//若满28后将置一day=1;}if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11){if(day==32)//若满31后将置一day=1;}if(month==4||month==6||month==9||month==11){         if(day==31)//若满30后将置一day=1;}write_yea(9,day);;//每调节一次送液晶显示一下write_com(0x8a);//显示位置重新回到调节处}if(s1_num==4)//若功能键第四次按下{week++;//则调整星期加1if(week==8)//若满8后将置一week=1;write_week(week);//每调节一次送液晶显示一下write_com(0x8d);//显示位置重新回到调节处}if(s1_num==5)//若功能键第五次按下{                                       hour++;if(hour==24)//若满24后将清零{hour=0;}write_sec(2,hour);write_com(0xc3);}  if(s1_num==6)//若功能键第二次按下{minu++;//则调整分钟加1if(minu==60)//若满60后将清零minu=0;write_sec(5,minu);//每调节一次送液晶显示一下write_com(0xc6);}if(s1_num==7)//若功能键第七次按下{second++; //整秒加1if(second==60)//满60后将清零second=0;write_sec(8,second);//每调节一次送液晶显示一下write_com(0xc9);//调整显示位置}}}}if(s3==0)//-键{if(s3==0)//确认减小键被按下{while(!s3);//按键释放if(s1_num==1)//若功能键第一次按下{year--;//则调整秒减1if(year==-1)//若减到负数则将其重新设置为99year=99;write_yea(3,year);//每调节一次送液晶显示一下write_com(0x84);//重新调整显示}if(s1_num==2)//若功能键第二次按下{month--;//则调整分钟减1if(month==0)//若减到负数则将其重新设置为59month=12;write_yea(6,month);//每调节一次送液晶显示一下write_com(0x87);//重新调整显示}if(s1_num==3)//若功能键第3次按下{day--;//则调整日加1if(year%4==0&&month==2){if(day==0)//若满29后将置一day=29;}if(year%4!=0&&month==2){if(day==0)//若满28后将置一day=28;}if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11){if(day==0)//若满31后将置一day=31;}if(month==4||month==6||month==9||month==11){         if(day==0)//若满30后将置一day=30;}write_yea(9,day);;//每调节一次送液晶显示一下write_com(0x8a);//重新调整显示}if(s1_num==4)//MODEL第4次按下{week--;//小时减1if(week==0)//若减到负数则将其重新设置为23week=7;write_week(week);//每调节一次送液晶显示一下write_com(0x8d);//重新调整显示}if(s1_num==5)//MODEL第5次按下{hour--;if(hour==-1)//若满24后将清零hour=23;}if(s1_num==6)//MODEL第6次按下{minu--;//则调整分钟减1if(minu==-1)//若减到负数则将其重新设置为59minu=59;write_sec(5,minu);//每调节一次送液晶显示一下write_com(0xc6);//重新调整显示}if(s1_num==7)//若功能键第7次按下{second--;//则调整秒减1if(second==-1)//若减到负数则将其重新设置为59second=59;write_sec(8,second);//每调节一次送液晶显示一下write_com(0xc9);//重新调整显示} }}
}void timer0() interrupt 1
{TH0=(65536-50000)/256;//定时器初值TL0=(65536-50000)%256;count++; //中断次数累加if(count==20) //20次50毫秒为1秒{    LED=0;if(minu==59 && second==59 )   LED=1;count=0;second++;if(second==60)//秒加到60则进位分钟{second=0;//同时秒数清零minu++;if(minu==60)//分钟加到60则进位小时{minu=0;//同时分钟数清零hour++;                                if(hour==24)//小时加到24则小时清零{hour=0;week++;if(week==8){week=1;}write_week(week);//星期若变化则重新写入day++;if(year%4==0&&month==2)//判断是否为闰年的2月{if(day==30){writemon();                                                                                                                                                         }write_yea(9,day);//日若变化则重新写入}if(year%4!=0&&month==2)//判断是否为平年的2月{if(day==29){writemon();                                                                                                  }write_yea(9,day);//日若变化则重新写入}if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11){if(day==32){writemon();                                                                                                  }write_yea(9,day);//日若变化则重新写入}if(month==4||month==6||month==9||month==11){if(day==31){writemon();                                                                                                  }write_yea(9,day);//日若变化}}  write_sec(2,hour);}write_sec(5,minu);//分钟若变化}write_sec(8,second);//秒若变化        }
}
/********************主函数*************************/
void main()
{       init();//初始化LCD160trtimeint();//定时器初始化化 while(1){ keyscan();//不停的检测按键是否被按下}
}

嵌入式课程设计-- 电子时钟相关推荐

  1. 天津大学计算机课程设计挂,天津大学智能装置课程设计 电子时钟..doc

    智能装置课程设计 一.课程设计目的: 1.深入了解PIC16F877单片机的工作原理,熟练掌握汇编语言程序设计方法,熟练使用MPLAB-ICD仿真器及MPLAB-IDE仿真调试软件. 2.通过该课程设 ...

  2. c语言电子时钟课程设计报告,电子时钟嵌入式课程设计报告

    <电子时钟嵌入式课程设计报告>由会员分享,可在线阅读,更多相关<电子时钟嵌入式课程设计报告(19页珍藏版)>请在人人文库网上搜索. 1.合海大学计算机信息工程学院(常州)课程设 ...

  3. c语言制作漏斗图案,电子课程设计-电子漏斗.doc

    电子课程设计-电子漏斗 电子课程设计 课题:电子漏斗 系 别:电子信息系专业名称:电子信息科学与技术学生姓名:学 号:指 导 教 师 姓 名 : 目录 1.摘要-------------------- ...

  4. 聊城大学理工学院-嵌入式课程设计-stm32f407小车

    最近两天有点偷懒了,什么都不想做,所以今天不接着弄上次的GPS模块了,今天就分享点别的-----大三时做的嵌入式课程设计.当时做好后也算是好几个班流传最广的版本了,所以多少还是很有点成就感的. 实现的 ...

  5. 流水灯嵌入式课程设计(包含UCOSII的无仿真和无UCOSII的有仿真)

    目录 流水灯设计原理 1.基于STM32F103R6Tx的流水灯设计,先初始化管脚,编写LED.KEY按键和定时器的初始化函数. 2.按键的判断设计分为两部分:开始/停止按键和设置时间按键. ① 开始 ...

  6. 单片机课程设计--网络时钟

    单片机课程设计–网络时钟 测控1902 孙楷亮 文章目录 单片机课程设计--网络时钟 作品功能 目标功能 典型应用场景 总体计划 代码计划 时间规划 开发资源 开发环境 硬件资源 软件资源 文档资料 ...

  7. c语言编写词库_C语言课程设计--电子生词库软件

    C语言课程设计--电子生词库软件 程序设计基础实训任务书程序设计基础实训任务书 题目电子生词库软件 学生姓名 学号 班级 题目类型软件工程(R) 指导教师 一.设计目的一.设计目的 1.进一步掌握和利 ...

  8. alin的学习之路:嵌入式课程设计总结(基于Linux的Qt版MP3播放器)

    嵌入式课程设计总结(基于Linux的Qt版MP3播放器) 废话不多写直接上图上代码,其中有很多不规范的地方,希望大佬们指正. 1.课设题目 设计一个MP3播放器,要求:使用Linux下的madplay ...

  9. STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始

    STM32课程设计–数字时钟+数字电压表+扩展功能–从零开始 目录 STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始 准备 建立工程 下载工程模板 添加项目所需文件 下载 加入工程 加 ...

  10. java蜂鸣节拍器_电子课程设计-电子节拍器的设计.doc

    电子课程设计-电子节拍器的设计 通 信 工 程 专业 课程设计题单 班级 学生 孙伟杰 课程名称 电子课程设计 课 题 电子节拍器的设计 设计要求 节拍器具有声光显示功能:设有2/4,3/4,4/4三 ...

最新文章

  1. PCL点云特征描述与提取(3)
  2. 对卫星网络及内容的安全防护措施
  3. UVA 11491 Erasing and Winning 奖品的价值 (贪心)
  4. 29个月过去了,CSDN排名前200了:排名不断靠前的过程中,自己的技术水平和竞争力一定会不断向上...
  5. linux系统负载检查方法
  6. nfine框架 上传文件_网站服务器Nginx运行环境,后台文件上传超出Nginx的最大值...
  7. oracle画圆,元宵佳节:看Oracle技术粉们用SQL画团圆
  8. Linux Shell 文本处理工具集锦
  9. debug 标志位说明
  10. 【WinForm-无边框窗体】实现Panel移动窗体,没有边框的窗体
  11. Cognos 8 错误及故障排除(转载)
  12. 递归--练习6--noi1755菲波那契数列
  13. S3C6410 SD卡启动uboot分析(详细)
  14. python类方法和实例方法的区别_python中的类方法,实例方法和静态方法的区别
  15. LaTeX安装CJK-- 添加中文支持
  16. 【上班摸鱼系列】文字选择类游戏:《职员默示录 - 启》末日丧尸爆发,你,是什么下场!?...
  17. RMS数据采集分布式架构
  18. 教育培训行业的SOP
  19. 网站优化关键词密度多少才是最合适的?
  20. 图片外链网站需要什么样服务器,10个支持外链图片服务的免费图床网站

热门文章

  1. 网络舆情监测系统学习笔记——GIT的…
  2. “会用LabVIEW,但是却没有听说TestStand,好像有点说不过去吧!”(下)
  3. 计算机学术论文shortessay,期末论文essay
  4. JAVA 实现《英文猜词游戏》游戏
  5. APICloud可视化编程
  6. c语言 程序设计 题库答案 p,c语言 程序设计 题库答案 p
  7. 手机版豆丁书房下载的文档在哪儿
  8. Java测试类的创建
  9. iOS简单的登陆界面代码
  10. 使用Gradle构建Spring源码