專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

51hei開(kāi)發(fā)板+手機(jī)TFT彩屏+1302時(shí)鐘+溫度

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2011年03月27日   【字體:

      時(shí)間:2011年3月26號(hào)

       芯片:STC12C5A60S2, 當(dāng)采用stc89c52這類標(biāo)準(zhǔn)速度單片機(jī)的時(shí)候需要修改程序中的延時(shí)值

       時(shí)鐘芯片:DS1302

       溫度傳感器:18B20

       TFT彩屏:320X240    26萬(wàn)色     8位數(shù)據(jù)      不帶觸摸     控制器-ILI9325   

       功能:只是簡(jiǎn)單的時(shí)間和溫度顯示,適合初學(xué)者學(xué)習(xí)彩屏顯示。



   以上是本程序在51hei-5單片機(jī)開(kāi)發(fā)板上的顯示效果,2.4寸的tft手機(jī)彩屏是直接插入板子12864接口的,要注意12864是20pin ,而我們生產(chǎn)的彩屏是18pin的,第一pin對(duì)第一pin故左邊會(huì)多出2個(gè)腳,大家千萬(wàn)不要插錯(cuò)位了不然會(huì)燒毀的,由于篇幅有限以下僅僅列出主程序本程序完整代碼及hex文件下載:http://www.torrancerestoration.com/f/caip11.rar

 

主函數(shù):

#include "STC.h"
#include"18B20.h"
#include"ILI9325.h"
//#include"anjian.h"
#include"1302.h"

//======定義彩屏顯示的顏色,可以不定義,直接寫入16進(jìn)制代碼========//
//0xF800  //紅
//0x07E0  //綠
//0x001F  //藍(lán)
//0xFFE0  //黃
//0x0000  //黑
//0xFFFF  //白
//0xF81F  //紫紅色
//0x7FFF  //青色
//0x051F  //青藍(lán)

//====================主函數(shù)=========================//
void  main(void)
 {   
  CS=1;
  delayms(10);
  RES=0;
  delayms(10);
  RES=1;
  delayms(10); 
   ILI9325_Initial(); //彩屏初始化   
  ClearScreen(0x001F);   //清屏 
 
 while(1)       
  {       
   LCD_PutString(10+0, 10+40,  "溫度",      0xFFE0,0x001F);    
   LCD_PutChar  (10+60,10+40,  '.',         0xFFE0,0x001F);       
   LCD_PutString(10+85,10+40,  "℃",        0xFFFF,0x001F);  
   LCD_PutString(10+0, 10,     "時(shí)間",      0xFFE0,0x001F);
   LCD_PutString(10+0, 10+20,  "日期",      0xFFE0,0x001F);
   
   Write_DS1302Init(); 
   Run_DS1302(); //經(jīng)過(guò)調(diào)試,必須將溫度程序加入1302程序中,才能正常測(cè)溫。    
// if((a==qian)&&(b==bai)&&(c==shi)&&(d==ge)&&(miao2<1)) { bi(500); }  //設(shè)定報(bào)警,響10秒鐘結(jié)束。  
 }  
   }    


時(shí)鐘程序:

#include "STC.h"
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

 sbit T_CLK = P1^6; /*實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 */
 sbit T_IO = P3^5; /*實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 */
 sbit T_RST = P1^7; /*實(shí)時(shí)時(shí)鐘復(fù)位線引腳 */


 sbit ACC0 = ACC^0;
 sbit ACC7 = ACC^7;
/********************************************************************
* 名稱 :  v_RTInputByte()
* 功能 :  往DS1302寫入1Byte數(shù)據(jù)
* 輸入 :  ucDa 寫入的數(shù)據(jù)
* 輸出 :  無(wú)
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
 uchar i;
 ACC = ucDa;
 T_RST = 1;
 for(i=8; i>0; i--)
 {
  T_IO = ACC0;
  T_CLK = 1;
  T_CLK = 0;
  ACC = ACC >> 1;
 }
}

/********************************************************************
* 名稱  :   uc_RTOutputByte()
* 功能  :   從DS1302讀取1Byte數(shù)據(jù)
* 輸入  : 無(wú)
* 返回值:   ACC
***********************************************************************/
uchar uc_RTOutputByte(void) 
{
 uchar i;
 T_RST = 1;
 for(i=8; i>0; i--)
 {
  ACC = ACC >>1;
  T_IO=1;
  ACC7 = T_IO;
  T_CLK = 1;
  T_CLK = 0;
 }
 return(ACC);
}

/********************************************************************
* 名稱   :   v_W1302(uchar ucAddr, uchar ucDa)
* 功能   :   往DS1302寫入數(shù)據(jù)
* 輸入   :   ucAddr: DS1302地址, ucDa: 要寫的數(shù)據(jù)
* 返回值 :   無(wú)
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(ucAddr);   // 寫地址 
 _nop_();
 _nop_();
 v_RTInputByte(ucDa);     // 寫1Byte數(shù)據(jù)
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名稱   :  uc_R1302(uchar ucAddr)
* 功能   :  讀取DS1302某地址的數(shù)據(jù)
* 輸入   :  ucAddr: DS1302地址
* 返回值 :  ucDa :讀取的數(shù)據(jù)
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
 uchar ucDa;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(ucAddr);    //寫地址,命令
 _nop_();
 _nop_();
 ucDa = uc_RTOutputByte(); //讀1Byte數(shù)據(jù)
 T_CLK = 1;
 T_RST = 0;
 return(ucDa);
}

/********************************************************************
* 名稱   :  v_BurstW1302T
* 功能   :  往DS1302寫入時(shí)鐘數(shù)據(jù)(多字節(jié)方式)
* 輸入   :  pSecDa: 時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年 控制
*          8Byte (BCD碼) 1B 1B 1B 1B 1B 1B  1B  1B
* 返回值 :  無(wú)
***********************************************************************/
void v_BurstW1302T(uchar *pSecDa)
{
 uchar i;
 v_W1302(0x8e, 0x00);          //控制命令,WP=0,寫操作
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xbe);          //0xbe:時(shí)鐘多字節(jié)寫命令
 for(i=8; i>0; i--)            //8Byte = 7Byte 時(shí)鐘數(shù)據(jù) + 1Byte 控制
 {
  v_RTInputByte(*pSecDa);   //寫1Byte數(shù)據(jù)
  pSecDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名稱   :  v_BurstR1302T(uchar *pSecDa)
* 功能   :  讀取DS1302時(shí)鐘數(shù)據(jù)
* 輸入   :  pSecDa: 時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年
*             7Byte (BCD碼) 1B 1B 1B 1B 1B 1B   1B
* 返回值 :  ucDa :讀取的數(shù)據(jù)
***********************************************************************/
void v_BurstR1302T(uchar *pSecDa)
{
 uchar i;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xbf);               //0xbf:時(shí)鐘多字節(jié)讀命令
 for(i=8; i>0; i--)
 {
  *pSecDa = uc_RTOutputByte();   //讀1Byte數(shù)據(jù)
  pSecDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名稱   :  v_BurstW1302R(uchar *pReDa)
* 功能   :  往DS1302寄存器數(shù)寫入數(shù)據(jù)(多字節(jié)方式)
* 輸入   :  pReDa: 寄存器數(shù)據(jù)地址
* 返回值 :  無(wú)
***********************************************************************/
void v_BurstW1302R(uchar *pReDa)
{
 uchar i;
 v_W1302(0x8e,0x00);         //控制命令,WP=0,寫操作
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xfe);       //0xbe:時(shí)鐘多字節(jié)寫命令
 for(i=31; i>0; i--)        //31Byte 寄存器數(shù)據(jù)
 {
  v_RTInputByte(*pReDa); //寫1Byte數(shù)據(jù)
  pReDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名稱   :  v_BurstR1302R(uchar *pReDa)
* 功能   :  讀取DS1302寄存器數(shù)據(jù)
* 輸入   :  pReDa: 寄存器數(shù)據(jù)地址
* 返回值 :  無(wú)
***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
 uchar i;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xff);            //0xbf:時(shí)鐘多字節(jié)讀命令
 for(i=31; i>0; i--)             //31Byte 寄存器數(shù)據(jù)
 {
  *pReDa = uc_RTOutputByte(); //讀1Byte數(shù)據(jù)
  pReDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名稱  :  v_Set1302(uchar *pSecDa)
* 功能  :  設(shè)置初始時(shí)間
* 輸入  :  pSecDa: 初始時(shí)間地址。初始時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年
*            7Byte (BCD碼) 1B 1B 1B 1B 1B 1B  1B
* 返回值: 無(wú)
***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
 uchar i;
 uchar ucAddr = 0x80;
 v_W1302(0x8e, 0x00);            //控制命令,WP=0,寫操作
 for(i=7; i>0; i--)
 {
  v_W1302(ucAddr, *pSecDa);   // 秒 分 時(shí) 日 月 星期 年
  pSecDa++;
  ucAddr += 2;
 }
 v_W1302(0x8e, 0x80);            //控制命令,WP=1,寫保護(hù)
}

/********************************************************************
* 名稱   : v_Get1302(uchar ucCurtime[])
* 功能   : 讀取DS1302當(dāng)前時(shí)間
* 輸入   : ucCurtime: 保存當(dāng)前時(shí)間地址。當(dāng)前時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年
*                                         7Byte (BCD碼) 1B 1B 1B 1B 1B  1B  1B
* 返回值 : 無(wú)
***********************************************************************/
void v_Get1302(uchar ucCurtime[])
{
 uchar i;
 uchar ucAddr = 0x81;
 for(i=0; i<7; i++)
 {
  ucCurtime[i] = uc_R1302(ucAddr);    //格式為: 秒 分 時(shí) 日 月 星期 年
  ucAddr += 2;
 }
}

/********************************************************************
* 名稱 : dectobcd(uchar dec)
* 功能 : DEC碼轉(zhuǎn)換為BCD碼
* 輸入 : dec碼
* 輸出 : bcd碼
***********************************************************************/
uchar dectobcd(uchar dec)
{
 uchar bcd;
 bcd = 0;
 while(dec >= 10)
 {              
  dec -= 10;                         
  bcd++;
 } 
 bcd <<= 4;
 bcd |= dec;
 return bcd;
}

/********************************************************************
* 名稱 : bcdtodec(uchar bcd)
* 功能 : BCD碼轉(zhuǎn)換為DEC碼
* 輸入 : bcd碼
* 輸出 : dec碼
***********************************************************************/
uchar bcdtodec(uchar bcd)
{
 uchar data1;
 data1 = bcd & 0x0f;     //取BCD低4位
 bcd = bcd & 0x70;       //剔除BCD的最高位和低4位。
 data1 += bcd >> 1;
 data1 += bcd >> 3;      //用位移代替乘法運(yùn)算
 return data1;
}

/********************************************************************
* 名稱 : Write_DS1302Init()
* 功能 : 往DS1302中寫入數(shù)據(jù)。最開(kāi)始顯示的數(shù)據(jù)就是在這里設(shè)置的。
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void Write_DS1302Init(void)
{
 v_W1302(0x8e,0);
 v_W1302(0x80,0x50); //寫入秒
 v_W1302(0x8e,0);
 v_W1302(0x82,0x59); //寫入分
 v_W1302(0x8e,0);
 v_W1302(0x84,0x07); //寫入小時(shí)
 v_W1302(0x8e,0);
 v_W1302(0x86,0x08); //寫入日
 v_W1302(0x8e,0);
 v_W1302(0x88,0x08); //寫入月
 v_W1302(0x8e,0);
 v_W1302(0x8a,0x05); //寫入星期
 v_W1302(0x8e,0);
 v_W1302(0x8c,0x08); //寫入年 
}

/********************************************************************
* 名稱 : Run_DS1302(void)
* 功能 : 讀出DS1302中的數(shù)據(jù),并在液晶1602上進(jìn)行顯示
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void Run_DS1302(void)
{
 uchar sec, min, hour, day, month, year;
 while(1)
 {
  v_W1302(0x8f, 0);
  sec = bcdtodec(uc_R1302(0x81));    //讀出DS1302中的秒
  v_W1302(0x8f, 0);
  min = bcdtodec(uc_R1302(0x83));    //讀出DS1302中的分
  v_W1302(0x8f, 0);
  hour = bcdtodec(uc_R1302(0x85));   //讀出DS1302中的小時(shí)
  v_W1302(0x8f, 0);
  day = bcdtodec(uc_R1302(0x87));    //讀出DS1302中的日
  v_W1302(0x8f, 0);
  month = bcdtodec(uc_R1302(0x89));  //讀出DS1302中的月
  v_W1302(0x8f, 0);
  year = bcdtodec(uc_R1302(0x8d));   //讀出DS1302中的年

  LCD_PutChar  (10+40,  10,    hour/10%10  +'0',  0xFFE0,0x001F);  //
  LCD_PutChar  (10+50,  10,    hour%10     +'0',  0xFFE0,0x001F);  //顯示DS1302中的時(shí)
  LCD_PutChar  (10+60,  10,                 ':',  0xFFE0,0x001F);
  LCD_PutChar  (10+70,  10,    min/10%10   +'0',  0xFFE0,0x001F);  //
  LCD_PutChar  (10+80,  10,    min%10      +'0',  0xFFE0,0x001F);  //顯示DS1302中的分
  LCD_PutChar  (10+90,  10,                 ':',  0xFFE0,0x001F);    
  LCD_PutChar  (10+100, 10,    sec/10%10   +'0',  0xFFE0,0x001F);  //
  LCD_PutChar  (10+110, 10,    sec%10      +'0',  0xFFE0,0x001F);  //顯示DS1302中的秒 

  LCD_PutChar  (10+40,  10+20,             +'2',  0xFFE0,0x001F);  //獨(dú)立顯示年
  LCD_PutChar  (10+50,  10+20,             +'0',  0xFFE0,0x001F);  //獨(dú)立顯示年
  LCD_PutChar  (10+60,  10+20, year/10%10  +'0',  0xFFE0,0x001F);  //
  LCD_PutChar  (10+70,  10+20, year%10     +'0',  0xFFE0,0x001F);  //顯示DS1302中的年
  LCD_PutChar  (10+80,  10+20,              ':',  0xFFE0,0x001F);
  LCD_PutChar  (10+90,  10+20, month/10%10 +'0',  0xFFE0,0x001F);  //
  LCD_PutChar  (10+100, 10+20, month%10    +'0',  0xFFE0,0x001F);  //顯示DS1302中的月
  LCD_PutChar  (10+110, 10+20,              ':',  0xFFE0,0x001F);
  LCD_PutChar  (10+120, 10+20, day/10%10   +'0',  0xFFE0,0x001F);  //
  LCD_PutChar  (10+130, 10+20, day%10      +'0',  0xFFE0,0x001F);  //顯示DS1302中的日
 
  ReadTemperature();    //讀取溫度轉(zhuǎn)換后的值
  LCD_PutChar  (10+40,10+40,   temp/10+'0', 0xFFE0,0x001F);   //顯示溫度十位
  LCD_PutChar  (10+50,10+40,   temp%10+'0', 0xFFE0,0x001F);  //顯示溫度個(gè)位
  LCD_PutChar  (10+70,10+40,   xs%10+'0',   0xFFE0,0x001F);  //顯示溫度小數(shù)位
 }  
  }
關(guān)閉窗口

相關(guān)文章