课程设计-超声波测距+实际 MSP430 单片机与 proteus 中虚拟 51 单片机串口通信仿真 下载本文

考虑到设计当中需要用到液晶、串口,故需要对各个模块进行初始化编程: 1. 对 430 单片机的时钟寄存器配置:

void timeinit()

{

BCSCTL1 &= ~XT2OFF; do {

IFG1 &= ~OFIFG; for(i=0xff;i>0;i--); }

while((IFG1 & OFIFG)); BCSCTL2 |= SELM_2;

//BCSCTLL1 = BCSCTLL1 & (~XT2OFF);

//OFIFG = 0X02; BCSCTL2 |= SELS;//选择 SMCLK 的信号源 XT2CLK(8MHz)

TACTL=TASSEL_2+ID_3+MC_1;//ID_3 表示八分频! MC_1 表示增计数 CCR0=65535; _EINT(); }

//打开总中断!

2.

初始化 UART 端口:

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

函数名称:InitUART 功 能:初始化 UART 端口 参 数:无 返回值 :无

********************************************/ void InitUART(void) {

P3SEL |= 0x30; // 选择 P3.4 和 P3.5 做 UART 通信端口 ME1 |= UTXE0 + URXE0; // 使能 USART0 的发送和接受

UCTL0 |= CHAR; UTCTL0 |= SSEL0; UBR00 = 0x03; UBR10 = 0x00; UMCTL0 = 0x4A; UCTL0 &= ~SWRST; IE1 |= URXIE0;

// 选择 8 位字符 // UCLK = ACLK // 波特率 9600 //

// Modulation // 初始化 UART 状态机 // 使能 USART0 的接收中断

}

3.

对 1602 液晶模块进行复位操作:

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

函数名称:LcdReset 功 能:对 1602 液晶模块进行复位操作 参 数:无

********************************************/ void LcdReset(void) {

CtrlDir |= 0x38; //控制线端口设为输出状态 DataDir = 0xFF; //数据端口设为输出状态 LcdWriteCommand(0x38, 0); //规定的复位操作 Delay5ms();

LcdWriteCommand(0x38, 0); Delay5ms(); LcdWriteCommand(0x38, 0); Delay5ms();

LcdWriteCommand(0x38, 1); LcdWriteCommand(0x08, 1); LcdWriteCommand(0x01, 1); LcdWriteCommand(0x06, 1); LcdWriteCommand(0x0c, 1); }

//显示模式设置 //显示关闭 //显示清屏

//写字符时整体不移动 //显示开,不开游标,不闪烁

3.2.2. 温度采集 DS18B20 模块

采集模块重要是通过 DS18B20 温度传感器获得数据,并对采集来的数据进行

处 理 后 送 给 MSP430F149 。 CPU 对

DS18B20 的 访 问流程是:先对 DS18B20 初 始 化,再进行 RoI1

操作命令,最后才能对存储器操作、数据操作。DS18B20 每一步操作都要遵循严 格的工作时序和通信协议。如主机控制 DS18B20 完成温度转换这一过程,根据 DS18B20 的通讯协议,须经三个步骤:每一次读写之前都要对 DS18B20 进行复位, 复位成功后发送一条 ROM 指令,最后发送 RAM 指令,这样才能对 DS18B20 进 行预定的操作图为该模块的程序流程图。

根据 DS18B20 的读/写时序图即可编写程序:

/******************************************* 函数名称:ReadTemp 功 能:从 DS18B20 的 ScratchPad 读取温度转换结果 参 数:无

返回值 :读取的温度数值

********************************************/ uint ReadTemp(void) {

uchar temp_low; uint temp;

temp_low = Read_18B20(); //读低位 temp = Read_18B20(); //读高位 temp = (temp<<8) | temp_low;

return temp; }

3.2.3. 超声波传感器模块

根据时序图编程如下:

/******************************************* 函数名称:PutSting 功 能:向上位机发送字符串 参 数:ptr--指向发送字符串的指针 返回值 :无

********************************************/ void PutString(uchar *ptr) {

while(*ptr != '\\0') {

while (!(IFG1 & UTXIFG0)); TXBUF0 = *ptr++;

}

while (!(IFG1 & UTXIFG0)); // TXBUF0 = '\\n';

// TX 缓存空闲? // 发送数据

}

3.2.4. 报警模块

报警处埋模块相当简单,这里只是简单的在一个 I/O 口上送出数据来驱动蜂 鸣器,该模块包括初始化端口和数据产生两个部分,下面就各个部分给出具体的 程序代码到。

初始化部分:该部分将输出端口设置为输出方向。程序代码如下: void init_AlarmPort(void) { //将 P2.5 设置为输出方向

P2DIR=BIT5;

Return; } 数据产生部分:该部分主要是在输出端口产生数据,这里不是简单的一个高

电平或者低电平,而是有一定频率的数据,因为只有是交流信号才-可以让蜂鸣器 发声。至于不同的周期信号可以得到不同的频率,可以根据信号处理的知识进行 分析,这里就不进行讨论。下面给出代码[12],

void Ring(void) { int I;

P2OUT |=BIT5; //高电平 for(i=0;i<200;i++) _NOP();

P2OUT &=~(BIT5) //低电平 for(i=0;i<200;i++)_nop();

在上面的程序中,_NOP()为 MSP430 提供内联函数。上面程序中是一个单音 频率的数据.可以根据信号处理的知识修改上而的程序,产生出具有丰富频率的数 据[11]。

4. Proteus 中虚拟单片机的仿真系统设计

4.1. Proteus 简介

有了 protel、Multisim、proteus、psice 等一系列的软件的存在,就此便可

以以虚代实、以软代硬,独立建立一个完善的虚拟实验室。代替了在实验室

和教室里的以实物进行实践的方式,可以在计算机上学习电工基础,模拟电 路、数字电路、单片机应用系统等课程,并进行电路设计、仿真、调试等。 因此这一系列的软件受到广大电子设计爱好者的青睐,是他们工作、学习上难 得的工具软件,也因此它们在全球得到了广泛应用。

其中,Proteus 软件提供多达 30 多个元件库,元件涉及到数字和模拟、 交流和直流等,有 RAM、ROM、键盘、马达、LED、LCD、AD/DA、部分 SPI 器 件、部分 IIC 器件,编译方面支持 Keil 和 MPLAB 等编译器。它的功能强大, 集电路设计、制版及仿真等多种功能于一身,不仅能够对电工、电子技术学科涉 及的电路进行设计与分析,还能够对微处理器进行设计和仿真,也能仿真单片机 外围电路或没有单片机参与的其它电路的工作情况。它还提供多种现实存在 的虚拟仪器,这些仪表有极高的输入阻抗、极低的输出阻抗,尽可能减少仪 器对测量结果的影响。

此外,Proteus 软件还有图形显示功能,可以将线路上变化的信号,以 图 形 的 方 式 实 时 地 显 示 出 来 。 对 于 单 片 机 硬 件 电 路 和 软 件 的 调 试 , Proteus 提供了两种方法: 系统总体执行效果和对软件的分步调试。 它还 提供了比较丰富的测试信号用于电路的测试,这些测试信号包括模拟信号和 数字信号。在用 Proteus 进行仿真和程序调试时,只要关心从工程的角度直 接看程序 运行和电路工作的 过程和结果。 它还提供 Schematic Drawing、 SPICE 仿真与 PCB 设计功能,同时可以仿真单片机和周边设备,可以仿真 PIC、 AVR、51 系列等常用的 MCU,并提供周边设备的仿真,例如示波器、373、led 等。

4.2. ISISI 编辑器介绍

1、仿真界面如下所示: