迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1784|回复: 5

请问我这个51C程序为何通信不了DGUS屏。

[复制链接]

1

主题

2

回帖

36

积分

新手上路

Rank: 1

积分
36
发表于 2019-7-19 16:06:15 | 显示全部楼层 |阅读模式
新手刚接触K600+,想当显示屏用。单片机做上位机,求大佬们解释一下,有没有这种51简单的例程。    急求  759111922@qq.com   谢谢!
#include <c8051f020.h>

void SendStr(unsigned char *s);


void PORT_Init()
{
        XBR0 = 0x04;
        XBR2 = 0x40;
        P1MDOUT  =0xff;
}

void SYSCLK_Init()
{   
        unsigned int i;
        OSCXCN=0X67;         //0X67=0110,0111
        for(i=0;i<256;i++);         //等待>1ms
        while(!(OSCXCN&0X80));      //等待XTLVLD变为1
        OSCICN=0X88;         //时钟失效监测器,选择外部时钟源作为系统时钟
}


void InitUART  (void)
{

    SCON0  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD = 0x21;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFF;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
        TL1   = 0XFF;          
    TR1   = 1;                  // TR1:  timer 1 打开   
         
        PCON=0x80;                                //波特率设置为9600
    EA    = 1;                  //打开总中断
    ES0   = 1;                  //打开串口中断
}                           
void main (void)
{
        WDTCN=0XDE;
        WDTCN=0XAD;
        SYSCLK_Init();
        PORT_Init();
        InitUART();
                         //打开串口中断
while (1)                       
    {
                ES0=0;
       SendStr("0X5A 0XA5 0X03 0X80 0X02 0X20");
                ES0    = 1;
                while(!TI0);
             TI0 = 0;
                 
    }
}

/*------------------------------------------------
                    发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF0 = dat;
while(!TI0);
     TI0 = 0;
}
/*------------------------------------------------
                    发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
  {
  SendByte(*s);
  s++;
  }
}
/*------------------------------------------------
                     串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
    unsigned char Temp;          //定义临时变量

   if(RI0)                        //判断是接收中断产生
     {
          RI0=0;                      //标志位清零
          Temp=SBUF0;                 //读入缓冲区的值
      SBUF0=Temp;                 //把接收到的值再发回电脑端
         }
   if(TI0)                        //如果是发送标志位,清零
     TI0=0;
}

回复

使用道具 举报

82

主题

150

回帖

2623

积分

超级版主

Rank: 8Rank: 8

积分
2623
发表于 2019-7-19 16:56:15 | 显示全部楼层
本帖最后由 神秘の宅叔 于 2019-7-19 17:40 编辑

1、串口屏自身有一个初始化工作的时间取决于用户的电源容量和上电速率,所以程序建议要适当延时后以上再跑主程序。
2、建议单片机先和电脑的串口工具测试一下,串口监测看下单片机是否有正确发出来蜂鸣器鸣叫的指令,再去和DGUS1屏连接,DGUS1的config.txt配置一下,R1=03配置和您发的程序9600一样的波特率,
     最好屏和电脑也连接一下验证一下通讯;     也就是将电脑的串口作为一个中介,确保两边的通讯都没有问题,再进行连接。
3、初始化串口的那段程序再检查下,花括号里面的不妨修改如下试试看呢
SCON = 0x50;        
TMOD = 0x20;           
TH1 = 0xFD;              
TL1 = 0x0;
TR1 = 1;                                 
EA  = 1;               
ES  = 1;               
回复

使用道具 举报

1

主题

2

回帖

36

积分

新手上路

Rank: 1

积分
36
 楼主| 发表于 2019-7-20 09:27:05 | 显示全部楼层
神秘の宅叔 发表于 2019-7-19 16:56
1、串口屏自身有一个初始化工作的时间(取决于用户的电源容量和上电速率),所以程序建议要适当延时后以上 ...

你好老师,我调的是115200的波特率,单片机在PC上串口通信都可以显示“0X5A 0XA5 0X03 0X80 0X02 0X20”,
屏接PC串口发指令蜂鸣器也能叫,俩对接就不行了,屏的波特率不是默认115200吗。  congig.txt 还需要配置吗。
回复

使用道具 举报

82

主题

150

回帖

2623

积分

超级版主

Rank: 8Rank: 8

积分
2623
发表于 2019-7-21 23:06:48 | 显示全部楼层
本帖最后由 神秘の宅叔 于 2019-7-23 09:29 编辑
shiwoa 发表于 2019-7-20 09:27
你好老师,我调的是115200的波特率,单片机在PC上串口通信都可以显示“0X5A 0XA5 0X03 0X80 0X02 0X20” ...

我上面看注释是写的9600波特率,我回复的是9600的。是什么型号的串口屏呢?
1、屏的收发和单片机的发收交叉接线,信号地也不要忘记了。串口通信电平是否一致,有的屏后面有ON=ttl  OFF=RS232的焊点短接。
2、迪文屏的ttl通信电平是3.3v的 是否是5v单片机 电平不匹配的原因?
回复

使用道具 举报

1

主题

2

回帖

36

积分

新手上路

Rank: 1

积分
36
 楼主| 发表于 2019-7-28 09:44:57 | 显示全部楼层
神秘の宅叔 发表于 2019-7-21 23:06
我上面看注释是写的9600波特率,我回复的是9600的。是什么型号的串口屏呢?
1、屏的收发和单片机的发收交 ...

K600+   DMT80480T050_02WT
现在能实现通信了,就是一些指令不太懂,比如 如何用指令指定位置写文字呢,一直没有弄懂。
回复

使用道具 举报

2

主题

679

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

积分
12173
发表于 2022-1-20 10:14:55 | 显示全部楼层
shiwoa 发表于 2019-7-28 09:44
K600+   DMT80480T050_02WT
现在能实现通信了,就是一些指令不太懂,比如 如何用指令指定位置写文字呢, ...

您好,组态模式下直接向文本控件地址写字符的16进制就行,指令集模式下请参考HMI开发指南0x98指令
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-23 10:41 , Processed in 0.058220 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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