哈理工大三下学期实习设计报告

哈 尔 滨 理 工 大 学

生 产 实 习 题 目:

姓 名:

班 级:

学 号:

指导教师:

成 绩:

20xx年7月16日

1

目录

目录 ........................................................................................... 2

一、 设计目的及设计步骤 ..................................................... 3

1.1目的 ............................................................................. 3

1.2步骤 ............................................................................... 3

二、原理和布线,原理图设计及PCB板 ................................ 3

2.1设计原理和布线 ...................................................... 3

2.2原理图设计 .................................................................. 4

2.3 PCB板图 ...................................................................... 4

三、程序设计 ........................................................................... 5

四、TM1621D驱动器 .............................................................. 11

4.1特性描述 .................................................................. 11

4.2管脚介绍 .................................................................... 11

4.3系统结构 .................................................................... 12

五、设计改进及创新 ............................................................. 15

六、可靠性设计 ..................................................................... 15

七、心得体会 ......................................................................... 16

八、附录 ................................................................................. 17

2

一、设计目的及设计步骤

1.1目的: 本次生产实习设计一个基于RS485总线控制的温控系统,通过热敏电阻、主控制器STC15W408AS与TM1621D等组成的显示系统,实现对室温的测量。

通过本次实习,让学生了解温度控制器的各板块电路原理图设计、仿真以及熟悉Altium Designer summer软件画出相应的PCB板图。

1.2步骤: 设计原理图及绘制PCB板;

编写程序,对其进行调试;

编写课程设计报告。

二、原理和布线,原理图设计及PCB板

2.1设计原理和布线: 通过热敏电阻感应外界温度来采集数据,采用TM1621D驱动器进行屏幕显示设计及编程,主控制器STC15W408AS对采集到的数据进行处理。在与TM1621D硬件连接时要将LCD的 SEG(段电极)和COM(公共电极)与HT1621D的SEG与COM 对应相连,HT1621D的SEG9-SEG22管脚及COM0-COM3管脚与LCD Plane连接,再就是HT1621D的/CS(片选)、/WR(写操作) 、 /DATA(数据) 管脚与单片机STC15W408AS的I/0口相连,VDD与VLCD管脚外接一个热敏电阻。通过烧录到电路板中的软件程序对I/O的控制进而控制HT1621D的读写操作,在LCD Plane屏幕上显示结果。

系统初始化-1621启动-点亮LCD全部位元-关闭HT1621

3

2.2原理图设计:

哈理工大三下学期实习设计报告

2.3 PCB板图:

哈理工大三下学期实习设计报告

4

三、程序设计

/******************************************************** 功能描述: Ht1621 芯片测试程序

版 本:1.0

说 明:本测试程序能够测试Ht1621 的每一个字段,依次点亮 每一个字段

********************************************************/ //20xx年更换为TM1620D

#include "include.h"

#include < intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define _Nop() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_() #define BIAS 0x52 //0b1000 0101 0010 1/3偏压 4个公共口

#define SYSDIS 0X00 //0b1000 0000 0000 关系统时钟和LCD偏压发生器 #define SYSEN 0X02 //0b1000 0000 0010 打开系统振荡器 #define LCDOFF 0X04 //0b1000 0000 0100 关LCD偏压发生器 #define LCDON 0X06 //0b1000 0000 0110 打开LCD偏压

#define RC256 0X30 //0b1000 0011 0000 接内部时钟

#define _0 a+b+c+d+e+f //若 a+b+c+d+e+f亮,则显示代表为0 #define _1 b+c

#define _2 a+b+d+e+g

#define _3 a+b+c+d+g

#define _4 b+c+f+g

#define _5 a+c+d+f+g

#define _6 a+c+d+e+f+g

#define _7 a+b+c

#define _8 a+b+c+d+e+f+g

#define _9 a+b+c+f+g+d

#define _- g

#define _a a+b+c+e+f+g

#define _b c+d+e+f+g

#define _c d+e+g

#define _d b+c+d+e+g

#define _e a+d+e+f+g

#define _f a+e+f+g

#define _g a+d+e+f //G代替大些C

#define _h c+e+f+g

#define _i c

#define _j b+c+d

5

#define _k 0

#define _l f+e

#define _m _n

#define _n c+e+g

#define _o c+d+e+g

#define _p a+b+e+f+g

#define _q a+b+c+f+g

#define _r e+g

#define _s a+f+g+c+d

#define _t d+e+f+g

#define _u c+d+e

#define _v c+d+e

#define _y b+c+d+f+g

#define _A a+b+c+e+f+g

#define _B _b

#define _C a+f+d+e

#define _D _d

#define _E _e

#define _F _f

#define _H b+c+e+f+g

#define _I b+c

#define _J _j

#define _K 0

#define _L d+e+f

#define _M _N

#define _N a+b+c+e+f

#define _R e+g+dp //=r.

#define _S a+f+g+c+d //=r.

#define _T a+f+e //=u

#define _U b+c+d+e+f //=r.

#define _P a+b+e+f+g

code char seg8_tab[]={_0,_1,_2,_3,_4,_5,_6,_7,_8,_9};

//delay us

void Delay(uchar us) //5,7,9

{

while( --us);

}

//delay ms

void DelayMS(uint iMs)

{

6

uint i,j;

for (i= 0 ;i< iMs;i++)

for (j= 0 ;j< 65;j++) Delay( 1 );

}

/******************************************************

写数据函数,cnt为传送数据位数, 数据传送为低位在前

*******************************************************/

void Ht1621Wr_Data(uchar Data,uchar cnt) //Data的高cnt位写入Ht1621,

低位在前

{

uchar i;

for (i = 0 ;i< cnt;i++)

{

HT1621_WR = 0 ; //在/WR上升沿Data数据写入Ht1621

_Nop(); //暂停一下

HT1621_DAT= Data& 0x80; //求与

_Nop();

HT1621_WR = 1 ;

_Nop();

Data <<= 1 ;

}

}

/********************************************************

函数名称:void Ht1621WrCmd(uchar Cmd)

功能描述: HT1621 命令写入函数

全局变量:无

参数说明:Cmd 为写入命令数据

返回说明:无

版 本:1.0

说 明:写入命令标识位100

********************************************************/

void Ht1621WrCmd(uchar Cmd)

{

HT1621_CS = 0 ; //当/Cs为高电平,写TM1621D的数据和命令无效,串行接 口电路复位;为低和输入时,有效

_Nop(); //空函数,停一下

Ht1621Wr_Data( 0x80, 4 ); //写入命令标志100

Ht1621Wr_Data(Cmd,8 ); //写入命令8位数据,其中前7位为Cmd命令,

最后一位任意

HT1621_CS = 1 ;

_Nop();

}

7

/********************************************************

函数名称:void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt) 功能描述: HT1621 连续写入方式函数

全局变量:无

参数说明:Addr为写入初始地址,*p为连续写入数据指针, cnt为写入数据总数

返回说明:无

版 本:1.0

说 明:HT1621 的数据位4 位,此处每次数据为8 位,写入数据 总数按8 位计算

********************************************************/ void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)

{

uchar i;

HT1621_CS = 0 ;

Ht1621Wr_Data( 0xa0, 3 ); //写入数据标志101

Ht1621Wr_Data(Addr<<2 , 6 ); //写入6位地址数据

for (i = 0 ;i< cnt;i++) //连续写入数据

{

Ht1621Wr_Data(*p, 8 ); //写入8位数据

p++;

}

HT1621_CS = 1 ;

_Nop();

}

/******************************************************** 函数名称:void Ht1621_Init(void)

功能描述: HT1621 初始化

全局变量:无

参数说明:无

返回说明:无

版 本:1.0

说 明:初始化后,液晶屏所有字段均显示

********************************************************/ void Ht1621_Init( void)

{

HT1621_CS = 1 ;

HT1621_WR = 1 ;

HT1621_DAT= 1 ;

DelayMS(10); //延时使LCD 工作电压稳定

Ht1621WrCmd(BIAS); //设置偏压和占空比

Ht1621WrCmd(RC256); //使用内部振荡器

Ht1621WrCmd(SYSDIS); //关闭系统振荡器

Ht1621WrCmd(SYSEN); //打开系统振荡器

8

Ht1621WrCmd(LCDON); //打开LCD偏压发生器

}

void display(void)

{

//显示set 地表温度高于后屏幕独立出来

uchar dis_buf[6]=0;

if (m.meas.mode == 0) //remote

{

dis_buf[0] = *(seg8_tab+m.meas.temp1%10) | dp;//C dis_buf[1] = *(seg8_tab+m.meas.temp1/10) ;

if ((m.meas.status & 0x02) == 0) //地表温度超限显示地表温度 {

dis_buf[2] = *(seg8_tab+m.meas.temp2%10) | dp;//C dis_buf[3] = *(seg8_tab+m.meas.temp2/10) ;//set temp dis_buf[4] = 0x20 ; //surface tmep

}

else {

dis_buf[2] = *(seg8_tab+m.meas.aset % 10) | dp; //C dis_buf[3] = *(seg8_tab+m.meas.aset / 10) | dp;//set temp

}

dis_buf[4] |= 0x10 | 0x01 | 0x08; //remote | current_temp|line

dis_buf[5] |= 0x40 | 0x20; //unlock turn_off

}

else if (m.meas.mode == 1) //locate 2||6,6的时候需要闪烁,手动测量

{

dis_buf[0] = *(seg8_tab+m.meas.temp1%10) | dp;//C dis_buf[1] = *(seg8_tab+m.meas.temp1/10) ;

dis_buf[2] = *(seg8_tab + m.meas.mset % 10) | dp; //C

dis_buf[3] = *(seg8_tab + m.meas.mset / 10) | dp;//set temp dis_buf[4] = 0x80 | 0x01 | 0x08; //hand | current_temp |line dis_buf[5] = 0x80 | 0x20; //lock turn_off

if (m.password==PASSWD)

{

m.flash++;

if (m.flash & 0x01) dis_buf[3] &= ~dp;

dis_buf[5] = 0x40 | 0x20; //unlock turn_off }

else if (m.password ==0) dis_buf[5] |= 0x40 | 0x20;

}

9

else if (m.meas.mode ==2) //addr

{

dis_buf[0] = *(seg8_tab+m.init.port%10) ;//port

dis_buf[1] = *(seg8_tab+m.init.port/10) ;

dis_buf[2] = *(seg8_tab+ m.init.addr % 10);

dis_buf[3] = *(seg8_tab+ m.init.addr / 10);

dis_buf[4] = 0x40| 0x08; //channel|line

//dis_buf[5] = 0x40 | 0x20; //unlock turn_off

//设定地址的时候闪烁

if (m.password==PASSWD+PASSWD)

{

m.flash++;

if (m.flash & 0x01)

{

if (m.addr_flag==0) {dis_buf[0] = 0; dis_buf[1]=0;} if (m.addr_flag==1) {dis_buf[2] = 0; dis_buf[3]=0;} }

}

}

else if(m.meas.mode ==3) //timer

{

dis_buf[0] = *(seg8_tab+m.timer.min%10) ;//port

dis_buf[1] = *(seg8_tab+m.timer.min/10) ;

dis_buf[2] = *(seg8_tab+ m.timer.hour % 10);

dis_buf[3] = *(seg8_tab+ m.timer.hour / 10) ;

}

else if (m.meas.mode ==4) //PASSWORD

{

dis_buf[0] = *(seg8_tab+ m.password %10) ;//password dis_buf[1] = *(seg8_tab+ m.password /10) ;

dis_buf[2] = _p ;

dis_buf[3] = _p ;

}

if ((m.meas.status & 0x03) == 0x03) dis_buf[4] |= 0x04; //heat if (m.recv_flag) {dis_buf[4] |= 0x02; m.recv_flag--;}//comm Ht1621WrAllData(9,dis_buf,6);

}

void disp_ready()

10

{

uchar dis_buf[6]=0;

dis_buf[0] = *(seg8_tab+m.meas.temp1%10) | dp;//C dis_buf[1] = *(seg8_tab+m.meas.temp1/10) ;

//settemp = 0;

dis_buf[2] = *(seg8_tab+0) | dp; //C

dis_buf[3] = *(seg8_tab+0) | dp;//set temp

dis_buf[4] = 0; //dis_buf[4] |= 0x10 | 0x01 | 0x08; dis_buf[5] |= 0x40 | 0x20; //unlock turn_off

Ht1621WrAllData(9,dis_buf,6);

}

void disp_off()

{

HT1621_CS = 1 ;

HT1621_WR = 1 ;

HT1621_DAT= 1 ;

Ht1621WrCmd(SYSDIS);

Ht1621WrCmd(LCDOFF);

}

四、TM1621D驱动器

4.1特性描述: TM1621D是56

哈理工大三下学期实习设计报告

内存映象和多功能的LCD驱动器。TM1621D的软件配置特性使它适用于多种LCD应用场合,包括LCD模块和显示子系统。主控制器和

TM1621D的通讯时序简单,

TM1621D还有一个节电命令用于降低系统功耗。

4.2管脚介绍:

如右图4-2

11

4.3系统结构:

4.3.1显示内存(RAM): 静态显示内存(RAM)以23x4位的格式储存所显示的数据,但是只有SEG9~SEG22所对 应的显示内存是有用的。RAM的数据直接映象到LCD驱动器。

4.3.2系统振荡器: TM1621D系统时钟用于产生LCD驱动时钟。片内RC振荡器(256KHz)产生时钟源。执行 SYS DIS命令可以停止系统时钟和LCD偏压发生器工作,SYS DIS命令只适用于片内RC振荡器, 当系统时钟停止工作时,LCD将显示空白。LCD OFF命令用于关闭LCD 偏压发生器,当LCD 偏 压发生器关闭后,可用SYS DIS命令降低系统功耗,这时SYS DIS 为节电命令。系统开始上电时, TM1621D处于SYS DIS状态。

4.3.3 LCD驱动器: TM1621D是一个56(14x4)点的LCD驱动器,它可由软件配置成1/2或1/3的LCD驱动器 偏压和2、3或4个公共端口,这一特性使TM1621D适用于多种LCD应用场合。LCD驱动时钟由 系统时钟分频产生,LCD驱动时钟的频率值保持为256Hz。LCD驱动器相关命令参见下表。

哈理工大三下学期实习设计报告

12

4.3.4命令格式: TM1621D可以用软件设置。两种模式的命令可以配置TM1621D和传送LCD所显示的数据。 TM1621D的配置模式称为命令模式,类型码为100。命令模式包括一个系统配置命令,一个系 统频率选择命令,一个LCD配置命令和一个操作命令。下表是数据和命令模式类型码表。

哈理工大三下学期实习设计报告

模式命令应在数据或命令传送前运行,如果执行连续的命令,命令模式代码即100,将被忽略。 当系统在不连续命令模式或不连续地址数据模式下,管脚/CS应设为“1”, 而且先前的操作 模式将复位。当管脚/CS返回“0” 时,新的操作模式类型码应先运行。

4.3.5接口: TM1621D只有三根管脚用于接口。管脚/CS用于初始化串行接口电路和结束主控制器与 TM1621D之间的通讯。管脚/CS设置为“1”时,主控制器和TM1621D之间的数据和命令无效 并初始化。在产生模式命令或模式转换之前,必须用一个高电平脉冲初始化TM1621D的串行接 口。管脚DATA是串行数据输入/输出管脚,读/写数据和写命令通过管脚DATA进行。管脚/WR 是写时钟输入管脚,在/WR信号上升沿时管脚DATA上的数据、地址和命令被写入TM1621D。

13

4.3.6时序图:

哈理工大三下学期实习设计报告

命令概述

哈理工大三下学期实习设计报告

D/C 数据/命令模式 所有的粗体数字即101和100 为模式命令码。100为命令模式类型码,如果运行连续的命令,除了第一个命 令,其它命令的模式类型码将被忽略。建议在上电复位后,用主控制器初始化TM1621D,因为如果上电复位失 败,TM1621D将不能正常工作。 14

五、设计改进及创新

增加一个保护程序,通过观察LED的亮灭来判断电路是否接反以及电流是否过大(比如LED变绿说明电路接法正确以及电流合适,LED不亮说明电路接反或者电流过大,从而保护电路板器件不被烧坏)。 设计中背光时间间隔为22s,为半透光,这里打算采用全透光来实现透光方式,采用全透光就不必确定背光时间,这里可以省去编程的烦恼。

增加语音提示程序,当温度超过所设定的温度时,给予提示或则当在所设定的时间段报出当时的温度值。

六、可靠性设计

1.为了使系统可靠的工作,在系统状态进行切换时需要进行适时的延时,再进行数据的收发,具体做法如下;在数据发送前,先将控制端置1,延时1ms左右,再发送有效数据,数据发送结束后,再延时1ms左右,将控制端置0,这样的处理可以使系统有一个稳定的工作环境。

2.为了抑制噪声干扰,总线两端的差分端口应跨接120n的匹配电阻。

3.设计中考虑到工作环境温度,设定其工作温度的上限与下限

4.上电时为避免上电干扰,可在其端口添加反相器进行控制。

15

七、心得体会

通过本次实习,我受益匪浅,学到了许多知识,比如:通过运用Altium Designer summer软件,再一次加深了对Altium Designer summer软件的运用;通过设计原理图进一步了解贴片式器件与插孔式器件的区别以及封装与没封装元器件的不同:通过画PCB板图又进一步熟悉了对Altium Designer summer软件的运用。当然通过设计,我也了解了温度控制器各个板块的原理以及所起到的作用,在调试程序时虽然出现了许多问题,通过老师以及同学的帮助以及上网查找资料终于解决了。经过这次设计让我们加深了对具体设计步骤的了解,开阔了我们的眼界,加深了我们的动手能力,对我们的未来有一定的影响。

16

八、附录

所需元器件列表

哈理工大三下学期实习设计报告

17

相关推荐