51hei开发板+手机TFT彩屏+1302时钟+温度

发布者:王岚枫最新更新时间:2012-08-24 来源: 51hei关键字:手机TFT彩屏  1302时钟  温度 手机看文章 扫描二维码
随时随地手机看文章

      时间:2011年3月26号

       芯片:STC12C5A60S2, 当采用stc89c52这类标准速度单片机的时候需要修改程序中的延时值

       时钟芯片:DS1302

       温度传感器:18B20

       TFT彩屏:320X240    26万色     8位数据      不带触摸     控制器-ILI9325   

       功能:只是简单的时间和温度显示,适合初学者学习彩屏显示。

点击浏览下一页

   以上是本程序在51hei-5单片机开发板上的显示效果,2.4寸的tft手机彩屏是直接插入板子12864接口的,要注意12864是20pin ,而我们生产的彩屏是18pin的,第一pin对第一pin故左边会多出2个脚,大家千万不要插错位了不然会烧毁的,由于篇幅有限以下仅仅列出主程序本程序完整代码及hex文件下载:http://www.51hei.com/f/caip11.rar

 

主函数:

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

//======定义彩屏显示的颜色,可以不定义,直接写入16进制代码========//
//0xF800  //红
//0x07E0  //绿
//0x001F  //蓝
//0xFFE0  //黄
//0x0000  //黑
//0xFFFF  //白
//0xF81F  //紫红色
//0x7FFF  //青色
//0x051F  //青蓝

//====================主函数=========================//
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,     "时间",      0xFFE0,0x001F);
   LCD_PutString(10+0, 10+20,  "日期",      0xFFE0,0x001F);
   
   Write_DS1302Init(); 
   Run_DS1302(); //经过调试,必须将温度程序加入1302程序中,才能正常测温。    
// if((a==qian)&&(b==bai)&&(c==shi)&&(d==ge)&&(miao2<1)) { bi(500); }  //设定报警,响10秒钟结束。  
 }  
   }    


时钟程序:

#include "STC.h"
#include

#define uchar unsigned char
#define uint  unsigned int

 sbit T_CLK = P1^6; /*实时时钟时钟线引脚 */
 sbit T_IO = P3^5; /*实时时钟数据线引脚 */
 sbit T_RST = P1^7; /*实时时钟复位线引脚 */


 sbit ACC0 = ACC^0;
 sbit ACC7 = ACC^7;
/********************************************************************
* 名称 :  v_RTInputByte()
* 功能 :  往DS1302写入1Byte数据
* 输入 :  ucDa 写入的数据
* 输出 :  无
***********************************************************************/
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数据
* 输入  : 无
* 返回值:   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写入数据
* 输入   :   ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值 :   无
***********************************************************************/
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数据
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  uc_R1302(uchar ucAddr)
* 功能   :  读取DS1302某地址的数据
* 输入   :  ucAddr: DS1302地址
* 返回值 :  ucDa :读取的数据
***********************************************************************/
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数据
 T_CLK = 1;
 T_RST = 0;
 return(ucDa);
}

/********************************************************************
* 名称   :  v_BurstW1302T
* 功能   :  往DS1302写入时钟数据(多字节方式)
* 输入   :  pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
*          8Byte (BCD码) 1B 1B 1B 1B 1B 1B  1B  1B
* 返回值 :  无
***********************************************************************/
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:时钟多字节写命令
 for(i=8; i>0; i--)            //8Byte = 7Byte 时钟数据 + 1Byte 控制
 {
  v_RTInputByte(*pSecDa);   //写1Byte数据
  pSecDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  v_BurstR1302T(uchar *pSecDa)
* 功能   :  读取DS1302时钟数据
* 输入   :  pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
*             7Byte (BCD码) 1B 1B 1B 1B 1B 1B   1B
* 返回值 :  ucDa :读取的数据
***********************************************************************/
void v_BurstR1302T(uchar *pSecDa)
{
 uchar i;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xbf);               //0xbf:时钟多字节读命令
 for(i=8; i>0; i--)
 {
  *pSecDa = uc_RTOutputByte();   //读1Byte数据
  pSecDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  v_BurstW1302R(uchar *pReDa)
* 功能   :  往DS1302寄存器数写入数据(多字节方式)
* 输入   :  pReDa: 寄存器数据地址
* 返回值 :  无
***********************************************************************/
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:时钟多字节写命令
 for(i=31; i>0; i--)        //31Byte 寄存器数据
 {
  v_RTInputByte(*pReDa); //写1Byte数据
  pReDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称   :  v_BurstR1302R(uchar *pReDa)
* 功能   :  读取DS1302寄存器数据
* 输入   :  pReDa: 寄存器数据地址
* 返回值 :  无
***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
 uchar i;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_RTInputByte(0xff);            //0xbf:时钟多字节读命令
 for(i=31; i>0; i--)             //31Byte 寄存器数据
 {
  *pReDa = uc_RTOutputByte(); //读1Byte数据
  pReDa++;
 }
 T_CLK = 1;
 T_RST = 0;
}

/********************************************************************
* 名称  :  v_Set1302(uchar *pSecDa)
* 功能  :  设置初始时间
* 输入  :  pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
*            7Byte (BCD码) 1B 1B 1B 1B 1B 1B  1B
* 返回值: 无
***********************************************************************/
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);   // 秒 分 时 日 月 星期 年
  pSecDa++;
  ucAddr += 2;
 }
 v_W1302(0x8e, 0x80);            //控制命令,WP=1,写保护
}

/********************************************************************
* 名称   : v_Get1302(uchar ucCurtime[])
* 功能   : 读取DS1302当前时间
* 输入   : ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
*                                         7Byte (BCD码) 1B 1B 1B 1B 1B  1B  1B
* 返回值 : 无
***********************************************************************/
void v_Get1302(uchar ucCurtime[])
{
 uchar i;
 uchar ucAddr = 0x81;
 for(i=0; i<7; i++)
 {
  ucCurtime[i] = uc_R1302(ucAddr);    //格式为: 秒 分 时 日 月 星期 年
  ucAddr += 2;
 }
}

/********************************************************************
* 名称 : dectobcd(uchar dec)
* 功能 : DEC码转换为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码转换为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;      //用位移代替乘法运算
 return data1;
}

/********************************************************************
* 名称 : Write_DS1302Init()
* 功能 : 往DS1302中写入数据。最开始显示的数据就是在这里设置的。
* 输入 : 无
* 输出 : 无
***********************************************************************/
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); //写入小时
 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中的数据,并在液晶1602上进行显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
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中的小时
  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中的时
  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);  //独立显示年
  LCD_PutChar  (10+50,  10+20,             +'0',  0xFFE0,0x001F);  //独立显示年
  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();    //读取温度转换后的值
  LCD_PutChar  (10+40,10+40,   temp/10+'0', 0xFFE0,0x001F);   //显示温度十位
  LCD_PutChar  (10+50,10+40,   temp%10+'0', 0xFFE0,0x001F);  //显示温度个位
  LCD_PutChar  (10+70,10+40,   xs%10+'0',   0xFFE0,0x001F);  //显示温度小数位
 }  
  }
关键字:手机TFT彩屏  1302时钟  温度 引用地址:51hei开发板+手机TFT彩屏+1302时钟+温度

上一篇:LCD1602-DS1302时钟程序
下一篇:基于C51的RS232基本通信程序

推荐阅读最新更新时间:2024-03-16 13:06

关于LED组件的结温和引脚温度的热测试系统
LED热测试 为了在不牺牲可靠性的前提下获得最高的光学性能,必须了解特定应用中LED组件的热性能。1993年1月28日的技术备忘录“ LED灯的热特性”讨论了LED灯的基本热模型。本应用简介描述了Avago Technologies用于测量特定应用中安装的LED组件的结温和引脚温度的热测试系统。 通常,对LED组件进行热测试的目的是测量结温到环境的温升,以确保不超过最大结温。LED组件在高于最大结温的温度下的温度循环往往会导致金线键合产生过度的热应力,从而导致过早的灾难性故障。对于大多数Avago Technologies LED灯,最高结温为110°C。可以在产品数据表的“最大绝对额定值”中找到最大结温,也可以从“最大正向电
[测试测量]
关于LED组件的结温和引脚<font color='red'>温度</font>的热测试系统
Samtec连接器小课堂系列二 | 法向力、循环、温度和其他要点
【摘要/前言】 电镀会影响连接器系统的寿命和质量,包括耐腐蚀性、导电性、可焊性,当然还有成本。 【小课堂背景】 这是 Samtec质量工程经理 Phil Eckert 和首席工程师 Matt Brown 讨论连接器电镀相关问题的系列第二部分,主题为 “法向力、循环、温度和其他要点” 系列第一部分Samtec连接器电镀小课堂系列一 | 连接器电镀常识Q&A,获得了良好反响。因此Samtec将逐步推出系列后续科普文章,用以回答 Samtec 质量和加工专家经常提出的连接器电镀问题。 这些问题主要涉及镀金和镀锡,因为这是最常见的连接器电镀选项。 Q1:触点的法向力是否应该决定使用哪种镀层? A
[工业控制]
Samtec连接器小课堂系列二 | 法向力、循环、<font color='red'>温度</font>和其他要点
基于单片机的一种小型温度检测系统的设计
1 前言 温度是表征环境的一个重要的参数。在工程领域,尤其像工程热力学等,温度检测非常普遍,对温度精确测量以便实时控制也显得尤为重要。 在控制系统中,上位机与下位机之间实现通信的方法和应用平台很多。目前,以VB和VC开发的通信软件较多,然而,这类软件虽然功能完善,但是数据采集到计算机后要进行各种处理(例如滤波,系统辨识,曲线拟合等)就显得不方便,编程比较复杂。Matlab具有强大的数据处理能力及功能丰富的工具箱,被广泛的应用于信号处理、自动控制等领域。它编程语言简单易学,利用简单的命令就可以代替复杂的代码,极大地提高了开发效率。 本实验基于Matlab环境下设计了一个小型温度检测系统,下位机使用AT89S51单片机和DS1
[单片机]
基于单片机的一种小型<font color='red'>温度</font>检测系统的设计
51单片机DS1302时钟芯片简单程序
#include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int data_7seg ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; uchar hour,min,sec; sbit shi=P1^0; sbit fen=P1^1; sbit miao=P1^2; sbit rst=P1^4; sbit sck=P1^5; sbit io=P1^6; sbit fm=P1^7; /*函数声明:*/ void write_ds1302_byte(ucha
[单片机]
整流管与稳压管的参数和选择原则
电子爱好者经常要用二极管。二极管具有单向导电性,主要用于整流、稳压和混频等电路中。本文介绍整流二极管和稳压二极管的参数及选择原则。 (一)整流二极管的主要参数 1.IF— 最大平均整流电流。 指二极管期工作时允许通过的最大正向平均电流。该电流由PN结的结面积和散热条件决定。使用时应注意通过二极管的平均电流不能大于此值,并要满足散热条件。例如1N4000系列二极管的IF为1A。 2.VR— 最大反向工作电压。 指二极管两端允许施加的最大反向电压。若大于此值,则反向电流(IR)剧增,二极管的单向导电性被破坏,从而引起反向击穿。通常取反向击穿电压(VB)的一半作为(VR)。例如1N4001的VR为50V,1N4007的VR为1
[模拟电子]
解密:芯海科技片上数字温度传感器
新冠疫情火了“红外额温枪”,向额头轻轻一靠,额温枪便可测量出人体向外辐射的红外光能量,继而计算得出体温。 看似简单的外红温度计的背后,却隐藏着不简单的技术,我们知道体温会随着运动情况、室外温度而变化,那么红外温度计如何准确的捕捉红外光,如何排除室外温度例如冷空气的干扰,又该如何将红外信息转换为体温信息?这些都是额温枪内安置的芯片所要解决的问题。 芯海科技在这次疫情防控战中,扮演了重要角色,额温枪短时间内暴涨的需求,极大地考验着厂商技术、产能、上下游配合等综合能力。芯海科技以日产数十万片额温枪芯片的速度,证明了其在集感知、计算、控制于一体的信号链芯片领域的强劲实力,为疫情防控贡献了力量。 片上温度传感器一般具有两种架构:一种是传统利
[手机便携]
解密:芯海科技片上数字<font color='red'>温度</font>传感器
土壤温度湿度测试仪的产品介绍
土壤温度湿度测试仪产品介绍【霍尔德仪器HED-SW】土壤温度湿度测试仪使用注意点有哪些?土壤温度湿度测试仪由霍尔德测土仪器厂家专业生产提供土壤温度湿度测试仪检测服务,致力于土壤温度湿度测试仪的研发与设计,质量可靠,专业打造土壤温度湿度测试仪、测土仪等大类产品,操作简单方便,种类齐全。 土壤温湿度测试仪是农业生产过程中测试土壤温度湿度的便利仪器, 土壤温湿度测试仪体积轻巧在测试时极其方便,在测试使用时要注意: 为保证电极在管路上正确测量出pH值,应避免测量池间出现气泡而造成数据失准。切勿带电接线,接线完毕检查无误后方可通电。使用时不要随意改动产品出厂时已焊接好的元器件或导线。 传感器属于精密器件,用户在使用时请不要自行拆卸、
[测试测量]
基于PIC单片机的多回路温度控制系统设计
1.引言 对于塑料制瓶工艺, 塑料加热处于溶融状态, 经高压注射成为管胚, 短时间冷却以后, 经过高压空气的吹胀, 在制瓶模具中成型。其工艺特点之一是: 溶融状态下的塑料定时流动; 成为管胚之后, 将与外部空气接触 2 秒钟时间左右, 产品质量不可避免地受到环境温度的影响。 制瓶工艺要求在不同的制瓶过程中, 恒定在不同的温度下, 其温度控制是制瓶的关键技术之一。目前这种设备的温度控制装置通常采用单回路的通用温度控制仪表, 温度控制无法与工艺过程直接产生联系, 使得温度控制达不到最优状态, 而且受到环境温度的影响, 必须随环境温度的变化调整温度控制参数, 否则产品质量受到影响。另一方面, 单回路的通用温度控制仪表价格也比较高, 且多
[单片机]
基于PIC单片机的多回路<font color='red'>温度</font>控制系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved