×
嵌入式开发 > 详情

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

发布时间:2020-06-30 发布时间:
|

时间: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文件下载

主函数:#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)(miao21)) { bi(500); }  //设定报警,响10秒钟结束。  }  }    时钟程序:
#include "STC.h"#includeintrins.h>#define uchar unsigned char#define uint  unsigned intsbit 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; i7; 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);  //显示温度小数位}  }


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM入门篇之(一)概念