娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

指針式電子鐘與萬年歷設計方案

發布者:JoyfulExplorer最新更新時間:2024-06-26 來源: elecfans關鍵字:萬年歷  STM32 手機看文章 掃描二維碼
隨時隨地手機看文章

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 流程圖

指針式電子鐘與萬年歷設計方案

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++)>

關鍵字:萬年歷  STM32 引用地址:指針式電子鐘與萬年歷設計方案

上一篇:PCB疊層設計與阻抗分析
下一篇:一個低功耗應用的案例分析

推薦閱讀最新更新時間:2025-06-07 23:36

STM8實現萬年歷(高亮調時)
一、設計內容: 本次設計使用stm8s實現簡單的萬年歷,主要功能是顯示時間、調時、設置鬧鈴。另外還添加了游戲輔助功能。 二、設計要求: 1、主控芯片使用stm8s 2、使用pcb板 3、至少要實現數碼管顯示時間和調時功能 三、設計過程: 設計總共分為兩塊,硬件設計和軟件設計。首先是構思要實現的功能,然后了解硬件資源再進行軟件設計。所以下面首先介紹硬件設計。 1、硬件設計部分 A、元件清單 器件名 型號 數量 Lcd 12864 1 DS1302 1 晶振 32.768KHz 1 Stm8s105s4 1 按鍵 5 二極管 1n4
[單片機]
12864萬年歷+溫度計+鬧鐘+溫度檢測
單片機源程序如下: /****************************文件包含*************************************/ #include reg52.h #include character.h #include lcd.h #include clock.h #include sensor.h #include calendar.h #include key.h /*****************************預定義**************************************/ #define uchar unsigne
[單片機]
12864<font color='red'>萬年歷</font>+溫度計+鬧鐘+溫度檢測
基于單片機的多功能電子萬年歷設計(一)
引言   隨著生活節奏的日益加快,人們的時間觀也越來越重,同時對電子鐘表、日歷的需求也隨之提高。因此,研究實用電子時鐘及其擴展應用,有著非常現實的意義,具有很大的實用價值。   本系統程序由主程序、中斷服務函數和多個子函數構成。主函數主要完成各子函數和中斷函數的初始化。定時中斷函數主要完成時鐘芯片的定時掃描及鍵盤掃描。時鐘芯片的讀寫函數主要是將時間、日歷信息讀出來,并把要修改具體值寫入時鐘芯片內部。   系統的硬件設計與電路原理   電路設計框圖   系統硬件概述   本電路是由AT89S52單片機為控制核心,具有在線編程功能、低功耗、能在3V的超低壓工作。時鐘電路由DS1302提供,它是一種高性能、低功耗、帶RAM的
[模擬電子]
基于單片機的多功能電子<font color='red'>萬年歷</font>設計(一)
stm32固件庫之LED(DISCO F407VG)
//引腳定義 /*******************************************************/ //R 紅色燈 #define LED1_PIN GPIO_Pin_14 #define LED1_GPIO_PORT GPIOD #define LED1_GPIO_CLK RCC_AHB1Periph_GPIOD //G 綠色燈 #define LED2_PIN GPIO_Pin_12 #define LED2_GPIO_PORT GPIOD #defi
[單片機]
STM32自制GUI小游戲--Apple的學習筆記
一,前言 要過年了,我就玩會吧~GUI之前學習過了guilite源碼,那么我就調用它的API自己做個小游戲玩玩。步驟是先在vs上完成調試,然后移植到stm32F4開發板上。主要也想多用用新買的并口LCD屏,因為之前的ili9325并口8bit連camera不能用DMA,我又買了個ili9431并口16bit屏幕(連接camera方便DMA直接采集賦值),因為8bit的話,16bit需要先傳高bit再傳低bit給LCD。而camera DMA是4個字節按低地址到高地址寫到LCD,這樣就導致8bit LCD無法通過DMA連接camera了。跑題了,我順便述說我的新屏幕,哈哈~先看下游戲效果圖吧!其實可以理解為一個超級瑪麗小游戲。
[單片機]
STM32新建匯編工程2
上一篇文章里寫了新建工程的過程中,使用了keil提供的文件,也可以不使用,自己手動拷貝,這樣工程會更簡單一些,只需要拷貝啟動文件一個即可,如下界面里不做選擇 新建工程的時候不選軟件部件 然后直接新建工程,新建完工程后,再去之前的工程中,只將startup_stm32f10x_hd.s文件拷貝過來,放置到新建的工程目錄下,然后在界面中加入已經存在的文件,然后新建一個main.s文件,將上篇文章中的代碼拷貝過來,如下圖 由于沒有系統時鐘配置部分的c代碼,需要修改啟動代碼中調用了系統時鐘初始化的部分,注釋掉即可,如下圖 注釋掉啟動文件中的調用系統時鐘初始化的部分 然后編譯,啟動調試,可以看到依然會停到main.s中的B
[單片機]
參照STM32時鐘樹配置STM32CubeMX Clock Configuration(STM32L011G4U6為例)
微控制器(處理器)的運行必須要依賴周期性的時鐘脈沖來驅動——往往由一個外部晶體振蕩器提供時鐘輸入為始,最終轉換為多個外部設備的周期性運作為末,這種時鐘“能量”擴散流動的路徑,猶如大樹的養分通過主干流向各個分支,因此常稱之為“時鐘樹”。在一些傳統的低端8位單片機諸如51,AVR,PIC等單片機,其也具備自身的一個時鐘樹系統,但其中的絕大部分是不受用戶控制的,亦即在單片機上電后,時鐘樹就固定在某種不可更改的狀態(假設單片機處于正常工作的狀態)。比如51單片機使用典型的12MHz晶振作為時鐘源,則外設如IO口、定時器、串口等設備的驅動時鐘速率便已經是固定的,用戶無法將此時鐘速率更改,除非更換晶振。 而STM32微控制器的時鐘樹則
[單片機]
STM32的Bootloader
Bootloader 提到bootloader,你可能會想到計算機中的引導程序,它是計算機開機完成自檢后裝載操作系統或者其他系統軟件的計算機程序。 引導在英文中為Boot,是Bootstrap的縮寫,源自于短語Pull oneself up by one's Bootstraps.,即靠自己振作起來。如果大部分軟件需要通過其他已經運行的程序加載到計算機中,則必須存在一個將初始軟件加載到計算機中的機制——也就是 Bootloader。 是不是有點抽象?那么我們來舉個栗子: 你的電腦,裝了windows系統,而我們運行的所有軟件比如QQ,Steam,瀏覽器,Photoshop等,必須通過Windows這個大軟件來加載到計算機中
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 四平市| 新民市| 伊吾县| 泗水县| 长兴县| 德惠市| 秦皇岛市| 邻水| 昭通市| 永和县| 淳安县| 凤阳县| 同心县| 轮台县| 淳安县| 桑植县| 景谷| 库车县| 青岛市| 澜沧| 宕昌县| 雅安市| 邓州市| 讷河市| 山东| 商丘市| 青海省| 大庆市| 甘肃省| 休宁县| 宜兰县| 内黄县| 瓮安县| 临颍县| 黄龙县| 天等县| 沈丘县| 乌拉特前旗| 揭阳市| 清远市| 读书|