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

如题所述

/********************************************************
程序功能:从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 = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;

uchar disptemp[8];

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P6DIR |= BIT2;P6OUT |= 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 = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;

uchar disptemp[8];

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P6DIR |= BIT2;P6OUT |= 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 = 0;i < time;i++) _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 = 8; i > 0; i--)
{
if(wdata&0x01) DS_SDA1;
else DS_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 = 8; i > 0; i--)
{
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 = 8; i > 0; i--)
{
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 = 8; i > 0; i--)
{
*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 = 31; i>0; i--) //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 = 31; i > 0; i--)
{
*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 = 7;i > 0;i--)
{
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 = 0;i < 7;i++)
{
ptr[i] = R_Data(addr);
addr += 2;
}
}追问

希望用数码管显示啊 ,大侠再改改谢谢。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-04
haibucuo

...C141: syntax error near 'void' 单片机c语言
这个应该是个单片机 C51的LED显示程序。是不是你输入的时候用了全角输入?另外,看一下main是否可以这么声明,有些编译器比较严格,声明类型不匹配也编译不过。不过感觉更像是不小心输入了全角字符之类的。

...有数字和汉字)设置大小和颜色啊?多谢各位大侠呀!
修改字体大小,可以用函数 GetCurrentConsoleFontEx SetCurrentConsoleFontEx 有问题,欢迎到百度codeblocks贴吧找我;)

设计电子时钟 要用AT89S51单片机的定时器实现,用4位数码管显示,用点的...
实验方法:TIMER0中断用来计时,控制数码时钟的时间显示 还可设置半秒或四分之一秒,用来控制音调 TIMER1用来控制音普,,timer0用MODE2自动加载模式 *\/ include<reg52.h> sbit speaker=P2^3 ;sbit AA=P2^2 ; \/\/调时用 sbit BB=P2^1 ; \/\/调分用 sbit CC=P2^0 ; \/\/ 设置闹钟用 sbit P1...

C语言中0x88能算的上是一个字符吗?小弟初学C语言不太懂..谢谢各位大侠...
1、16进制数字0x88可以表示一个字符。2、0x88不在标准ASCII字符集中,它在扩展的ASCII集中,所以用char类型存储和表示可能会有一些问题(例如有可能会截断)3、可以直接用0x88向字符变量赋值,不过会有警告信息,通常是用转义字符来完成这个工作,例如:box[0]='\\x88';其中的'\\x88'是转义字符,表示把...

...38秒开始的舞蹈音乐名字求音乐名字谢谢各位大侠http:\/\/tv.sohu...
链接进不去啊! 他在厨房放的是 bo peep 后来他和学生一起跳的音乐是 firework 希望对你有帮助

各位大侠,帮我找找流行歌曲,时长为4分55秒-5分05秒的,知道的请列出来...
bada《卑恋》,郭书瑶《爱的抱抱》(听完了差点汗死我),RIYO橙《寂寞在唱什么歌》至上励合《繁星》sara后弦《你还欠我一个拥抱》萧亚轩《类似爱情》最近觉得还行的,都听完再说 好不好

...求答案.后天就要考试了,不太会做,请各位大侠帮帮忙,万分感谢...
电磁式仪表用符号 ‘ ‘表示,分为吸引型和排斥型两种. 吸引型电磁式仪表工作原理:线圈通电后,铁片被磁化,无论在那种情况下都能使时钟顺时方向转动. 排斥型电磁式仪表工作原理:线圈通电后,动定铁片被磁化, 动定铁片的同极相对,互相排斥,使动铁片转动. 电动式仪表用符号 ‘ ‘表示. 其工作原理为:固定线圈产生...

各位奥数大侠,我现需要30道约数与倍数应用题,有的大侠可以发到网上...
27。狐狸和黄鼠狼进行跳跃比赛,狐狸每次跳米,黄鼠狼每次跳米,它们每秒钟都只跳一次。比赛途中,从起点开始每隔米设有一个陷井,当它们之中有一个掉进陷井时,另一个跳了多少米?28。已知a与b的最大公约数是12,a与c的最小公倍数是300,b与c的最小公倍数也是300,那么满足上述条件的自然数a,b,...

相似回答