打印

调试助手,产品分析助手,4位数码管显示模块

[复制链接]
1281|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
工控秀才|  楼主 | 2018-11-14 18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试用数码管驱动模块
1.概述
调试用数码管驱动模块才用了简单的单线制
RS232单向传送协议,波特率固定为38400.
模块可接受指令和数据。用户端只要按固定的格式传送数据流(数据为连续两个字节的RAM参数内容,)就可以完成想要的显示。方便用于产品开发调试以及学生完成课程设计等。

端口定义:
VDD,  接测试板的电源正
GND,  接测试板的电源地
DOUT, 接测试板的信号输出,显示模块的数据输入端
工作电压范围:3.3~5.5V, 注意超过5.5V,可能导致模块永久损坏,无法恢复。
可单独控制某一位的亮灭;
可显示16进制数,最大值FFFF;
可显示10进制数,最大值9999。扩展显示,可显示65535,采用滚动模式显示;

2.常用指令介绍:
控制数据流按固定的5字节格式,前面2字节为命令字,中间两个字节为数据,最后一个字节为前4个字节的校验和。也就是说数据流才用了和校验的方式进行真伪判断。

A.控制指令:
控制指令,主要是通过指令告知显示模块,接收的目标数据及显示数据的类型。类型分10进制和16进制。该模块在使用之前,需要根据用户的使用情况对传输数据的进制模式和显示数据的进制模式做一次声明。模块默认的模式为16进制传输方式和10进制显示模式。用户可才用默认模式做显示,以减少对显示模块的初始化设置。

数据传输显示控制指令的数据格式为:0x55+0xaa+传送数据类型+显示数据类型+校验和;
数据类型解释:
01,表示字符格式,该格式保留此版本未被才用。

02,表示16进制数,16进制数不方便观察,但是两个字节可以传输更大的数据范围。4位数码管显示的数据范围也会更大,为0~ffff, 即十进制数范围为0~65535。
03,表示10进制数,10进制数据显示更为直观,但是4个数码管显示的数据范围则缩小很多,数据范围为0~9999。表示接收到的数据为10进制的数据,如果用十进制显示数据,该数据就不需要做十进制转换处理。

模块当前版本可接受三种传输及显示模式。
1.16进制传输16进制显示;
2.16进制传输10进制显示;
3.10进制传输10进制显示;
4.不支持10进制传输16进制显示的方式。


显示控制指令:0x55+0xcc+0x0y+0x0x+校验和。其中y是4位二进制数,分别控制对应位的数码管小数点是否需要点亮。x也是4位二进制数,分别用1表示点亮,0表示关闭显示。4个二进制位控制4个数码管。

B.数据传输指令:
数据格式:0x55+0xbb+数据1+数据2+校验和;

1.0x55+0xbb,头码标志;
2.数据1,高字节;
3.数据2,低字节;
4.数据流的校验和;

例如用户需要将0x1234,传输给显示模块,并以16进制显示。需要两串数据流控制。
1.先对显示模块初始化,根据要求,此条有时可省
   控制指令0x55+0xaa+0x02+0x02+04, 04为校验和的低8位。
2.再做数据传输
   传输指令0x55+0xbb+0x12+0x34+56, 56为校验和的低8位。

用户如果想显示12位AD转换的值,并用10进制显示,操作如下:
1. 先对显示模块初始化,根据要求,此条有时可省
   控制指令0x55+0xaa+0x02+0x03+04, 05为校验和的低8位。
2.再做数据传输,
   传输指令0x55+0xbb+数据高位+数据地位+校验和。

C.扩展显示指令:
A.乘积结果显示:
扩展显示指令为乘积显示指令,这种方式可以最直观的观察系统检测的物理参数。
比如我们AD采集的量化值,反映的具体物理量,多少毫伏电压mV,多少毫安电流mI等,
这时是需要用量化值乘以某个系数来体现。为了方便,本系统只提供最大0xffff的10进制显示范围,即00000~65535,扩展显示默认的数据都是16进制格式的。
   扩展指令的命令格式如下:
0x55+0xc0+数据h+数据l+校验和, 传送一个乘数因子A,一般来说,这个是一个12位以内的AD采集的量化值;

0x55+0xdx+数据h+数据l+校验和, 传送另一个常数因子B,x表示因子的小数点尾数,这个是将AD量化后,经过电路转换对应的具体物理量,显示模块必须得到一次常数设置后,才能正常显示乘积的结果。。
比如当我们的AD转换的参考电压为3.3V时,如果要求因子B对应的毫伏关系,就看AD是多少位精度的了,如果是8位,每个AD量化值对应的毫伏关系则为3300/255=19.4118;如果AD的精度是12,则每个AD量化值对应的毫伏关系是3300/4096=0.805664。

使用扩展显示方式时,一定要先传输乘数因子B,乘数因子B,每次使用时,传输一次即可。这样可以减少主控芯片的数据传输压力。并请留意扩展显示的数据范围为0000~65535

以3.3V的系统举例显示AD采集数据,怎么量化为毫伏值。所采用的AD精度为12位,则每一个AD采集值,对应0.805664毫伏。将0.805664转化为8位二进制数小数的结果为00CE。
所以第一步需要,将这个系数告知显示模块。
指令0x55+0xd8+0x00+0xce+0x32 ,数据流设定参数;
再送一组AD结果:
0x55+0xc0+0x07+0xff+0x1b, 这样就可以得到你想直观看到的测试结果了。   

B.除法商数显示:
利用该种显示方法,可以轻松得出,单片机利用内部参考电压做AD转换标准时,所得到的结果显示,利用十进制显示结果,效果非常直观。比如在应广带AD的单片机中,常有1.2V的内置参考电压,很多应用,利用这个参考电压,就可以反推VDD的电压值情况。为了尽量避免小数参与运算,以毫伏表示。 若AD为8位精度的话,此时VDD = 1200*255/AD转换结果=306000/ad结果=04AB50/ad结果;若12位AD精度 VDD = 1200*4095/ad结果=4914000/ad结果=4AFB50/ad结果。有了这种显示,单片机系统检测的数据对不对,就很容易通过万用表来校对了。
因为被除数的数值比较大,一般需要三个字节来表示。除法商数的显示指令为
0xdd+被除数高字节+被除数中间字节+被除数低字节+校验和;
0xdc+0x00+ad结果高4位+ad结果低8位+校验和
点击进入淘宝快速预定通道, 通道位置:淘宝首页分类栏---开发工---仿真器下面:

调试用参考程序,系统时钟4MHz,其他始终速率,请自行调整时序:

//指令周期延时子程序,
void    delay_5nop(void)
{
              goto $+1;
          nop;
              nop;

}
//a_delay,
//input a ,
//function a*4t
void  a_delay(void)
{
        nop;
        dzsn a
        goto $-2
}

void rs232_tx_pro(void)
{
        byte byte_cnt;
        g_word = fllow;
        byte_cnt = 0;
        while(byte_cnt<5)
        {
                a = *g_word;
                UART_Send();
                delay_5nop();               
                byte_cnt++;
                g_word = fllow;
                g_word += byte_cnt;
               
         }
       
}

//单个字节发送,输入入口A
//该程序是假定系统时钟为4M时的指令时序参考。
static        void        UART_Send (void)
{
        BYTE        cnt;
        BYTE        UART_Data_Out;
        disgint;

        UART_Data_Out        =        A;

        //        Start Bit
        set0        UART_Out;                                    //        1
        cnt        =        8;                                                //        2 ~ 3
        mov  a, 24;
        call a_delay;
bit_send:  
                        sr                UART_Data_Out;        //        1a
                        t1sn  CF                //  2a
                        goto send_0_bit          //  3b
                        set1  UART_Out          //  3a
                        nop;                    //  4a
                        nop
                        nop
bit_delay:                       
                        mov a, 24               //  5a
                        call a_delay             //  6a
      dzsn cnt                      //  7a
      goto  bit_send                //  8a
      set1  UART_Out               //  9a
      mov a, 25                     //
      call a_delay
      engint;
      return
//============
send_0_bit:
            set0  UART_Out            //5b
      goto  bit_delay               //7b
      


}               


欢迎关注微信公共号,一起交流应广单片机:

相关帖子

沙发
mohanwei| | 2018-11-14 21:52 | 只看该作者
其实串口能送数出来了,是不是直接打印到电脑上的超级终端更方便?连驱动都免了,C自带的标准库函数printf()什么数都能打印

使用特权

评论回复
板凳
ayb_ice| | 2018-11-15 08:43 | 只看该作者
mohanwei 发表于 2018-11-14 21:52
其实串口能送数出来了,是不是直接打印到电脑上的超级终端更方便?连驱动都免了,C自带的标准库函数printf( ...

正解

使用特权

评论回复
地板
工控秀才|  楼主 | 2018-11-15 14:12 | 只看该作者
mohanwei 发表于 2018-11-14 21:52
其实串口能送数出来了,是不是直接打印到电脑上的超级终端更方便?连驱动都免了,C自带的标准库函数printf( ...

串口能够打印的是原始数据而已,没有现成完成乘除法的,单片机自己要完成这样的计算处理,很多资源耗掉一大半了,不科学。而且有时也不是去去哪里测试都带个笔记本过去吧。比如你的产品最终都保留了测试数据输出,你还要工厂去买个电脑,再买一个USB转串口的线,告诉对方怎么使用调试终端吗。你让他直接用这个一接,就完了。那个方便不多说了。

使用特权

评论回复
5
mohanwei| | 2018-11-15 14:27 | 只看该作者
工控秀才 发表于 2018-11-15 14:12
串口能够打印的是原始数据而已,没有现成完成乘除法的,单片机自己要完成这样的计算处理,很多资源耗掉一 ...

难道这样用也不可以?
printf("P=,R=\n",V*I,V/I);

以前用51的时候,使用printf()需要占用大约1.1KB的Flash,但是用了一次后,后面再用,只是增加几个字节……远远没有你说的那么夸张

使用特权

评论回复
6
工控秀才|  楼主 | 2018-11-16 15:32 | 只看该作者
mohanwei 发表于 2018-11-15 14:27
难道这样用也不可以?
printf("P=,R=\n",V*I,V/I);

你可能还没有玩过程序空间只有1~2K的OTP,你一个函数用这么多资源,别的怎么玩。

使用特权

评论回复
7
mohanwei| | 2018-11-16 17:00 | 只看该作者
工控秀才 发表于 2018-11-16 15:32
你可能还没有玩过程序空间只有1~2K的OTP,你一个函数用这么多资源,别的怎么玩。 ...

0.5k的我都用过,不过都用到这种小容量单片机了,你确定也需要接你这种玩意?

使用特权

评论回复
8
一路向北lm| | 2018-11-17 18:32 | 只看该作者
直接硬件调试,或者仿真调试

使用特权

评论回复
9
yklstudent| | 2018-11-18 08:40 | 只看该作者
说实话肯定没什么市场,压根就不需要这东西,仿真器多好

使用特权

评论回复
10
工控秀才|  楼主 | 2018-11-20 10:28 | 只看该作者
yklstudent 发表于 2018-11-18 08:40
说实话肯定没什么市场,压根就不需要这东西,仿真器多好

仿真器和实体IC是有差别的,无论你怎么说,我自己已经感觉到他的方便性了。

使用特权

评论回复
11
工控秀才|  楼主 | 2018-11-20 10:31 | 只看该作者
一路向北lm 发表于 2018-11-17 18:32
直接硬件调试,或者仿真调试

我随便给你一批空片,让你看看内部1.2V参考电压准不准,准才用于烧录,不准就不用,你用仿真器怎么搞,有我这个东西就只需要烧录一个测试程序,一通电就能够看出来。你怎么测试,怎么样简单,还用说?

使用特权

评论回复
12
工控秀才|  楼主 | 2018-11-20 10:35 | 只看该作者
yklstudent 发表于 2018-11-18 08:40
说实话肯定没什么市场,压根就不需要这东西,仿真器多好

或者说,检查你硬件LAYOUT对AD检测有多大的偏差,有这个东西,也很方便测试,让设计者心里有底。

使用特权

评论回复
13
vrgood| | 2018-11-20 10:53 | 只看该作者
电工需要折腾的精神,给鼓励,顺便提些建议。
1.直接把串口收到的字节显示,应用程序只要把监测数据送SBUF,也增加不了几个代码。
2.10进制没必要,用这个的心算能力都很强的。
3.做为个产品肯定是小众的,中间加两个LED,闲时可以当时钟用。

使用特权

评论回复
14
工控秀才|  楼主 | 2018-11-20 14:24 | 只看该作者
vrgood 发表于 2018-11-20 10:53
电工需要折腾的精神,给鼓励,顺便提些建议。
1.直接把串口收到的字节显示,应用程序只要把监测数据送SBUF, ...

谢谢你的建议,当初真想了做个6位以上的,这颗IC脚位不够,就保留了4位,弄着玩的。赚钱是次要的,提高知名度吧,哈哈。

使用特权

评论回复
15
MCU18588960836| | 2020-5-8 15:18 | 只看该作者
想要压缩包哟

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

286

帖子

11

粉丝