单片机/MCU论坛
直播中

ZXC

6年用户 100经验值
擅长:EMC/EMI设计 嵌入式技术 制造/封装 接口/总线/驱动 处理器/DSP 控制/MCU EDA/IC设计
私信 关注
[文章]

STC系列:T5UIC1串口彩屏与STC15F2K60S2交互,实现常用功能(附例程)

``一、评估版使用说明
1. 功能
序号
功能
描述
1
MCU
STC15F2K60S2
2
一路模拟IO
AD转换,反应土壤湿度
3
I/O
5路I/O
4
LED
工作指示灯
5
按键
复位按键
6
电源
5V电源输入



4793E07A91023A5869C6151511C1F906.png


注:可实现的功能:
a.控制湿度,通过屏幕显示当前土壤湿度
b.对湿度的设定,通过屏幕显示
c.控制湿度达到设定值附近
2、需使用的工具
a.硬件:STC15F2K60S2最小系统,土壤湿度测量模块,LED灯表示小水泵的工作。
b. 软件: KEIL MDK5。
c.原理图:详见“硬件原理图”文件夹。
d.程序: 51程序在“51程序”文件夹。
二、评估板硬件和软件部分介绍
1. 硬件原理图:详见“硬件原理图”文件夹
(1)硬件接口定义
功能
对应51IO

TXD(屏端子显示)
P30

RXD(屏端子显示)
P31

独立按键
P10~P14

ADC采样
P10

控制信号
P20
<p>2、软件程序

界面设置在“DWIN_SET”文件夹中。STM32程序在“MCU_STM32F103C8T6程序”文件夹中。

(2)MCU程序
  1. #include        "config.h"
  2. #include        "USART1.h"
  3. #include        "delay.h"
  4. #include        "dwin.h"
  5. #include        "adc.h"
  6. //========================================================================
  7. // 函数: void        ADC_Inilize(ADC_InitTypeDef *ADCx)
  8. // 描述: ADC初始化程序.
  9. // 参数: ADCx: 结构参数,请参考adc.h里的定义.
  10. // 返回: none.
  11. // 版本: V1.0, 2012-10-22
  12. //========================================================================
  13. void        ADC_Inilize(ADC_InitTypeDef *ADCx)
  14. {
  15.         P1ASF = ADCx->ADC_Px;
  16.         ADC_CONTR = (ADC_CONTR & ~ADC_90T) | ADCx->ADC_Speed;
  17.         if(ADCx->ADC_Power == ENABLE)        ADC_CONTR |= 0x80;
  18.         else                                                        ADC_CONTR &= 0x7F;
  19.         if(ADCx->ADC_AdjResult == ADC_RES_H2L8)        PCON2 |=  (1<<5);        //10位AD结果的高2位放ADC_RES的低2位,低8位在ADC_RESL。
  20.         else                                                                        PCON2 &= ~(1<<5);        //10位AD结果的高8位放ADC_RES,低2位在ADC_RESL的低2位。
  21.         if(ADCx->ADC_Interrupt == ENABLE)        EADC = 1;                        //中断允许                ENABLE,DISABLE
  22.         else                                                                EADC = 0;
  23.         if(ADCx->ADC_Polity == PolityHigh)        PADC = 1;                //优先级设置        PolityHigh,PolityLow
  24.         else                                                                PADC = 0;
  25. }


  26. //========================================================================
  27. // 函数: void        ADC_PowerControl(u8 pwr)
  28. // 描述: ADC电源控制程序.
  29. // 参数: pwr: 电源控制,ENABLE或DISABLE.
  30. // 返回: none.
  31. // 版本: V1.0, 2012-10-22
  32. //========================================================================
  33. void        ADC_PowerControl(u8 pwr)
  34. {
  35.         if(pwr == ENABLE)        ADC_CONTR |= 0x80;
  36.         else                                ADC_CONTR &= 0x7f;
  37. }


  38. void        ADC_config(void)
  39. {
  40.         ADC_InitTypeDef                ADC_InitStructure;                                //结构定义
  41.         ADC_InitStructure.ADC_Px        = ADC_P10 | ADC_P11 | ADC_P12|ADC_P13;        //设置要做ADC的IO,        ADC_P10 ~ ADC_P17(或操作),ADC_P1_All
  42.         ADC_InitStructure.ADC_Speed     = ADC_360T;                        //ADC速度                        ADC_90T,ADC_180T,ADC_360T,ADC_540T
  43.         ADC_InitStructure.ADC_Power     = ENABLE;                        //ADC功率允许/关闭        ENABLE,DISABLE
  44.         ADC_InitStructure.ADC_AdjResult = ADC_RES_H8L2;                //ADC结果调整,        ADC_RES_H2L8,ADC_RES_H8L2
  45.         ADC_InitStructure.ADC_Polity    = PolityLow;                //优先级设置        PolityHigh,PolityLow
  46.         ADC_InitStructure.ADC_Interrupt = DISABLE;                        //中断允许                ENABLE,DISABLE
  47.         ADC_Inilize(&ADC_InitStructure);                                        //初始化
  48.         ADC_PowerControl(ENABLE);                                                        //单独的ADC电源操作函数, ENABLE或DISABLE
  49. }

  50. void        UART_config(void)
  51. {
  52.         COMx_InitDefine                COMx_InitStructure;                                        //结构定义
  53.         COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                //模式,       UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
  54.         COMx_InitStructure.UART_BRT_Use   = BRT_timer2;                        //使用波特率,   BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
  55.         COMx_InitStructure.UART_BaudRate  = 115200ul;                        //波特率, 一般 110 ~ 115200
  56.         COMx_InitStructure.UART_RxEnable  = ENABLE;                                //接收允许,   ENABLE或DISABLE
  57.         COMx_InitStructure.BaudRateDouble = DISABLE;                        //波特率加倍, ENABLE或DISABLE
  58.         COMx_InitStructure.UART_Interrupt = ENABLE;                                //中断允许,   ENABLE或DISABLE
  59.         COMx_InitStructure.UART_Polity    = PolityLow;                        //中断优先级, PolityLow,PolityHigh
  60.         COMx_InitStructure.UART_P_SW      = UART1_SW_P30_P31;        //切换端口,   UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
  61.         COMx_InitStructure.UART_RXD_TXD_Short = DISABLE;                //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
  62.         USART_Configuration(USART1, &COMx_InitStructure);                //初始化串口1 USART1,USART2

  63. //        PrintString1("STC15F2K60S2 UART1 Test Prgramme!
  64. ");        //SUART1发送一个字符串
  65. }
  66. //========================================================================
  67. // 函数: u16        Get_ADC10bitResult(u8 channel)
  68. // 描述: 查询法读一次ADC结果.
  69. // 参数: channel: 选择要转换的ADC.
  70. // 返回: 10位ADC结果.
  71. // 版本: V1.0, 2012-10-22
  72. //========================================================================
  73. u16        Get_ADC10bitResult(u8 channel)        //channel = 0~7
  74. {
  75.         u16        adc;
  76.         u8        i;

  77.         if(channel > ADC_CH7)        return        1024;        //错误,返回1024,调用的程序判断        
  78.         ADC_RES = 0;
  79.         ADC_RESL = 0;

  80.         ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
  81.         NOP(4);                        //对ADC_CONTR操作后要4T之后才能访问

  82.         for(i=0; i<250; i++)                //超时
  83.         {
  84.                 if(ADC_CONTR & ADC_FLAG)
  85.                 {
  86.                         ADC_CONTR &= ~ADC_FLAG;
  87.                         if(PCON2 &  (1<<5))                //10位AD结果的高2位放ADC_RES的低2位,低8位在ADC_RESL。
  88.                         {
  89.                                 adc = (u16)(ADC_RES & 3);
  90.                                 adc = (adc << 8) | ADC_RESL;
  91.                         }
  92.                         else                //10位AD结果的高8位放ADC_RES,低2位在ADC_RESL的低2位。
  93.                         {
  94.                                 adc = (u16)ADC_RES;
  95.                                 adc = (adc << 2) | (ADC_RESL & 3);
  96.                         }
  97.                         return        adc;
  98.                 }
  99.         }
  100.         return        1024;        //错误,返回1024,调用的程序判断
  101. }

  102. /**********************************************/
  103. void main(void)
  104. {
  105.         short adcx;
  106.         short set_veul=50;
  107.         u8 key_v;

  108.         UART_config();
  109.         EA = 1;
  110.         clr(0xf00f);
  111.         

  112.         ADC_config();
  113.         
  114.         LCD_printf(0x04,0xfFFF,0xf00f,200-72,50,"自动浇花系统");
  115.         LCD_printf(0x04,0xfFFF,0xf00f,0,100,"当前土壤湿度:");
  116.         LCD_printf(0x04,0xfFFF,0xf00f,55,150,"设定湿度:");
  117.         LCD_printf(0x04,0xfFFF,0xf00f,0,200,"系统工作状态:");
  118.         while (1)
  119.         {
  120.                   key_v=0;
  121.         //        key_v=key_check();
  122.                 if(set_veul<adcx/11)        {LCD_printf(0x44,0xffff,0xf00f,300,200,"达到湿度");
  123.                 P2=0XFF;
  124.                 }
  125.                 if(set_veul>adcx/11) { LCD_printf(0x44,0xffff,0xf00f,300,200,"加湿中  ");
  126.                 P2=0X00;
  127.                         }
  128.                 if(key_v==3)if(set_veul<100)set_veul++;
  129.                 if(key_v==4)if(set_veul>0)  set_veul--;
  130.                 LCD_printf(0x44,0xffff,0xf00f,300,150,"%02dRH",set_veul);
  131.                 adcx=Get_ADC10bitResult(0);
  132.                  LCD_printf(0x44,0xffff,0xf00f,300,100,"%02dRH",adcx/11);
  133.                
  134.         }
  135. }


  136. //========================================================================
  137. // 函数: void ADC_int(void) interrupt ADC_VECTOR
  138. // 描述: ADC中断函数.
  139. // 参数: none.
  140. // 返回: none.
  141. // 版本: V1.0, 2012-10-22
  142. //========================================================================
  143. void ADC_int (void) interrupt ADC_VECTOR
  144. {
  145.         ADC_CONTR &= ~ADC_FLAG;
  146. }

</p>2、软件程序
``
源码.zip (170.66 KB)
(下载次数: 77, 2018-12-27 16:14 上传)
0F3D5E8B5D7EA01106DE68951CEBA860.png EE97952476582742EC7FDA20282F9D27.png

回帖(7)

lee_st

2018-12-28 00:23:43
进来看看了的
举报

lee_st

2018-12-28 00:23:49
什么好东西的啊
举报

lee_st

2018-12-28 00:23:59
希望是有用的哦
举报

lee_st

2018-12-28 00:24:10
加油了,资料哦
举报

303639

2019-9-29 18:03:59
很好的资料 谢谢楼主分享
举报

303639

2019-9-29 18:04:33
屏幕的程序在哪里
举报

金海

2020-8-21 16:05:45
数字滚动起来会有屏闪吗
举报

更多回帖

发帖
×
20
完善资料,
赚取积分