通过232串口设置MSP430F149IPM单片机液晶显示时间的程序

本文档提供了通过232串口设置MSP430F149IPM单片机液晶显示时间的程序,用户可以通过发送不同十六进制数来改变显示时间。程序包括定时器A中断服务函数、UART接收中断服务函数,以及1602液晶显示和键盘扫描功能。程序可用于MCU的数字式实时时钟模拟,支持与PC机的串口通信交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过232串口设置MSP430F149IPM单片机液晶显示时间的程序
下面介绍一段通过232串口设置MSP430F149IPM单片机液晶显示时间的程序。用户通过串口发送0X01,0X02,0X03,0X04可以改变单片机液晶显示时间,当到达一定设置时间时,单片机P2端口输出7路高电平,1路低电平,
第二段程序,可以从单片机按键像计算机232串口发送0x00,同时单片机液晶屏显示时间。
MSP430单片机电路如下,程序通过IAR430V5.3软件编译通过,生成.txt文件,使用BSL下载软件-Msp430BSL
通过USB端口把.TXT文件烧写到单片机中。程序和电路可以在下面的网址下载:链接:https://pan.baidu.com/s/1PxUz7CXQP7hGBTIDc7kUog ;
提取码:2kcy
链接:https://pan.baidu.com/s/1e1uS02vlUWDhMH1TnZUEYw ;
提取码:kuw9
https://share.weiyun.com/5PIcLM9
程序1:

/*****************************************************
程序功能:在1602液晶上显示用MCU的TimerA模拟的数字
式实时时钟。

测试说明:观察液晶显示


程序功能:接收来自PC机的字符,然后重新发送给PC机
程序功能:串口发送十六进制数01,液晶显示时间25:25:25,
串口发送十六进制数02,液晶显示时间35:35:35,
串口发送十六进制数03,液晶显示时间11:11:34,
液晶计时11:10:60时,P2口输出01111111,液晶显示33:33:11

通信格式:N.8.1, 9600
无校验,8个数据位,1个停止位,波特率9600
*****************************************************/
#include <msp430x14x.h>
#include “cry1602.h”
#include “clock.h”
#include “cry1602.c”
#include “clock.c”
#define keyin P3IN
uchar tishi[]={“Current Time is”}; //提示信息
void delay(void);
extern uchar second,minute,hour,hour0;

extern uchar pmin,phour,ps1;

#define SetTime(H,M,S) {second=S;minute=M;hour=H;hour0=H;}
uchar scandata[16] ;
/*主函数/
void main(void)
{

/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;

WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗

// P6DIR |= BIT2;P6OUT |= BIT2;//关闭电平转换
// P6DIR |= BIT6;P6OUT &= ~BIT6;//关闭电平转换
P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口
ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受
UCTL0 |= CHAR; // 选择8位字符
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 波特率9600
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // 初始化UART状态机
// IE1 |= URXIE0; // 使能USART0的接收中断
CCR0 = 32768 - 1; //设置定时器A的中断时间为1S
TACTL = TASSEL_1 + MC_1; //计数时钟ACLK, 增计数模式
CCTL0 |= CCIE; //使能CCR0比较中断
_EINT(); //打开全局中断
// IE1 |= URXIE0; // 使能USART0的接收中断

//请在此处设置正确时间
SetTime(11,11,34);           //顺序:时,分,秒,格式:BCD码
  
LcdReset(); 
DispNChar(0,0,15,tishi);     //显示提示文字

Disp1Char(6,1,':');          //显示字符 :
Disp1Char(9,1,':');
 P2DIR = 0xff;                   //设置P2口方向为输出
 //  SetTime( RXBUF0, RXBUF0, RXBUF0);           
 // P2OUT = 0x40;
   // if(IFG1 & URXIFG0)      //如果收到字符
   // {
      
    //SetTime( RXBUF0, RXBUF0, RXBUF0);           //顺序:时,分,秒,格式:BCD码
   // }
   //else
  // {
   //   SetTime(11,11,34);           //顺序:时,分,秒,格式:BCD码
   //}
while(1)
{
    // _EINT();                               //打开全局中断
  //  LPM1;                                  //进入LPM1模式
 //   while (!(IFG1 & UTXIFG0));             //等待以前的字符发送完毕
  //  TXBUF0 = RXBUF0;                       //将收到的字符发送出去 
     //  if(IFG1 & URXIFG0)      //如果收到字符
    //{
// switch(RXBUF0)
  //  {
    //case 0x01:
                if(RXBUF0 == 0x01)   //如果是第一个按键被按下
                {
    second=25;
    minute=25;
    hour=25;
    //SetTime(19,19,19);
     TXBUF0 = RXBUF0;   
   // }
    //}
    }
      if(RXBUF0 == 0x02)   //如果是第一个按键被按下
                {
    second=35;
    minute=35;
    hour=35;
    //SetTime(19,19,19);
     TXBUF0 = RXBUF0;   
   // }
    //}
    }
         if(RXBUF0 == 0x03)   //如果是第一个按键被按下
                {
    second=34;
    minute=11;
    hour=11;
    //SetTime(19,19,19);
     TXBUF0 = RXBUF0;   
   // }
    //}
    }
 //  else
  // {
     // SetTime(11,11,34);           //顺序:时,分,秒,格式:BCD码
  // }
    
    //scandata[16] =RXBUF0; 
   // if(RXBUF0!=0X00)
  //  {
      
   // SetTime( RXBUF0, RXBUF0, RXBUF0);           //顺序:时,分,秒,格式:BCD码
   // }
      //LPM3;                    //进入LPM3低功耗模式
    Display();
    if(second == 60&minute==10&hour==11)   //如果是第一个按键被按下
               {
                    
                   P2OUT = 0x80;
                      SetTime(33,33,11);           
                   }

    
      if(keyin == 0xbf)   //如果是第一个按键被按下
                {
                    delay();
                    if(keyin == 0xbf)
                    {
                        while(keyin != 0xbf);       //等待按键放开
                   SetTime(22,22,11);           //顺序:时,分,秒,格式:BCD码
                        return;
                   }

    
}
     
}    

}

/*******************************************
函数名称:TimerA_ISR
功 能:定时器A的中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
Clock();
LPM3_EXIT;
}

void delay(void)
{
uint tmp;

for(tmp = 12000;tmp > 0;tmp--);

}

/*******************************************
函数名称:UART0_RXISR
功 能:UART0的接收中断服务函数,在这里唤醒
CPU,使它退出低功耗模式
参 数:无
返回值 :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt v

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值