找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6226|回复: 4
打印 上一主题 下一主题
收起左侧

51单片机初学实践:用DS1302模块和1.44寸TFT显示屏(ST7735)实现电子钟

  [复制链接]
跳转到指定楼层
楼主
这周在上次实现的电子钟(51单片机初学实践:用DS1302模块和LCD1602显示屏实现电子钟)的基础上作了以下2点改进:1、将LCD1602屏幕更换为1.44寸 TFT显示屏
主要考虑是TFT显示屏可以使用不同字体和颜色,更方便定制显示界面

2、将STC89C52RC单片机更换为STC12C5A60S2单片机
首先是空间更大,STC12C5A60S2单片机(60K bytes flash ROM, 1280 bytes data RAM),STC89C52RC单片机(8K bytes flash ROM, 512 bytes data RAM)

其次STC12C5A60S2单片机有单独的SPI接口(P1.5 MOSI 和 P1.6 MISO),可以更好地驱动TFT显示屏
STC12C5A60S2单片机有10位ADC(P1.0 - P1.7),可以采集光敏电阻电压,自动调整TFT显示屏背光亮度
STC12C5A60S2单片机有专用PWM输出(P1.3 和 P1.4,可以很方便地调整TFT显示屏背光亮度

TFT显示屏效果:
从上到下依次为:年月日 星期几 时分秒 气温 光敏电阻电压



串口打印效果:



实物接线效果:




在实践过程中,有以下心得:

1、STC12C5A60S2单片机有专用的串口定时器,更方便设置波特率
  1. /* 串口配置函数,通信波特率 9600 */
  2. void UART1_Config()
  3. {
  4.         PCON &= 0x7F;        //波特率不倍速
  5.         SCON  = 0x50;        //配置串口为模式1,允许发送和接收
  6.         //9600bps@11.0592MHz
  7.         BRT = 0xDC;                //设定独立波特率发生器重装值
  8.         AUXR |= 0x04;        //独立波特率发生器时钟为Fosc,即1T
  9.         AUXR |= 0x01;        //串口1选择独立波特率发生器为波特率发生器
  10.         AUXR |= 0x10;        //启动独立波特率发生器
  11.         EA = 1; //启用中断
  12.         ES = 1;        //启用串口中断
  13. }
复制代码

2、P3.2需要设置为推挽模式,以便更好地驱动显示屏背光
  1. #ifdef MCU_STC12
  2.         //P3.2 set as push-pull output mode, for LCD backlight
  3.         P3M1 &= ~(1<<2);
  4.         P3M0 |=  (1<<2);
  5. #endif
复制代码

3、ADC采样输入,需要用到P1.0和P1.1两个端口,P1.0用于测量TL431输出的参考电压2.5v,P1.1用于测量光敏电阻当前分压
















  1. void ADC_Init()
  2. {
  3.         P1ASF = 0x03;                //选择P1.0和P1.1作为ADC采样输入

  4.         // ADRJ=1时,10位A/D转换结果的高2位存放在ADC_RES的低2位中,低8位存放在ADC_RESL中
  5.         AUXR1 |= 1<<2;                 //set ADRJ=1 : 10bit result = ADC_RES<<8 + ADC_RESL
  6.         ADC_RES = 0;
  7.         ADC_RESL = 0;
  8.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL; // 打开A/D转换器电源, 540个时钟周期转换一次
  9.         Delay10us();
  10. }

  11. uint16 ADC_Get_Result(uint8 channel)
  12. {
  13.         uint16 res;
  14.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | channel;
  15.         _nop_(); //Must wait before inquiry
  16.         _nop_();
  17.         _nop_();
  18.         _nop_();
  19.         while(!(ADC_CONTR & ADC_FLAG));
  20.         ADC_CONTR &= ~ADC_FLAG;
  21.         res = (ADC_RES & 0x03) << 8;
  22.         res += ADC_RESL;
  23.         Delay10us();
  24.         Delay10us();
  25.         return res;
  26. }
复制代码

TL431和光敏电阻接线示意



光敏电阻的特点是光照越强阻值越小,分压降低,而在弱光环境则是阻值变大,分压升高,如下二图所示
可以根据这个特点自动调整显示屏背光强度




4、PWM输出

不需要修改频率,直接设置为SysClk/12





PCA模块工作模式设定为8位PWM,无中断



占空比调整通过设置不同的CCAP1L/H值来实现






  1. <blockquote>// 1.3和1.4口 PWM占空比,数值越大,占空比越小
复制代码

5、在TFT屏幕上显示字符
需要注意12x16和12x24这种字符点阵数据,由于12不是8的整数倍,实际存储16bit,使用时,需要跳过最后4个填充bit
//采用设置窗口方法填充12x24点阵数字
void Display_Digit_12x24(uint8 x, uint8 y, uint16 fc, uint16 bc, uint8 idx)
{
        uint8 i,j,k;
        
        LCD_Set_Region(x, y, 12, 24);
        for(i=0; i<3*16; i++)
        {
                if(1 == i%2) k = 4;
                else k = 8;
               
                for(j=0; j<k; j++)
                {
                        if(digit12x24[idx][ i]&(0x80>>j))
                        {
                                SPI_Write_Word(fc);
                        }
                        else
                        {
                                if (fc != bc)
                                {
                                        SPI_Write_Word(bc);
                                }
                        }
                }
        }
}


6、main函数内容:
  1. void main()
  2. {
  3.     int8 slen = 0;
  4.         uint8 pdata uart_cmd_buf[64] = {0};

  5.         DS18B20_Start();
  6.         UART1_Config();        // 9600 baud
  7.         Timer0Init();        //T0定时10ms
  8.     DS1302_Init();        //初始化RTC时钟
  9.         ADC_Init();

  10. #ifdef MCU_STC12
  11.         //P3.2 set as push-pull output mode, for LCD backlight
  12.         P3M1 &= ~(1<<2);
  13.         P3M0 |=  (1<<2);
  14. #endif

  15.         SPI_Init();
  16.         LCD_Init();
  17.         PWM_Init();
  18.         delay_ms(500);
  19.         LCD_Show_Format();

  20.     while(1)
  21.     {
  22.                
  23.                 Uart_Cmd_Check(&uart_cmd_buf, sizeof(uart_cmd_buf)-1);

  24.         if (timer_flag_250ms)  //每250ms读取依次时间
  25.         {
  26.                         ReadAndShowRtc();
  27.             timer_flag_250ms = 0;
  28.         }
  29.         if (timer_flag_5s)  //每隔5s执行以下分支
  30.         {
  31.                         //printf(">>>===\r\n");
  32.                         ReadAndShowTemperature(-5);
  33.                         
  34.                         ReadAndShowPhotoresistorVoltage();

  35.             timer_flag_5s = 0;
  36.                 }
  37.     }
  38. }
复制代码

STC12C5A60S2单片机手册下载地址(点替换成.):www点stcmcudata点com/datasheet/stc/STC-AD-PDF/STC12C5A60S2.pdf

1.44寸TFT(ST7735)显示屏资料(点替换成.):www点lcdwiki点com/zh/1.44inch_SPI_Module_ST7735S_SKU:MSP1443

完整代码见附件,文件列表如图所示:



以上代码使用最小系统和面包板调试,接线简单,具体端口可参看config.h

初学单片机,难免有错漏之处,还请各位坛友不吝赐教。

DS1302_UART_ST7735_STC12C5A60S2.7z (2.34 MB, 下载次数: 214)


评分

参与人数 3黑币 +80 收起 理由
1109 + 15 很给力!
pengxxx + 15 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:64253 发表于 2020-8-12 16:46 | 只看该作者
没想到还有沙发坐,先瞧瞧
回复

使用道具 举报

板凳
ID:585455 发表于 2020-10-5 11:40 | 只看该作者
很棒的分享,小弟正享用這屏幕顯示時間溫度。
回复

使用道具 举报

地板
ID:71456 发表于 2022-2-18 18:37 | 只看该作者
LCD数据口和单片机连  要加限流电阻吗?
回复

使用道具 举报

5#
ID:140489 发表于 2022-6-8 13:14 | 只看该作者
试了下,屏能显示,但时间不走
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表