搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 2018-12-5 11:15:36 | 显示全部楼层 |阅读模式
本帖最后由 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
LED  P20  
ADC1 数据模拟产生
ADC2数据模拟产生
TXD1(触摸屏端子显示) TXD
RXD1(触摸屏端子显示)RXD  


(2)硬件原理图


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

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

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

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

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

  32.         dwin_clear_screen(ASSEMBLE_RGB(31,33,33)); // 清屏
  33.         create_gui_A(); // 界面1
  34.         create_gui_B(); // 界面2
  35.         
  36.         // 显示温度 电压 电流 闸刀状态
  37.     show_temperature(temp_v, 1);  
  38.     show_voltage(vol_v, 2);  
  39.     show_currents(cur_v, 2);  
  40.     show_gate_switch(sw_v);
  41.         
  42.         while(1){
  43.                 while(count--); count = 60000;
  44.                 while(count--); count = 40000;
  45.                 while(count--); count = 60000;
  46.                
  47.                 // 模拟采集量 和 IO状态检测
  48.                 temp_v += 0.1f;
  49.                 vol_v += 0.01f;
  50.                 cur_v += 0.01f;
  51.                 if(sw_v) sw_v = 0;
  52.                 else sw_v = 1;
  53.                
  54.                
  55.                 show_temperature(temp_v, 1);  
  56.                 show_voltage(vol_v, 2);  
  57.                 show_currents(cur_v, 2);  
  58.                 show_gate_switch(sw_v);
  59.         
  60.         }
  61. }

  62. 2). dwin_clear_screen ():单色清屏函数
  63. void dwin_clear_screen(us16 color){
  64.     BEGIN_CMD();
  65.     TX_8(0x01);
  66.     TX_16(color);
  67.     END_CMD();
  68. }
  69. 3). create_gui_A ():界面1显示函数
  70. void create_gui_A(void){
  71.     us16 oo = 40000;
  72.     DWIN_TEXT_STR textStr;
  73.     us08 texts[14] = {0xCF,0xB5,0xCD,0xB3,0xB3,0xF5,0xCA,0xBC,0xBB,0xAF,0x2E,0x2E,0x2E,0x2E};
  74.    
  75.     // 显示二维码
  76.     us08 qr_data[22] = {
  77.         0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,
  78.         0x64,0x77,0x69,0x6E,0x2E,0x63,0x6F,0x6D,0x2E,0x63,0x6E
  79.     };
  80.     //dwin_show_qr(5,5,1,qr_data,22);
  81.     //dwin_show_qr(5,220,1,qr_data,22);
  82.     //dwin_show_qr(425,5,1,qr_data,22);
  83.     dwin_show_qr(425,220,1,qr_data,22);
  84.         while(oo--); oo = 60000;

  85.     textStr.mode = 0;
  86.     textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1632;
  87.     textStr.f_color = ASSEMBLE_RGB(0, 0, 255);
  88.     textStr.p_len = 14;
  89.         textStr.p_data = texts;
  90.     textStr.sx = 100; textStr.sy = 120;
  91.     dwin_disp_string(&textStr);

  92.    

  93.     texts[0] = 0x05;
  94.         while(1){
  95.         while(oo--); oo = 60000;
  96.         while(oo--); oo = 60000;
  97.                 while(oo--); oo = 60000;
  98.                 while(oo--); oo = 60000;

  99.         
  100.         textStr.sx = 315; textStr.sy = 125;
  101.         dwin_fill_rect(textStr.sx, textStr.sy, textStr.sx+60, textStr.sy+50, ASSEMBLE_RGB(31, 33, 33));
  102.    
  103.         textStr.mode = 0;
  104.         textStr.mode = FONT1224|DISABLE_NUM_BCOLOR|ENABLE_SIGNED_NUM|DISABLE_NUM_ZERO|DISABLE_NUM_ZERO_S;
  105.         textStr.f_color = ASSEMBLE_RGB(0, 0, 255);
  106.         textStr.p_len = 1;      
  107.         textStr.p_data = texts;
  108.         textStr.num_i = 2;
  109.         textStr.num_f = 0;
  110.         
  111.         dwin_disp_num(&textStr);

  112.         texts[0] -= 1;
  113.                 if(texts[0] == 0xFF){
  114.             dwin_fill_rect(textStr.sx, textStr.sy, textStr.sx+60, textStr.sy+50, ASSEMBLE_RGB(31, 33, 33));
  115.                         break;
  116.         }
  117.     }
  118.     dwin_clear_screen(ASSEMBLE_RGB(31,33,33));
  119. }
  120. 4). create_gui_B ():界面2显示函数
  121. void create_gui_B(void){
  122.     DWIN_TEXT_STR textStr;
  123.     us08 text0[7] = {0x41,0x50,0x50,0xB2,0xD9,0xD7,0xF7};
  124.     us08 text1[12] = {0x20,0xB5,0xE7,0xD1,0xB9,0xBC,0xEC,0xB2,0xE2,0xD2,0xC7,0x20};
  125.     us08 text2[10] = {0xB5,0xB1,0xC7,0xB0,0xCE,0xC2,0xB6,0xC8,0xA3,0xBA};
  126.     us08 text3[10] = {0xB5,0xB1,0xC7,0xB0,0xB5,0xE7,0xD1,0xB9,0xA3,0xBA};
  127.     us08 text4[10] = {0xB5,0xB1,0xC7,0xB0,0xB5,0xE7,0xC1,0xF7,0xA3,0xBA};
  128.     us08 text5[10] = {0xD5,0xA2,0xB5,0xB6,0xBF,0xAA,0xB9,0xD8,0xA3,0xBA};

  129.     // 显示二维码
  130.     us08 qr_data[22] = {
  131.         0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,
  132.         0x64,0x77,0x69,0x6E,0x2E,0x63,0x6F,0x6D,0x2E,0x63,0x6E
  133.     };
  134.     dwin_clear_screen(ASSEMBLE_RGB(31,33,33));
  135.     dwin_draw_line(0,18,479,18,ASSEMBLE_RGB(255,255,0));

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

  138.     // APP
  139.     textStr.mode = 0;
  140.     textStr.mode = DISABLE_TEXT_RESIZE|ENABLE_TEXT_BCOLOR|FONT1224;
  141.     textStr.f_color = ASSEMBLE_RGB(255, 255, 0);
  142.     textStr.b_color = ASSEMBLE_RGB(31,33,33);
  143.     textStr.p_len = 3;
  144.     textStr.p_data = text0;
  145.     textStr.sx = 375; textStr.sy = 48;
  146.     dwin_disp_string(&textStr);

  147.     // 电压检测仪
  148.     textStr.mode = 0;
  149.     textStr.mode = DISABLE_TEXT_RESIZE|ENABLE_TEXT_BCOLOR|FONT1632;
  150.     textStr.f_color = ASSEMBLE_RGB(0, 0, 255);
  151.     textStr.b_color = ASSEMBLE_RGB(31,33,33);
  152.     textStr.p_len = 12;
  153.     textStr.p_data = text1;
  154.     textStr.sx = 145; textStr.sy = 0;
  155.     dwin_disp_string(&textStr);

  156.     // 当前温度
  157.     textStr.mode = 0;
  158.     textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1428;
  159.     textStr.f_color = ASSEMBLE_RGB(255, 255, 0);
  160.     textStr.p_len = 10;
  161.     textStr.p_data = text2;
  162.     textStr.sx = 5; textStr.sy = 50;
  163.     dwin_disp_string(&textStr);

  164.     // 当前电压
  165.     textStr.mode = 0;
  166.     textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1428;
  167.     textStr.f_color = ASSEMBLE_RGB(255, 255, 0);
  168.     textStr.p_len = 10;
  169.     textStr.p_data = text3;
  170.     textStr.sx = 5; textStr.sy = 100;
  171.     dwin_disp_string(&textStr);

  172.     // 当前电流
  173.     textStr.mode = 0;
  174.     textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1428;
  175.     textStr.f_color = ASSEMBLE_RGB(255, 255, 0);
  176.     textStr.p_len = 10;
  177.     textStr.p_data = text4;
  178.     textStr.sx = 5; textStr.sy = 150;
  179.     dwin_disp_string(&textStr);

  180.     // 刀闸开关
  181.     textStr.mode = 0;
  182.     textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1428;
  183.     textStr.f_color = ASSEMBLE_RGB(251, 146, 0);
  184.     textStr.p_len = 10;
  185.     textStr.p_data = text5;
  186.     textStr.sx = 5; textStr.sy = 200;
  187.     dwin_disp_string(&textStr);
  188. }


  189. 5). dwin_disp_string ():显示字符的函数
  190. void dwin_disp_string(DWIN_TEXT_STR *pstr){
  191.     us08 i = 0;
  192.     BEGIN_CMD();
  193.     TX_8(0x11);
  194.     TX_8(pstr->mode);
  195.     TX_16(pstr->f_color);
  196.     TX_16(pstr->b_color);
  197.     TX_16(pstr->sx);
  198.     TX_16(pstr->sy);
  199.     //while(pstr->p_len--) TX_8(*(pstr->p_data++));
  200.     while(pstr->p_len--) TX_8(pstr->p_data[i++]);
  201.     END_CMD();   
  202. }

  203. 6). dwin_disp_num ():显示数字的函数
  204. void dwin_disp_num(DWIN_TEXT_STR *pstr){
  205.     us08 i = 0;
  206.     BEGIN_CMD();
  207.     TX_8(0x14);
  208.     TX_8(pstr->mode);
  209.     TX_16(pstr->f_color);
  210.     TX_16(pstr->b_color);
  211.     TX_8(pstr->num_i);
  212.     TX_8(pstr->num_f);
  213.     TX_16(pstr->sx);
  214.     TX_16(pstr->sy);
  215.     //while(pstr->p_len--) TX_8(*(pstr->p_data++));
  216.     while(pstr->p_len--) TX_8(pstr->p_data[i++]);
  217.     END_CMD();
  218. }



  219. 7). show_temperature ():显示温度数据,文本显示
  220. void show_temperature(float data, us08 num_f){
  221.     us32 value;
  222.     us08 text[4];
  223.     DWIN_TEXT_STR textStr;
  224.    
  225.     switch(num_f){
  226.         case 1:
  227.             value = data*10;
  228.         break;
  229.         
  230.         case 2:
  231.             value = data*100;
  232.         break;
  233.         
  234.         case 3:
  235.             value = data*1000;
  236.         break;

  237.         default: return;
  238.     }
  239.     text[0] = value>>24;
  240.     text[1] = value>>16;;
  241.     text[2] = value>>8;;
  242.     text[3] = value;

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

  245.     textStr.mode = 0;
  246.     textStr.mode = FONT1632|DISABLE_NUM_BCOLOR|ENABLE_SIGNED_NUM|DISABLE_NUM_ZERO|DISABLE_NUM_ZERO_S;
  247.     textStr.f_color = ASSEMBLE_RGB(0, 0, 255);
  248.     textStr.p_len = 4;      
  249.     textStr.p_data = text;
  250.     textStr.num_i = 8;
  251.     textStr.num_f = num_f;
  252.    
  253.     dwin_disp_num(&textStr);
  254. }
  255. 8). show_gate_switch ():显示闸刀状态量,2D画图形式
  256. void show_gate_switch(us08 sw)
  257. {
  258.     us08 text1[2] = {0xBF, 0xAA};
  259.     us08 text0[2] = {0xB9, 0xD8};
  260.     DWIN_TEXT_STR textStr;
  261.    
  262.     dwin_fill_rect(150, 199, 250, 231, ASSEMBLE_RGB(251, 146, 0));
  263.     dwin_fill_rect(151, 200, 249, 230, ASSEMBLE_RGB(31, 33, 33));
  264.     if(sw == 1){
  265.         dwin_fill_rect(199, 201, 248, 229, ASSEMBLE_RGB(0, 255, 0));
  266.         
  267.         textStr.mode = 0;
  268.         textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1224;
  269.         textStr.f_color = ASSEMBLE_RGB(0, 0, 0);
  270.         textStr.p_len = 2;
  271.         textStr.p_data = text1;
  272.         textStr.sx = 215; textStr.sy = 203;
  273.         dwin_disp_string(&textStr);
  274.     }
  275.     else{
  276.         dwin_fill_rect(152, 201, 200, 229, ASSEMBLE_RGB(255, 0, 0));

  277.         textStr.mode = 0;
  278.         textStr.mode = DISABLE_TEXT_RESIZE|DISABLE_TEXT_BCOLOR|FONT1224;
  279.         textStr.f_color = ASSEMBLE_RGB(0, 0, 0);
  280.         textStr.p_len = 2;
  281.         textStr.p_data = text0;

  282.     }
  283.    
  284. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入84汤圆

发表于 2018-12-5 15:54:34 | 显示全部楼层
有STC89s52这个型号吗?

出0入0汤圆

发表于 2018-12-5 16:47:42 | 显示全部楼层
czzhouyun 发表于 2018-12-5 15:54
有STC89s52这个型号吗?

  那就 stc和atmel串烧,,,,

出0入17汤圆

发表于 2018-12-5 23:44:54 来自手机 | 显示全部楼层
看名字就是老古董,我还有几片12T

出0入0汤圆

 楼主| 发表于 2018-12-14 18:18:23 | 显示全部楼层
wicy001 发表于 2018-12-5 23:44
看名字就是老古董,我还有几片12T

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 17:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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