0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

指针式电子钟与万年历设计方案

DS小龙哥-嵌入式技术 ? 来源:DS小龙哥-嵌入式技术 ? 作者:DS小龙哥-嵌入式技 ? 2022-02-28 14:07 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

? 1. 项目简介

这是基于STM32设计的一个指针式电子钟+万年历小项目,采用3.5寸的LCD屏显示时钟,日历、温度、天气,支持触摸屏调整设置时间,设置闹钟,查看日历等等。整体项目主要是技术点就是LCD屏的图形绘制。比如: 时钟的时针绘制、分针、秒针、表盘、日历绘制等等。

时钟的时间是直接采用STM32本身的RTC时钟,室内的室温数据采用DS18B20温度传感器获取,STM32芯片的具体型号是STM32F103ZET6,只要是STM32F1系列的开发板,代码都是可以通用的。

LCD显示屏采用的正点原子的3.5寸TFT显示屏,支持8080时序,自带触摸屏功能,触摸屏是电阻屏,驱动芯片是XPT2046,SPI接口通信非常方便。

STM32F103ZET6带有FSMC功能,可以输出8080时序,本项目里驱动LCD屏就采用FSMC控制的,效率比较高。

主界面如下:

指针式电子钟与万年历设计方案

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2. 项目功能介绍

下面对每个子功能页面做详细讲解。

2.1 实时时钟页面

在LCD屏上方显示表盘、分针、时针、 秒针、刻度、更改时钟时间方块,并实现分针、时针、秒针的移动,在实时时钟下方同步显示数字时钟。

指针式电子钟与万年历设计方案

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

运用触摸屏功能实现时钟设置功能,点击“+” “-”至设置时钟方块,跳出设置时钟界面,即可开始设置时钟与日期;点击“+”“-”至设置闹钟方块,跳出设置闹钟界面,即可开始设置闹钟。

指针式电子钟与万年历设计方案

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.2 日历页面

在LCD屏中部显示日期、星期、天气、实时温度,在LCD屏下方显示日历、左右两边显示黄历,并在日历上重点突出今天的日期。

指针式电子钟与万年历设计方案

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3. 项目实现主要程序讲解

3.1 流程图

指针式电子钟与万年历设计方案

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.2 ds18b2.c 代码

下面列出DS18B20温度传感器主要代码.

#include "ds18b20.h"
#include "delay.h"  
?
//复位DS18B20
void DS18B20_Rst(void)    
{         
    DS18B20_IO_OUT();   //SET PG11 OUTPUT
  DS18B20_DQ_OUT=0;   //拉低DQ
  DelayUs(750);      //拉低750us
  DS18B20_DQ_OUT=1;   //DQ=1 
    DelayUs(15);      //15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void)    
{  
    u8 retry=0;
    DS18B20_IO_IN();    //SET PG11 INPUT     
  while (DS18B20_DQ_IN&&retry<200)
    {
        retry++;
        DelayUs(1);
    };   
    if(retry>=200)return 1;
    else retry=0;
  while (!DS18B20_DQ_IN&&retry<240)
    {
        retry++;
        DelayUs(1);
    };
    if(retry>=240)return 1;   
    return 0;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void)    
{
  u8 data;
    DS18B20_IO_OUT();   //SET PG11 OUTPUT
  DS18B20_DQ_OUT=0; 
    DelayUs(2);
  DS18B20_DQ_OUT=1; 
    DS18B20_IO_IN();    //SET PG11 INPUT
    DelayUs(12);
    if(DS18B20_DQ_IN)data=1;
  else data=0;     
  DelayUs(50);      
  return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)   
{    
  u8 i,j,dat;
  dat=0;
    for (i=1;i<=8;i++) 
    {
 ? ? ? ?j=DS18B20_Read_Bit();
 ? ? ? ?dat=(j<<7)|(dat>>1);
   }                         
  return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)   
 {       
  u8 j;
  u8 testb;
    DS18B20_IO_OUT();   //SET PG11 OUTPUT;
  for (j=1;j<=8;j++) 
    {
 ? ? ? ?testb=dat&0x01;
 ? ? ? ?dat=dat>>1;
    if (testb) 
     {
      DS18B20_DQ_OUT=0;   // Write 1
      DelayUs(2);              
      DS18B20_DQ_OUT=1;
      DelayUs(60);       
     }
    else 
     {
      DS18B20_DQ_OUT=0;   // Write 0
      DelayUs(60);       
      DS18B20_DQ_OUT=1;
      DelayUs(2);             
     }
   }
}
//开始温度转换
void DS18B20_Start(void) 
{                                  
  DS18B20_Rst();    
    DS18B20_Check();     
  DS18B20_Write_Byte(0xcc);   // skip rom
  DS18B20_Write_Byte(0x44);   // convert
} 
//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在        
u8 DS18B20_Init(void)
{
    RCC->APB2ENR|=1<<8; ?       //使能PORTG口时钟 
    GPIOG->CRH&=0XFFFF0FFF;     //PORTG.11 推挽输出
    GPIOG->CRH|=0X00003000;
    GPIOG->ODR|=1<<11; ? ?      //输出1
    DS18B20_Rst();
    return DS18B20_Check();
} ?
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{
 ? ?u8 temp;
 ? ?u8 TL,TH;
    short tem;
 ? ?DS18B20_Start ();           // ds1820 start convert
 ? ?DS18B20_Rst();
 ? ?DS18B20_Check();     
 ? ?DS18B20_Write_Byte(0xcc);   // skip rom
 ? ?DS18B20_Write_Byte(0xbe);   // convert   ? ?
 ? ?TL=DS18B20_Read_Byte();     // LSB ? 
 ? ?TH=DS18B20_Read_Byte();     // MSB ?
     ?       ?
 ? ?if(TH>7)
   {
    TH=~TH;
    TL=~TL; 
    temp=0;                 //温度为负 
   }else temp=1;               //温度为正       
  tem=TH;                     //获得高八位
  tem<<=8; ? ?
 ? ?tem+=TL;                    //获得底八位
 ? ?tem=(float)tem*0.625;       //转换 ? ? 
    if(temp)return tem;         //返回温度值
    else return -tem; ? ?
}
3.3 lcd屏图形绘制核心算法
整个项目的功能都是在LCD显示屏上,需要绘制线段、绘制圆、绘制矩形、绘制角度线段、绘制中文、绘制数字等等,下面列出这部分的核心代码。

/*
函数功能:画横直线
函数形参:x,y:坐标
 ? ? ? ?length:长度
*/
void LcdDrawThwartLine(u16 x,u16 y,u16 length,u16 color)
{
    u16 i;
    for(i=0;i0)incx=1; //设置单步方向 
    else if(delta_x==0)incx=0;//垂直线 
    else {incx=-1;delta_x=-delta_x;} 
    if(delta_y>0)incy=1; 
    else if(delta_y==0)incy=0;//水平线 
    else{incy=-1;delta_y=-delta_y;} 
    if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 
    else distance=delta_y; 
    for(t=0;t<=distance+1;t++ )//画线输出 
    { ?
        LcdDrawPoint(uRow,uCol,color);//画点 
        xerr+=delta_x ; 
        yerr+=delta_y ; 
        if(xerr>distance) 
        { 
            xerr-=distance; 
            uRow+=incx; 
        } 
        if(yerr>distance) 
        { 
            yerr-=distance; 
            uCol+=incy; 
        } 
    } 
} 
?
?
//在指定位置画一个指定大小的圆
//(x,y):中心点
//r   :半径
void LcdDraw_Circle(u16 x0,u16 y0,u8 r,u16 color)
{
    int a,b;
    int di;
    a=0;b=r;     
    di=3-(r<<1); ? ? ? ? ? ? //判断下个点位置的标志
    while(a<=b)
    {
        LcdDrawPoint(x0+a,y0-b,color); ? ? ? ? ? ? //5
        LcdDrawPoint(x0+b,y0-a,color); ? ? ? ? ? ? //0 ? ? ? ? ? 
        LcdDrawPoint(x0+b,y0+a,color); ? ? ? ? ? ? //4 ? ? ? ? ? ? ? 
        LcdDrawPoint(x0+a,y0+b,color); ? ? ? ? ? ? //6 
        LcdDrawPoint(x0-a,y0+b,color); ? ? ? ? ? ? //1 ? ? ? 
        LcdDrawPoint(x0-b,y0+a,color); ? ? ? ? ? ? 
        LcdDrawPoint(x0-a,y0-b,color); ? ? ? ? ? ? //2 ? ? ? ? ? ? 
        LcdDrawPoint(x0-b,y0-a,color); ? ? ? ? ? ? //7 ? ?   ? ? ? ? 
        a++;
        //使用Bresenham算法画圆 ? ? 
        if(di<0)di +=4*a+6;  ?
        else
        {
            di+=10+4*(a-b); ? 
            b--;
        }                        ? ?
    }
} 
?
/*
函数功能:任意角度画直线 
参 ?  数:
                    w  :以圆心开始不要画的长度
                    len:半径
                    c  :颜色
                    x,y:坐标
实际长度=len-w
*/
?
void LcdDrawAngleLine(u32 x,u32 y,float du,u32 len,u32 w,u16 c)
{
 ?int i;
    int x0,y0;
    float k=du*(3.1415926535/180);  
    for(i=len-w;i;i++)>;i++)>
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

审核编辑:汤梓红


?

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2567

    文章

    53163

    浏览量

    769066
  • 显示屏
    +关注

    关注

    28

    文章

    4614

    浏览量

    76673
  • STM32
    +关注

    关注

    2295

    文章

    11035

    浏览量

    366027
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    万年历 时钟 闹钟时间设置方案:KT6368A 蓝牙芯片同步技术详解

    该文档主要介绍了万年历、时钟、闹钟类产品设置时间的几种方式,重点说明了通过蓝牙芯片同步手机时间的两种方式,尤其是 KT6368A 蓝牙芯片的使用方法、操作指南及优点,具体内容如下: 1.时间设置
    的头像 发表于 06-12 14:31 ?442次阅读
    <b class='flag-5'>万年历</b>  时钟  闹钟时间设置<b class='flag-5'>方案</b>:KT6368A 蓝牙芯片同步技术详解

    基于51单片机的多功能万年历设计

    基于51单片机的多功能万年历设计? ? 本项目是基于51单片机STC89系列,运用protues仿真软件开发,使用模块化编程方法,模块化电路设计,硬件部分采用
    发表于 06-03 17:17 ?0次下载

    如何利用RTC外设实现万年历功能

    本小节讲解的是如何利用RTC外设实现万年历功能,本实验工程与RTC底层驱动相关的文件为bsp_rtc.c/h,在底层驱动之上我们添加了bsp_calendar.c/h和bsp_date.c/h文件,用于万年历的计算。
    的头像 发表于 02-18 16:56 ?1143次阅读

    指针式用表测量电压技巧

    电子维修和电气工程领域,准确测量电压是至关重要的。指针式用表因其直观的读数和可靠性而广受欢迎。 1. 了解指针式用表 在开始测量之前,
    的头像 发表于 01-23 09:32 ?1389次阅读

    指针式用表与数字用表对比

    电子维修和测试领域,用表是不可或缺的工具。它们能够测量电压、电流、电阻等多种电气参数。市场上主要有两种类型的用表:指针式用表和数字
    的头像 发表于 01-23 09:31 ?1629次阅读

    指针式用表的应用场景

    电子工程、电气维修以及日常的电子设备维护中,用表是一种不可或缺的工具。指针式用表以其直观的读数方式和稳定的性能,一直受到工程师和技术人
    的头像 发表于 01-23 09:28 ?1223次阅读

    如何选择适合的指针式用表

    指针式用表(Analog Multimeter)是一种常用的电子测量工具,它能够测量电压、电流、电阻等多种电气参数。尽管数字用表因其精确性和易用性而越来越受欢迎,但
    的头像 发表于 01-23 09:26 ?1059次阅读

    指针式用表测量电流的方法

    一、指针式用表简介 指针式用表是一种模拟电子测量仪器,它通过一个可移动的指针来显示测量结果。
    的头像 发表于 01-23 09:25 ?2473次阅读

    指针式用表功能介绍

    电子工程和电气维修领域,用表是不可或缺的工具之一。它能够快速测量电路中的电压、电流和电阻等参数,帮助工程师和技术人员诊断和修复电路问题。 指针式用表的基本原理
    的头像 发表于 01-23 09:12 ?2078次阅读

    指针式用表读数技巧

    1. 了解指针式用表的基本构造 在使用指针式用表之前,了解其基本构造是非常重要的。指针式
    的头像 发表于 01-22 18:20 ?1534次阅读

    指针式用表和数字用表哪个好

    电子测量领域,用表是工程师和技术人员不可或缺的工具。它们能够测量电压、电流、电阻等多种电气参数。市场上主要有两种类型的用表:指针式
    的头像 发表于 01-22 17:28 ?3528次阅读

    指针式用表使用指南

    一、指针式用表简介 指针式用表是一种传统的电子测量工具,因其表头指针的摆动来显示测量结果而得
    的头像 发表于 01-22 17:25 ?1915次阅读

    指针式用表测量精度比较

    指针式用表的核心是一个可变电阻器(分压器)和一个可动的指针。当测量电压或电流时,通过分压器的电阻值会改变,从而改变通过指针的电流,使指针
    的头像 发表于 01-22 17:23 ?976次阅读

    【RA-Eco-RA4E2-64PIN-V1.0开发板试用】使用任意定时器实现软件万年历

    *附件:WanNianLi.zip如何实现一个电子万年历 万年历是从19901月1日开始的所有年份的、月、日、时、分、秒信息。 这个和我
    发表于 01-17 12:32

    TG2518芯片万年历原理图

    TG2518芯片万年历原理图
    发表于 09-30 11:11 ?7次下载