通过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