msp430单片机C语言的数字钟(只需要显示小时和分,秒)。各位大侠快快的啊。谢谢啦。。

msp430单片机C语言的数字钟(只需要显示小时和分,秒)。各位大侠快快的啊。谢谢啦。。,第1张

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

程序功能:从DS1302中读出时间数据在1602液晶模块上显示

---------------------------------------------------------

拨码开关设置:将LCD位拨至ON,其余拨至OFF

测试说明:用户可以更改"gdata.h"中wdata,bwdata,rwdata

三个数组中的数据,但是请注意数据格式。

根据程序中提示,设置断点观察数据。

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

#include <msp430x14x.h>

#include "ds1302.h"

#include "ds1302.c"

#include "cry1602.h"

#include "cry1602.c"

#include "gdata.h"

void main(void)

{

/*下面六行程序关闭所有的IO口*/

P1DIR = 0XFFP1OUT = 0XFF

P2DIR = 0XFFP2OUT = 0XFF

P3DIR = 0XFFP3OUT = 0XFF

P4DIR = 0XFFP4OUT = 0XFF

P5DIR = 0XFFP5OUT = 0XFF

P6DIR = 0XFFP6OUT = 0XFF

uchar disptemp[8]

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

P6DIR |= BIT2P6OUT |= BIT2 //关闭电平转换

disptemp[2]=0x3a // ":"对应的编码

disptemp[5]=0x3a

Reset_DS1302()

/*****测试更改和读出时间*****/

Set_DS1302(wdata)

Get_DS1302(rdata)

_NOP()//在此处设置断点,观察rdata是否与wdata一致

/*****测试连续读写时间寄存器*****/

BurstWrite1302(bwdata)

BurstRead1302(brdata)

_NOP()//在此处设置断点,观察brdata是否与bwdata一致

/*****测试连续读写RAM*****/

BurstWriteRAM(rwdata)

BurstReadRAM(rrdata)

_NOP()//在此处设置断点,观察rrdata是否与rwdata一致

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

注释:用户在利用27~43行的程序完成测试以后,请设置好

正确的当前时间然后将这端程序屏蔽掉,重新make以后写入

CPU中,这样才能保证每次上电时CPU都从DS1302中读出正确

的当前时间送到液晶中去显示,而不会发生每次都重新改写

DS1302内部时间的问题。

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

//初始化液晶

LcdReset()

DispNchar(1,0,14,tishi)

//读取时间转换数值显示

while(1)

{

BurstRead1302(rdata)

disptemp[6] = shuzi[(rdata[0]&0xf0)>>4]

disptemp[7] = shuzi[rdata[0]&0x0f]

disptemp[3] = shuzi[(rdata[1]&0xf0)>>4]

disptemp[4] = shuzi[rdata[1]&0x0f]

disptemp[0] = shuzi[(rdata[2]&0xf0)>>4]

disptemp[1] = shuzi[rdata[2]&0x0f]

DispNchar(4,1,8,disptemp)

delay(50000)

}

}

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

程序功能:从DS1302中读出时间数据在1602液晶模块上显示

---------------------------------------------------------

拨码开关设置:将LCD位拨至ON,其余拨至OFF

测试说明:用户可以更改"gdata.h"中wdata,bwdata,rwdata

三个数组中的数据,但是请注意数据格式。

根据程序中提示,设置断点观察数据。

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

#include <msp430x14x.h>

#include "ds1302.h"

#include "ds1302.c"

#include "cry1602.h"

#include "cry1602.c"

#include "gdata.h"

void main(void)

{

/*下面六行程序关闭所有的IO口*/

P1DIR = 0XFFP1OUT = 0XFF

P2DIR = 0XFFP2OUT = 0XFF

P3DIR = 0XFFP3OUT = 0XFF

P4DIR = 0XFFP4OUT = 0XFF

P5DIR = 0XFFP5OUT = 0XFF

P6DIR = 0XFFP6OUT = 0XFF

uchar disptemp[8]

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

P6DIR |= BIT2P6OUT |= BIT2 //关闭电平转换

disptemp[2]=0x3a // ":"对应的编码

disptemp[5]=0x3a

Reset_DS1302()

/*****测试更改和读出时间*****/

Set_DS1302(wdata)

Get_DS1302(rdata)

_NOP()//在此处设置断点,观察rdata是否与wdata一致

/*****测试连续读写时间寄存器*****/

BurstWrite1302(bwdata)

BurstRead1302(brdata)

_NOP()//在此处设置断点,观察brdata是否与bwdata一致

/*****测试连续读写RAM*****/

BurstWriteRAM(rwdata)

BurstReadRAM(rrdata)

_NOP()//在此处设置断点,观察rrdata是否与rwdata一致

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

注释:用户在利用27~43行的程序完成测试以后,请设置好

正确的当前时间然后将这端程序屏蔽掉,重新make以后写入

CPU中,这样才能保证每次上电时CPU都从DS1302中读出正确

的当前时间送到液晶中去显示,而不会发生每次都重新改写

DS1302内部时间的问题。

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

//初始化液晶

LcdReset()

DispNchar(1,0,14,tishi)

//读取时间转换数值显示

while(1)

{

BurstRead1302(rdata)

disptemp[6] = shuzi[(rdata[0]&0xf0)>>4]

disptemp[7] = shuzi[rdata[0]&0x0f]

disptemp[3] = shuzi[(rdata[1]&0xf0)>>4]

disptemp[4] = shuzi[rdata[1]&0x0f]

disptemp[0] = shuzi[(rdata[2]&0xf0)>>4]

disptemp[1] = shuzi[rdata[2]&0x0f]

DispNchar(4,1,8,disptemp)

delay(50000)

}

}

#include <msp430x14x.h>

typedef unsigned char uchar

typedef unsigned int uint

/**************宏定义***************/

#define DS_RST BIT7//DS_RST = P2.7

#define DS_SCL BIT5//DS_SCL = P2.5

#define DS_SDA BIT6//DS_SDA = P2.6

#define DS_RST_IN P2DIR &= ~DS_RST

#define DS_RST_OUT P2DIR |= DS_RST

#define DS_RST0 P2OUT &= ~DS_RST

#define DS_RST1 P2OUT |= DS_RST

#define DS_SCL_IN P2DIR &= ~DS_SCL

#define DS_SCL_OUT P2DIR |= DS_SCL

#define DS_SCL0 P2OUT &= ~DS_SCL

#define DS_SCL1 P2OUT |= DS_SCL

#define DS_SDA_IN P2DIR &= ~DS_SDA

#define DS_SDA_OUT P2DIR |= DS_SDA

#define DS_SDA0 P2OUT &= ~DS_SDA

#define DS_SDA1 P2OUT |= DS_SDA

#define DS_SDA_BIT P2IN &DS_SDA

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

函数名称:delay

功能:延时一段时间

参数:time--延时长度

返回值 :无

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

void delay(uint time)

{

uint i

for(i = 0i <timei++) _NOP()

}

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

函数名称:Reset_DS1302

功能:对DS1302进行复位 *** 作

参数:无

返回值 :无

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

void Reset_DS1302(void)

{

DS_RST_OUT //RST对应的IO设置为输出状态

DS_SCL_OUT //SCLK对应的IO设置为输出状态

DS_SCL0//SCLK=0

DS_RST0//RST=0

delay(10)

DS_SCL1 //SCLK=1

}

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

函数名称:Write1Byte

功能:对DS1302写入1个字节的数据

参数:wdata--写入的数据

返回值 :无

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

void Write1Byte(uchar wdata)

{

uchar i

DS_SDA_OUT//SDA对应的IO设置为输出状态

DS_RST1 //REST=1

for(i = 8i >0i--)

{

if(wdata&0x01) DS_SDA1

elseDS_SDA0

DS_SCL0

delay(10)

DS_SCL1

delay(10)

wdata >>= 1

}

}

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

函数名称:Read1Byte

功能:从DS1302读出1个字节的数据

参数:无

返回值 :读出的一个字节数据

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

uchar Read1Byte(void)

{

uchar i

uchar rdata = 0X00

DS_SDA_IN //SDA对应的IO设置为输入状态

DS_RST1 //REST=1

for(i = 8i >0i--)

{

DS_SCL1

delay(10)

DS_SCL0

delay(10)

rdata >>= 1

if(DS_SDA_BIT) rdata |= 0x80

}

return(rdata)

}

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

函数名称:W_Data

功能:向某个寄存器写入一个字节数据

参数:addr--寄存器地址

wdata--写入的数据

返回值 :无

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

void W_Data(uchar addr, uchar wdata)

{

DS_RST0

DS_SCL0

_NOP()

DS_RST1

Write1Byte(addr) //写入地址

Write1Byte(wdata) //写入数据

DS_SCL1

DS_RST0

}

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

函数名称:R_Data

功能:从某个寄存器读出一个字节数据

参数:addr--寄存器地址

返回值 :读出的数据

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

uchar R_Data(uchar addr)

{

uchar rdata

DS_RST0

DS_SCL0

_NOP()

DS_RST1

Write1Byte(addr) //写入地址

rdata = Read1Byte() //读出数据

DS_SCL1

DS_RST0

return(rdata)

}

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

函数名称:BurstWrite1302

功能:以burst方式向DS1302写入批量时间数据

参数:ptr--指向时间数据存放地址的指针

返回值 :读出的数据

说明:时间数据的存放格式是:

秒,分,时,日,月,星期,年,控制

【7个数据(BCD格式)+1个控制】

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

void BurstWrite1302(uchar *ptr)

{

uchar i

W_Data(0x8e,0x00) //允许写入

DS_RST0

DS_SCL0

_NOP()

DS_RST1

Write1Byte(0xbe) // 0xbe:时钟多字节写入命令

for (i = 8i >0i--)

{

Write1Byte(*ptr++)

}

DS_SCL1

DS_RST0

W_Data(0x8e,0x80) // 禁止写入

}

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

函数名称:BurstRead1302

功能:以burst方式从DS1302读出批量时间数据

参数:ptr--指向存放时间数据地址的指针

返回值 :无

说明:时间数据的存放格式是:

秒,分,时,日,月,星期,年,控制

【7个数据(BCD格式)+1个控制】

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

void BurstRead1302(uchar *ptr)

{

uchar i

DS_RST0

DS_SCL0

_NOP()

DS_RST1

Write1Byte(0xbf)//0xbf:时钟多字节读命令

for (i = 8i >0i--)

{

*ptr++ = Read1Byte()

}

DS_SCL1

DS_RST0

}

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

函数名称:BurstWriteRAM

功能:以burst方式向DS1302的RAM中写入批量数据

参数:ptr--指向存放数据地址的指针

返回值 :无

说明:共写入31个字节的数据

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

void BurstWriteRAM(uchar *ptr)

{

uchar i

W_Data(0x8e,0x00)//允许写入

DS_RST0

DS_SCL0

_NOP()

DS_RST1

Write1Byte(0xfe) //0xfe:RAM多字节写命令

for (i = 31i>0i--) //RAM共有31个字节

{

Write1Byte(*ptr++)

}

DS_SCL1

DS_RST0

W_Data(0x8e,0x80) //禁止写入

}

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

函数名称:BurstReadRAM

功能:以burst方式从DS1302的RAM中读出批量数据

参数:ptr--指向数据存放地址的指针

返回值 :无

说明:共读出31个字节的数据

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

void BurstReadRAM(uchar *ptr)

{

uchar i

DS_RST0

DS_SCL0

_NOP()

DS_RST1

Write1Byte(0xff)//0xff:RAM的多字节读命令

for (i = 31i >0i--)

{

*ptr++ = Read1Byte()

}

DS_SCL1

DS_RST0

}

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

函数名称:Set_DS1302

功能:设置DS1302内部的时间

参数:ptr--指向存放数据地址的指针

返回值 :无

说明:写入数据的格式:

秒 分 时 日 月 星期 年 【共7个字节】

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

void Set_DS1302(uchar *ptr)

{

uchar i

uchar addr = 0x80

W_Data(0x8e,0x00) //允许写入

for(i = 7i >0i--)

{

W_Data(addr,*ptr++)

addr += 2

}

W_Data(0x8e,0x80) //禁止

}

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

*

* 名称: Get_DS1302

* 说明:

* 功能: 读取DS1302当前时间

* 调用: R_Data(uchar addr)

* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年

* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B

* 返回值: 无

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

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

函数名称:Get_DS1302

功能:读取DS1302内部的时间

参数:ptr--指向数据存放地址的指针

返回值 :无

说明:读出数据的格式:

秒 分 时 日 月 星期 年 【共7个字节】

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

void Get_DS1302(uchar *ptr)

{

uchar i

uchar addr = 0x81

for(i = 0i <7i++)

{

ptr[i] = R_Data(addr)

addr += 2

}

}

你是想输出时钟吗?我贴一个TI例程给你看看,希望有帮助,还有就是430F149 aclk的输出引脚一般是p5.6,你参考芯片引脚进行改进比较好

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

// MSP-FET430P140 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK

//

// Description: Output buffered MCLK, SMCLK and ACLK.

// ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2

// //* XTAL's REQUIRED - NOT INSTALLED ON FET *//

// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//

//

//MSP430F149

//-----------------

///|\| XIN|-

// | | | 32k

// --|RST XOUT|-

// | |

// |XT2IN|-

// | | XTAL (455k - 8Mhz)

// |RSTXT2OUT|-

// | |

// | P5.4|-->MCLK = DCO Max

// | P5.5|-->SMCLK = XT2

// | P5.6|-->ACLK = 32kHz

//

// M. Buccini

// Texas Instruments Inc.

// Feb 2005

// Built with IAR Embedded Workbench Version: 3.21A

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

#include <msp430x14x.h>

void main(void)

{

WDTCTL = WDTPW +WDTHOLD // Stop Watchdog Timer

DCOCTL = DCO0 + DCO1 + DCO2 // Max DCO

BCSCTL1 = RSEL0 + RSEL1 + RSEL2 // XT2on, max RSEL

BCSCTL2 |= SELS // SMCLK = XT2

P5DIR |= 0x70 // P5.6,5,4 outputs

P5SEL |= 0x70 // P5.6,5,5 options

while(1)

{

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11153682.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存