Aaron~ 发表于 2018-12-5 11:15:36

STC-89S52与串口屏通信(附应用样例)

本帖最后由 Aaron~ 于 2018-12-5 13:40 编辑

开发板使用说明
1. 功能

序号功能     描述
1MCUSTC89S52
2I/O1路I/O
IO检测:检测闸刀的导通还是断开
3ADC 3路AD
CH1:电压采集(模拟数据采集)
CH2:电流采集(模拟数据采集)
Temp:温度采集(模拟数据采集)
4LED   工作指示灯
5按键   复位按键
6电源 USB 5V电源输入




注:实现的功能:
a.上电后发送指令屏的握手指令给T5UIC1屏,T5UIC1屏收到指令后回返回应答信息,当MCU没有收到应答信息时,T5UIC1屏显示开机界面同时MCU的LED灯为常亮。
b. 当MCU收到T5UIC1屏的握手回应后,MCU通过页面转换指令进入“初始化系统”页面,显示倒计时5秒钟。
c. 当倒计时页面到达5秒后便进入主界面,此时MCU LED工作指示灯以200ms间隔闪烁以示工作正常状态,主界面显示当前MCU采集ADC通道的数据值,同时显示闸刀开关的状态。
d. MCU每3秒采用一次AD数据并更新到T5UIC1屏上。

2. 需使用的工具
a.硬件:EDN USB学习板(MCU为STC89S52,串口TTL电平)。
b.软件:Keil C51 V9.00;stc-isp-15xx-v6.82.exe(烧录软件)。
c.原理图:详见“硬件原理图”文件夹。
d.程序:T5UIC1屏工程配置文件在“T5UIC1屏 配置文件与图片”文件夹中,通过SD卡下载DWIN_SET导入屏中即可。 STC89S52程序在“STC89C52RC 源码”文件夹。


评估板硬件和软件部分详细介绍
1. 硬件原理图:详见“硬件原理图”文件夹
(1)硬件接口定义

功能 对应STC89S52的IO
LEDP20
ADC1 数据模拟产生
ADC2数据模拟产生
TXD1(触摸屏端子显示) TXD
RXD1(触摸屏端子显示)RXD


(2)硬件原理图


2.软件程序
界面工程配置文件在“T5UIC1屏 配置文件与图片”文件夹中。
STC89S52程序在“STC89C52RC 源码”文件夹中。

(1)界面工程
0 开机界面:0X1000

(2)MCU程序
0)数据结构体与宏定义
// 指令数据发送宏操作
#define SEND_DATA(P)    UartPutChar(P)
#define TX_8(P1)      SEND_DATA((P1)&0xFF) // send one byte
#define TX_16(P1)       TX_8((P1)>>8);TX_8(P1) // send two byte
#define TX_32(P1)       TX_16((P1)>>16);TX_16((P1)&0xFFFF) // send four byte
#define BEGIN_CMD()   TX_8(FRAME_HRAD)
#define END_CMD()       TX_32(FRAME_TAIL)

// 文本属性结构体
typedef struct{
    us08 mode;                              //      显示模式
    us16 sx, sy;                        //      字符串显示的左上角坐标                        
    us16 f_color, b_color;      //字符显示颜色 && 字符背景显示颜色
    us08 num_i;                              //         显示的整数位数,0x01-0x14
    us08 num_f;                              //显示的小数位数,0x00-0x14,Num_I+Num_F 之和不能超过20
    us08p_len;            //待发送的数据字节数
    us08 *p_data;         //指向数据缓存区的指针
}DWIN_TEXT_STR;

1)main():硬件初始化,ADC数据采集,IO状态采集,接收触摸屏数据处理
void main(void){
      us08 i = 0;
      us16 count = 60000;
      
      float temp_v = 28.8f; // 当前温度值
    float vol_v = 0.98f; // 当前采集的电压值
    float cur_v = 0.58f; // 当前采集的电流值   
    us08 sw_v = 1;       // 闸刀状态值
      
      InitUART();
      
      dwin_shake();// 握手指令发送

      dwin_clear_screen(ASSEMBLE_RGB(31,33,33)); // 清屏
      create_gui_A(); // 界面1
      create_gui_B(); // 界面2
      
      // 显示温度 电压 电流 闸刀状态
    show_temperature(temp_v, 1);
    show_voltage(vol_v, 2);
    show_currents(cur_v, 2);
    show_gate_switch(sw_v);
      
      while(1){
                while(count--); count = 60000;
                while(count--); count = 40000;
                while(count--); count = 60000;
               
                // 模拟采集量 和 IO状态检测
                temp_v += 0.1f;
                vol_v += 0.01f;
                cur_v += 0.01f;
                if(sw_v) sw_v = 0;
                else sw_v = 1;
               
               
                show_temperature(temp_v, 1);
                show_voltage(vol_v, 2);
                show_currents(cur_v, 2);
                show_gate_switch(sw_v);
      
      }
}

2). dwin_clear_screen ():单色清屏函数
void dwin_clear_screen(us16 color){
    BEGIN_CMD();
    TX_8(0x01);
    TX_16(color);
    END_CMD();
}
3). create_gui_A ():界面1显示函数
void create_gui_A(void){
    us16 oo = 40000;
    DWIN_TEXT_STR textStr;
    us08 texts = {0xCF,0xB5,0xCD,0xB3,0xB3,0xF5,0xCA,0xBC,0xBB,0xAF,0x2E,0x2E,0x2E,0x2E};
   
    // 显示二维码
    us08 qr_data = {
      0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,
      0x64,0x77,0x69,0x6E,0x2E,0x63,0x6F,0x6D,0x2E,0x63,0x6E
    };
    //dwin_show_qr(5,5,1,qr_data,22);
    //dwin_show_qr(5,220,1,qr_data,22);
    //dwin_show_qr(425,5,1,qr_data,22);
    dwin_show_qr(425,220,1,qr_data,22);
      while(oo--); oo = 60000;

    textStr.mode = 0;
    textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1632;
    textStr.f_color = ASSEMBLE_RGB(0, 0, 255);
    textStr.p_len = 14;
      textStr.p_data = texts;
    textStr.sx = 100; textStr.sy = 120;
    dwin_disp_string(&textStr);

   

    texts = 0x05;
      while(1){
      while(oo--); oo = 60000;
      while(oo--); oo = 60000;
                while(oo--); oo = 60000;
                while(oo--); oo = 60000;

      
      textStr.sx = 315; textStr.sy = 125;
      dwin_fill_rect(textStr.sx, textStr.sy, textStr.sx+60, textStr.sy+50, ASSEMBLE_RGB(31, 33, 33));
   
      textStr.mode = 0;
      textStr.mode = FONT1224|DISABLE_NUM_BCOLOR|ENABLE_SIGNED_NUM|DISABLE_NUM_ZERO|DISABLE_NUM_ZERO_S;
      textStr.f_color = ASSEMBLE_RGB(0, 0, 255);
      textStr.p_len = 1;      
      textStr.p_data = texts;
      textStr.num_i = 2;
      textStr.num_f = 0;
      
      dwin_disp_num(&textStr);

      texts -= 1;
                if(texts == 0xFF){
            dwin_fill_rect(textStr.sx, textStr.sy, textStr.sx+60, textStr.sy+50, ASSEMBLE_RGB(31, 33, 33));
                        break;
      }
    }
    dwin_clear_screen(ASSEMBLE_RGB(31,33,33));
}
4). create_gui_B ():界面2显示函数
void create_gui_B(void){
    DWIN_TEXT_STR textStr;
    us08 text0 = {0x41,0x50,0x50,0xB2,0xD9,0xD7,0xF7};
    us08 text1 = {0x20,0xB5,0xE7,0xD1,0xB9,0xBC,0xEC,0xB2,0xE2,0xD2,0xC7,0x20};
    us08 text2 = {0xB5,0xB1,0xC7,0xB0,0xCE,0xC2,0xB6,0xC8,0xA3,0xBA};
    us08 text3 = {0xB5,0xB1,0xC7,0xB0,0xB5,0xE7,0xD1,0xB9,0xA3,0xBA};
    us08 text4 = {0xB5,0xB1,0xC7,0xB0,0xB5,0xE7,0xC1,0xF7,0xA3,0xBA};
    us08 text5 = {0xD5,0xA2,0xB5,0xB6,0xBF,0xAA,0xB9,0xD8,0xA3,0xBA};

    // 显示二维码
    us08 qr_data = {
      0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,
      0x64,0x77,0x69,0x6E,0x2E,0x63,0x6F,0x6D,0x2E,0x63,0x6E
    };
    dwin_clear_screen(ASSEMBLE_RGB(31,33,33));
    dwin_draw_line(0,18,479,18,ASSEMBLE_RGB(255,255,0));

    dwin_draw_rect(337, 40, 449, 185, ASSEMBLE_RGB(255,255,0));
    dwin_show_qr(347,80,2,qr_data,22);

    // APP
    textStr.mode = 0;
    textStr.mode = DISABLE_TEXT_RESIZE|ENABLE_TEXT_BCOLOR|FONT1224;
    textStr.f_color = ASSEMBLE_RGB(255, 255, 0);
    textStr.b_color = ASSEMBLE_RGB(31,33,33);
    textStr.p_len = 3;
    textStr.p_data = text0;
    textStr.sx = 375; textStr.sy = 48;
    dwin_disp_string(&textStr);

    // 电压检测仪
    textStr.mode = 0;
    textStr.mode = DISABLE_TEXT_RESIZE|ENABLE_TEXT_BCOLOR|FONT1632;
    textStr.f_color = ASSEMBLE_RGB(0, 0, 255);
    textStr.b_color = ASSEMBLE_RGB(31,33,33);
    textStr.p_len = 12;
    textStr.p_data = text1;
    textStr.sx = 145; textStr.sy = 0;
    dwin_disp_string(&textStr);

    // 当前温度
    textStr.mode = 0;
    textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1428;
    textStr.f_color = ASSEMBLE_RGB(255, 255, 0);
    textStr.p_len = 10;
    textStr.p_data = text2;
    textStr.sx = 5; textStr.sy = 50;
    dwin_disp_string(&textStr);

    // 当前电压
    textStr.mode = 0;
    textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1428;
    textStr.f_color = ASSEMBLE_RGB(255, 255, 0);
    textStr.p_len = 10;
    textStr.p_data = text3;
    textStr.sx = 5; textStr.sy = 100;
    dwin_disp_string(&textStr);

    // 当前电流
    textStr.mode = 0;
    textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1428;
    textStr.f_color = ASSEMBLE_RGB(255, 255, 0);
    textStr.p_len = 10;
    textStr.p_data = text4;
    textStr.sx = 5; textStr.sy = 150;
    dwin_disp_string(&textStr);

    // 刀闸开关
    textStr.mode = 0;
    textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1428;
    textStr.f_color = ASSEMBLE_RGB(251, 146, 0);
    textStr.p_len = 10;
    textStr.p_data = text5;
    textStr.sx = 5; textStr.sy = 200;
    dwin_disp_string(&textStr);
}


5). dwin_disp_string ():显示字符的函数
void dwin_disp_string(DWIN_TEXT_STR *pstr){
    us08 i = 0;
    BEGIN_CMD();
    TX_8(0x11);
    TX_8(pstr->mode);
    TX_16(pstr->f_color);
    TX_16(pstr->b_color);
    TX_16(pstr->sx);
    TX_16(pstr->sy);
    //while(pstr->p_len--) TX_8(*(pstr->p_data++));
    while(pstr->p_len--) TX_8(pstr->p_data);
    END_CMD();   
}

6). dwin_disp_num ():显示数字的函数
void dwin_disp_num(DWIN_TEXT_STR *pstr){
    us08 i = 0;
    BEGIN_CMD();
    TX_8(0x14);
    TX_8(pstr->mode);
    TX_16(pstr->f_color);
    TX_16(pstr->b_color);
    TX_8(pstr->num_i);
    TX_8(pstr->num_f);
    TX_16(pstr->sx);
    TX_16(pstr->sy);
    //while(pstr->p_len--) TX_8(*(pstr->p_data++));
    while(pstr->p_len--) TX_8(pstr->p_data);
    END_CMD();
}



7). show_temperature ():显示温度数据,文本显示
void show_temperature(float data, us08 num_f){
    us32 value;
    us08 text;
    DWIN_TEXT_STR textStr;
   
    switch(num_f){
      case 1:
            value = data*10;
      break;
      
      case 2:
            value = data*100;
      break;
      
      case 3:
            value = data*1000;
      break;

      default: return;
    }
    text = value>>24;
    text = value>>16;;
    text = value>>8;;
    text = value;

    textStr.sx = 130; textStr.sy = 50;
    dwin_fill_rect(textStr.sx, textStr.sy, textStr.sx+80, textStr.sy+50, ASSEMBLE_RGB(31, 33, 33));

    textStr.mode = 0;
    textStr.mode = FONT1632|DISABLE_NUM_BCOLOR|ENABLE_SIGNED_NUM|DISABLE_NUM_ZERO|DISABLE_NUM_ZERO_S;
    textStr.f_color = ASSEMBLE_RGB(0, 0, 255);
    textStr.p_len = 4;      
    textStr.p_data = text;
    textStr.num_i = 8;
    textStr.num_f = num_f;
   
    dwin_disp_num(&textStr);
}
8). show_gate_switch ():显示闸刀状态量,2D画图形式
void show_gate_switch(us08 sw)
{
    us08 text1 = {0xBF, 0xAA};
    us08 text0 = {0xB9, 0xD8};
    DWIN_TEXT_STR textStr;
   
    dwin_fill_rect(150, 199, 250, 231, ASSEMBLE_RGB(251, 146, 0));
    dwin_fill_rect(151, 200, 249, 230, ASSEMBLE_RGB(31, 33, 33));
    if(sw == 1){
      dwin_fill_rect(199, 201, 248, 229, ASSEMBLE_RGB(0, 255, 0));
      
      textStr.mode = 0;
      textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1224;
      textStr.f_color = ASSEMBLE_RGB(0, 0, 0);
      textStr.p_len = 2;
      textStr.p_data = text1;
      textStr.sx = 215; textStr.sy = 203;
      dwin_disp_string(&textStr);
    }
    else{
      dwin_fill_rect(152, 201, 200, 229, ASSEMBLE_RGB(255, 0, 0));

      textStr.mode = 0;
      textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1224;
      textStr.f_color = ASSEMBLE_RGB(0, 0, 0);
      textStr.p_len = 2;
      textStr.p_data = text0;

    }
   
}



czzhouyun 发表于 2018-12-5 15:54:34

有STC89s52这个型号吗?{:shocked:}

wkman 发表于 2018-12-5 16:47:42

czzhouyun 发表于 2018-12-5 15:54
有STC89s52这个型号吗?

{:titter:}那就 stc和atmel串烧,,,,

wicy001 发表于 2018-12-5 23:44:54

看名字就是老古董,我还有几片12T

Aaron~ 发表于 2018-12-14 18:18:23

wicy001 发表于 2018-12-5 23:44
看名字就是老古董,我还有几片12T

{:sweat:}
页: [1]
查看完整版本: STC-89S52与串口屏通信(附应用样例)