嵌入式课程设计-- 电子时钟

这篇具有很好参考价值的文章主要介绍了嵌入式课程设计-- 电子时钟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发环境:

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

keil5:嵌入式开发的软件。

原理图和PCB:

原理图:

嵌入式课程设计-- 电子时钟

功能和操作说明:

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

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

代码:文章来源地址https://www.toymoban.com/news/detail-504191.html

#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);//初始化LCD1602
        write_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++; //则调整年加1
                                        if(year==100)//若满100后将清零
                                                year=0;
                                        write_yea(3,year);//每调节一次送液晶显示一下
                                        write_com(0x84);//显示位置重新回到调节处
                                }
                                if(s1_num==2)//若功能键第二次按下
                                {
                                        month++;//则调整月加1
                                        if(month==13)//若满12后将置一
                                                month=1;
                                        write_yea(6,month);//每调节一次送液晶显示一下
                                        write_com(0x87);//显示位置重新回到调节处
                                }
                                if(s1_num==3)//若功能键第三次按下
                                {
                                        day++;//则调整日加1
                                        if(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++;//则调整星期加1
                                        if(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++;//则调整分钟加1
                                        if(minu==60)//若满60后将清零
                                               minu=0;
                                        write_sec(5,minu);//每调节一次送液晶显示一下
                                        write_com(0xc6);
                                }
			       if(s1_num==7)//若功能键第七次按下
                                {
                                        second++; //整秒加1
                                        if(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--;//则调整秒减1
                                        if(year==-1)//若减到负数则将其重新设置为99
                                                year=99;
                                        write_yea(3,year);//每调节一次送液晶显示一下
                                        write_com(0x84);//重新调整显示
                                }
                                if(s1_num==2)//若功能键第二次按下
                                {
                                        month--;//则调整分钟减1
                                        if(month==0)//若减到负数则将其重新设置为59
                                                month=12;
                                        write_yea(6,month);//每调节一次送液晶显示一下
                                        write_com(0x87);//重新调整显示
                                }
                                if(s1_num==3)//若功能键第3次按下
                                {
                                        day--;//则调整日加1
                                        if(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--;//小时减1
                                        if(week==0)//若减到负数则将其重新设置为23
                                                week=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--;//则调整分钟减1
                                        if(minu==-1)//若减到负数则将其重新设置为59
                                                minu=59;
                                        write_sec(5,minu);//每调节一次送液晶显示一下
                                        write_com(0xc6);//重新调整显示
                                }
                               if(s1_num==7)//若功能键第7次按下
                                {
                                        second--;//则调整秒减1
                                        if(second==-1)//若减到负数则将其重新设置为59
                                                second=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();//初始化LCD160tr
        timeint();//定时器初始化化 
        while(1)
        { 
                keyscan();//不停的检测按键是否被按下
         }
}

到了这里,关于嵌入式课程设计-- 电子时钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LabVIEW开发航空电子设备嵌入式诊断半物理仿真系统

    LabVIEW开发航空电子设备嵌入式诊断半物理仿真系统 航电集成系统是现代战争飞机的重要组成部分,包括惯性导航系统、飞行控制系统、机电管理系统和任务计算机等子系统。战机的作战性能与航电系统息息相关,可以说,没有高性能的空电系统,战斗机就没有机会实现高性

    2024年02月16日
    浏览(44)
  • 基于粤嵌gec6818开发板嵌入式开发电子相册,音乐播放,视频播放,2048游戏

    实现功能:本系统需要使用粤嵌的GEC-6818开发板设计一款娱乐影音系统,其中包括图片显示(相册)、音乐播放、视频播放,游戏四个部分,在每个部分内部,具有操控各个部分的功能触摸按键。本系统还应具有蓝牙远程操控功能。 具体要求:对使用者具有良好的可视交互体

    2024年02月13日
    浏览(65)
  • 单片机毕业设计 stm32智能电子秤系统设计与实现 - 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月06日
    浏览(69)
  • ubuntu20嵌入式开发环境搭建

    安装步骤:省略。 网上有很多教程,不做笔记了。 值得注意的一点:安装时建议选择中文安装,会默认带有中文输入法。 安装Vmware Tools后,可以实现主机跟虚拟机之间的文件拷贝,文本内容的复制粘贴等操作。使用起来更方便。 依次使用下面的命令即可完成安装: sudo ap

    2024年02月19日
    浏览(38)
  • 嵌入式室内环境参数监控系统设计

    本次课设要求学生们掌握四个方面,第一是文献检索及实验研究方法,第二是室内环境监控系统一般组成; 第三是掌握技术方案比选方法;最后是掌握STM32 ADC使用,同时本次课设需要做到以下几个方面: 了解国内室内环境参数监控系统组成及技术架构; 设计室内环境参数监

    2024年01月18日
    浏览(43)
  • STM32开发环境搭建&工程创建(嵌入式学习)

    简介 STM32CubeMX是STMicroelectronics公司提供的一款集成开发环境(IDE)工具,用于快速配置和初始化STM32微控制器系列的软件工程。它提供了图形化界面和交互式工具,使开发者能够轻松地生成STM32微控制器的初始化代码和配置文件。 STM32CubeMX具有以下主要功能和特点: 微控制器

    2024年02月11日
    浏览(66)
  • 全志V3S嵌入式驱动开发(开发环境再升级)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         前面我们陆陆续续开发了差不多有10个驱动,涉及到网口、串口、音频和视频等几个方面。但是整个开发的效率还是比较低的。每次开发调试的时候都很麻烦,譬如说,如果是驱动代码

    2024年02月08日
    浏览(56)
  • 嵌入式——实时时钟(RTC)

    目录 一、初识RTC 1.简介 2.特性 3.后备寄存器和RTC寄存器特性 二、RTC组成 1.相关寄存器 (1)控制寄存器高位(RTC_CRH) (2)控制寄存器低位(RTC_CRL) (3)预分频装载寄存器高位(RTC_PRLH) (4)预分频裝载寄存器低位(RTC_PRLL) (5)计数器寄存器高位(RTC_CNTH) (6)计数器

    2024年02月19日
    浏览(31)
  • 嵌入式学习---ARM时钟体系

    按 一定电压幅度 , 一定时间间隔 连续发出的脉冲信号。它是一个周期性的信号,每个周期内包含一个上升沿和一个下降沿。时钟脉冲的上升沿和下降沿通常用于触发和同步各个电子元件的操作,例如CPU的指令执行、数据传输、寄存器更新等。 时钟频率是指时钟脉冲的频率

    2024年01月16日
    浏览(57)
  • 嵌入式Linux-IMX6ULL开发环境配置

    正点原子的驱动开发指南所使用的是纯净的Ubuntu16.04平台,用户可以按照驱动开发指南的学习路线,一步一步地亲手把Ubuntu平台搭建完成。 但是学习正点原子Linux开发板,个人还是强烈推荐大家安装正点原子提供的虚拟机平台!!!! 可以快速进行体验或者开发,避免学习周

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包