图4-2-4
3.热释电:
为了更优化的管理终端电源,我们使用了热释电对外界信息进行采集,其核心为BIS0001和热释电传感器组成,原理图祥见(图4-2-5)
图2-4-5
3. 无线收发:
根据本设计速度的要求,我们选用了315M的无线传输模块BT1000,巧妙的使用串行通信协议,以减小软件实现难度,其传输速度可达6000BPS、射频输出功率为10MW、接受灵敏度-106DBM、误码率<0.001、传输距离最大300M。
原理图见(图4-2-6)
图4-2-6
2 上位机连接模块(以下称连接模块):
由于本设计的无线模块借用了串行通信协议,而连接模块控制核心使用的MICROCHIP公司的PIC16F877单片机只有一组UART,因此我们使用了模拟串行通信的方案,使用PIC16F877的B2和B3作模拟串口的RX和TX(输入和输出)PL-2303为核心的UART转USB,与PC机通信,以便于数据传输和为连接模块供电,原理图见(图4-2-7)
图4-2-7
3 上位机:
上位机人机界面采用LabVIEW实现,(实现方法请参阅上位机软件实现)
4 电源: 1
终端电源:终端电源使用电池供电,经7805和CX1117电压变换滤波得到5.0V
和3.3V两组电压,分别为外围模块和
7805 MSP430F1611供电,具体电路与各元件连接方式如图(图4-2-8)
图4-2-8
2
连接模块电源:根据连接模块功耗要求小于500MA的要求,我们选择使
用USB电源供电。
5. 系统软件设计
本系统的MCU使用了TI 公司的超低功耗单片机MSP430F1611,在软件设计中,充分利用了该MCU的低功耗特点。主程序中仅完成了系统的初始化和开始的显示部分,然后就进入最低功耗模式(LPM4)。其他功能模块都在中断服务子程序中完成。当产生中断时,MCU被唤醒并执行相应的中断服务子程序,从中断子程序返回后,系统又进入到LPM4模式,整个程序的设计使系统在绝大多数时间都处于最低功耗状态。
整个程序用全部用C 语言编写,使用模块化的设计方法,把各个模块相关的程序放在一个文件中,便于分块调试和管理,缩短了调试周期,增加了程序的可移植性和可剪裁性。
整个程序结构如下:
Menu.c Menu.c为主函数,它包含了header.h、
uart.c、lcd.c、list.c、key.c这些功能模块文件。在
Header.h Uart.c Lcd.c List.c Key.c menu.c文件中主要完成MCU和各模块的初始化,并打开中断并进入低功耗模式:
WDTCTL = WDTPW + WDTHOLD; _DINT(); //关中断 Init_CLK(); //时钟初始化 Init_lcd(); //LCD初始化 Init_interrupt(); //中断初始化
程序结构图 _BIS_SR(LPM4_bits+GIE);
//打开全局中断
//进入最低功耗模式
在header.h文件中,对数据类型进行了重定义,不仅简化了程序的书写,而且
提高了程序在不同编译环境下的可移植性: typedef unsigned char uchar ; //定义无符号字符型为uchar
typedef unsigned int uint ; //定义无符号整型为uint
全局变量和延时函数也在这里做了定义。而且,考虑到一条记录包含有编号、菜名、单价三个成员,于是使用结构体进行了定义:
struct menu //定义一个结构体类型 struct menu { uchar Num[2]; //给每个菜定义一个唯一标识符 uchar Name[14]; //菜名 uchar Price[8]; //单价
};
Uart.c程序中,对系统时钟、UART1进行了初始化,由于UART波特率对时序的严格要求,必须对系统时钟进行正确的初始化,否则计算的波特率将与实际不符而导致数据无法正确传输:
BCSCTL1 = 0X04; BCSCTL2 = 0X00; BCSCTL2 += SELM1; BCSCTL2 += SELS;
//将寄存器的内容清零 //XT2震荡器开启 //LFTX1工作在低频模式 //ACLK的分频因子为1 //将寄存器的内容清零 //MCLK的时钟源为TX2CLK,分频因子为1 //SMCLK的时钟源为TX2CLK,分频因子为1
MSP430的波特率发生器使用一个分频计数器和一个调整器,分频因子N 由送到分频计数器的时钟(BRCLK)频率和所需要的波特率来决定:
N=BRCLK/(UBR+(M7+M6+M5+M4+M3+M2+M1+M0))/8
根据以上公式及所需要的波特率(9600)可以得到分频计数器和调整器的值:
U1TCTL = SSEL1; //波特率发生器选择SMCLK
UBR0_1 = 0X43; //波特率为9600 UBR1_1 = 0X03; UMCTL_1 = 0X03; //调整寄存器
通过以上公式得到的波特率可以使误差降到最低,经过计算,本程序中波特率的误差为4.17% 。
Lcd.c程序中包含了所有与LCD显示有关的函数,包括清屏、上下左右移动、反色显示、显示ASCII码、汉字、点阵图形等函数。其中清屏、移动,反色等函数简单且比较常用,所以使用宏定义的方式来实现,不仅简化了书写,而且增加了程序的可读性:
#define CLEAR send_data1(0xF4 ) #define MOVE_UP send_data1(0xF5) #define MOVE_DOWN send_data1(0xF6) #define MOVE_LEFT send_data1(0xF7) #define MOVE_RIGHT send_data1(0xF8) #define OVERTURN send_data1(0xFA) #define DISP_CURSOR(l) send_data1(0xFB);send_data1(l) #define CH_SPEED(v) send_data1(0xFC);send_data1(v) ASCII
码、汉字显示程序可以实现在指定位置显示,当一行写满时可以自动换行:
void disp_ascii(uint addr_x, uint addr_y, uchar *eng) { uint i; uint lenght; lenght=strlen(eng); for(i=0;i