单片机MSP430F149-DS1302读写及串口收发程序
DS1302原理及程序说明
DS1302原理及程序说明DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM ,通过简单的串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。
DS1302 与单片机之间能简单地采用同步串行的方式进行,DS1302的引脚命名如图1-1所示。
通信仅需用到三根信号线:(1)CE 片选,(2)I/O 数据线,(3)SCLK 串行时钟,DS1302与CPU 的连接如图1-2所示。
时钟/RAM 的读/写数据以一个字节或多字节的字符组方式通信,DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW 。
DS1302具有双电源管脚,用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器,它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域。
DS1302主要的性能指标如下:实时时钟具有能计算2100 年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力31× 8 位暂存数据存储RAM 串行I/O 口方式,使得管脚数量最少宽范围工作电压2.0~ 5.5V工作电流2.0V 时,小于300nA读/写时钟或RAM 数据时有两种传送方式:单字节传送和多字节传送字符组方式8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配简单3 线接口与TTL 兼容Vcc=5V 。
DS1302的读写模式工作时序如图1-3和图1-4所示。
图1-3 单字节读模式图1-4 单字节写模式注:在多字节模式下,SCLK 发出同步脉冲,CS 须持续保持高电平直到多字节操作结束,图1-1 DS1302引脚图1-2 DS1302与CPU 接口DS1302内部寄存器的地址定义如表1-1所示。
表1-1 寄存器的地址及定义实验说明1. DS1302与51单片机的连接IO ——P2.7:串行数据输入/输出引脚SCLK ——P2.6:串行时钟引脚CE ——P2.4:片选CE2. LCD 与单片机连接;************************************************************************* ; LCD Module LMB1602 与单片机连接:;************************************************************************* ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ;Vss Vdd V o RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK ; 0V +5V 0V P32 P33 P34 ---------------- P1[0..7] ---------------- +5V 0V;*************************************************************************3. LCD 显示功能说明LCD1602显示格式如图1-5所示。
ds1302与单片机的连接,51单片机操作ds1302流程展示
ds1302 与单片机的连接,51 单片机操作ds1302 流程
展示
在许多单片机系统中常需要一些与时间有关的控制这就有需要使用实时时钟,因为在测控系统中需要做一些特殊数据的记录及其出现时间的记
录。
那幺实时时钟就能够很好的解决这个问题,今天我们就来谈谈ds1302 与单片机之间是如何作用联系的,单片机又是如何对时钟芯片进行操作的,一
起来了解一下。
51 单片机操作ds1302 流程展示
DS1302 通过3 根线与MCU 连接串行数据发送,接收时钟信号由MCU 发送,可外接备用电池以便主电源断电后不丢失数据,并可编程对备用电源充电。
DS1302 的结构如下:。
DS1302基本读写
{
TMOD |= 0x01; Fra bibliotek/设置定时器0的模式为16位
TH0 = ( 65536-46000 ) / 256;
TL0 = (65536-46000) % 256;
if( EA != 1 )
EA = 1;
ET0 = 1; //打开定时器0的中断
/*****************************************************************
*********** Name: DS1302
***********Date: 2014/12/25
***********Com: FairSun
*********** LOL
/*void Timer0_server( void ) interrupt 1
{
TH0 = (65536-46000) / 256;
TL0 = (65536-46000) % 256;
} */
/************************************************************************
const unsigned char smg_dp_yin[ 16 ] = {0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef,
0xf7, 0xfc, 0xb9, 0xde, 0xfb, 0xf1};//0. 1. 2. 3......f.
unsigned char month;
unsigned char date; //一月的几日
};
PIC单片机读写时钟芯片DS1302汇编程序
DECFSZ COUNT1,F
GOTO TR1
BANK1
BCF TRISC,7 ;OUTPUT
BANK0
BCF SCLK ;恢复
RETURN
NOP
PORT_INI
BANK1
MOVLW B'00000000'
MOVWF TRISC
MOVLW B'0'
MOVWF TRISB
MOVLW B'00000111'
MOVWF ADCON1
MOVLW B'00000000'
MOVWF TRISA
BANK0
MOVLW 18H
MOVWF 20H
MOVLW 19H
MOVWF 21H
MOVLW 05H
MOVWF 22H
MOVLW 13H
MOVWF 23H
; 作用:一次接受7个字节的时间数据,突发模式读取
; INPUT:NONE
; OUTPUT:把7个时间数据保存在TIME_RX_ADD开始的7个寄存器里面
;***********************************************
GET_TIME
MOVLW B'10111111'
读秒,可以读任意7个时间,单字节
MOVLW B'10000001'
MOVWF TIME_TX
BSF RST
CALL TIME_WRITE_1
CALL TIME_READ_1
BCF RST
GOTO $
模拟SPI数据传输的读写程序(时钟芯片DS1302为例)
模拟SPI数据传输的读写程序(时钟芯片DS1302为例)
本文是以时钟芯片DS1302为例子来分析时序图并写出代码。
DS1302是采用SPI三线接口与单片机进行同步通信。
重点分析单字节读时序,单字节写时序,寄存器读时序,寄存器写时序,并完成4个函数。
完整代码以及仿真图下载地址:
上图为寄存器读时序,为什么先贴出这个图呢,因为读寄存器包含了单字节的写以及单字节的读。
从图上可以看出,读DS1302的寄存器是先写入一个地址,然后再去读一个字节。
那么就可以根据这个图来完成单字节的读写时序分析以及代码的编写。
单字节写时序图1可以告诉我们,在时钟的上升沿是写入数据,是从低位开始写入。
还有一个需要注意的地方是写字节和读字节连接处,从图中可以看出,当最后一个位写入后,接下来的一个下降沿就开始读数据了,在代码编写时要注意这一点,不然读数据就会出错。
先看看下面的代码:
void dsWriteByte(u8 dat) //写入字节
{
u8 i;
for(i = 0;i 8;i++)
{
if(dat 0x01) ds1302IOStatu(1);
else ds1302IOStatu(0); //低位先写入,根据要写入的数据确定IO的电平
ds1302CLKStatu(0);
ds1302CLKStatu(1); //产生上升沿写入数据
dat = 1; //移位,准备下一位
}
} //写一个字节后,此时时钟脚是高电平。
DS1302读写程序
//读 DS1302RAM 字节 unsigned char TimeRamByteRead(unsigned char address) { TimeSpiOpen();//打开 DS1302 TimeSpiReadWrite((address << 1) | 0xc1);//写入 DS1302 命令 address = TimeSpiReadWrite(0xff);//读入 DS1302 数据 TimeSpdress;//返回数据 }
val = TimeByteRead(timereadseg);//读秒数据 val &= 0x7f;//打开晶振 TimeWrieDisbale();//开放 DS1302 写保护 TimeByteWrite(timewriteseg, val);//打开晶振 TimeByteWrite(tricklewrite, 0xa5);//打开充电二极管 TimeWriteEnable();//使能 DS1302 写保护 }
//打开 DS1302 void TimeSpiOpen(void) { TIMECLK = 0; TIMERST = 0;//禁止 DS1302 TIMEIO } //关闭 DS1302 void TimeSpiClose(void) { TIMERST = 0;//禁止 DS1302 TIMEIO } //读写 DS1302 unsigned char TimeSpiReadWrite(unsigned char val) { unsigned char i; ACC = val;//取 8 位数据 for (i = 8;i > 0; i--) { TIMECLK = 0;//时钟下降沿输入数据(DS1302 读) _nop_();//延时 CY = TIMEIO;//接收串行数据到 CY _rrca_();//右移一位数据到 CY(先存后取) TIMEIO = CY;//发送串行数据 TIMECLK = 1;//时钟上升沿打入数据(DS1302 写) TIMEIO } val = ACC; return val; } //读 DS1302 字节 unsigned char TimeByteRead(unsigned char address) { TimeSpiOpen();//打开 DS1302 TimeSpiReadWrite(address);//写入 DS1302 命令 address = TimeSpiReadWrite(0xff);//读入 DS1302 数据 TimeSpiClose();//关闭 DS1302 return address;//返回数据 } = 1;//释放数据总线 = 1;//释放数据总线 TIMECLK = 1; = 1;//释放数据总线 TIMERST = 1;//使能 DS1302
DS1302读写程序IIC总线
DS1302读写程序(IIC总线)#include; //包含单片机寄存器的头文件#include; //包含_nop_()函数定义的头文件#define uchar unsigned char#define uint unsigned intsbit SRT=P3^5;sbit IO=P3^4;sbit SCK=P3^6;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar miao,fen,shi,tian,yue,zhou,nian;uchar read_DS1302(uchar addr)//读DS1302子程序;{uchar dat,i,temp,j;SRT=0;SCK=0;IO=0;//必须先置低,否则易出错;SRT=1;for(i=0;i;>;1;SCK=1;_nop_();}// IO=1;//释放总线,以便接下来的读操作,//否则读出的数据永远都是0x00,//但因addr最高总是1,在传送最高位时,即IO=dat=1, //所以此句可以不要;for(j=0;j;>;=1;if(IO)temp=temp|0x80;SCK=1;_nop_();}SCK=0;//必须严格按时序拉低,不然出错;SRT=0;IO=1;//必须释放总线;return temp;}void write_DS1302(uchar add,uchar date)//写DS1302子程序;{uchar dat1,i,dat2,j;SRT=0;SCK=0;IO=0;SRT=1;_nop_();for(i=0;i;>;1;IO=dat1;SCK=1;_nop_();}for(j=0;j;>;1;IO=dat2;SCK=1;_nop_();}SCK=0;SRT=0;IO=1;}void delay(uint n) {while(n--);}void display(){uchar miao1,miao2,fen1,fen2,shi1,shi2; P0=0xff;P1=0x00;miao1=miao&0x0f;miao2=miao&0xf0;miao2=miao2>;>;4;fen1=fen&0x0f;fen2=fen&0xf0;fen2=fen2>;>;4;shi1=shi&0x0f;shi2=shi&0xf0;shi2=shi2>;>;4;P1=table[miao1];P0=0x7f;delay(200);P1=table[miao2];P0=0xbf;delay(200);P1=0x40;P0=0xdf;delay(200);P1=table[fen1];P0=0xef;delay(200);P1=table[fen2];P0=0xf7;delay(200);P1=0x40;P0=0xfb;delay(200);P1=table[shi1];P0=0xfd;delay(200);P1=table[shi2];P0=0xfe;delay(200);}void main(){//设置日期时间(2013/09/11,21:03:00,星期3);while(1){miao=read_DS1302(0x81);fen=read_DS1302(0x83);shi=read_DS1302(0x85);tian=read_DS1302(0x87);yue=read_DS1302(0x89);zhou=read_DS1302(0x8b);nian=read_DS1302(0x8d);//读取DS18B20数据; P2=miao;display();}}。
DS1302写入和读取Word版
#include"ds1302.h"//---DS1302写入和读取时分秒的地址命令---////---秒分时日月周年最低位读写位;-------//uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。
---////---存储顺序是秒分时日月周年,存储格式是用BCD码---//uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};/****************************************************************************** ** 函数名: Ds1302Write* 函数功能: 向DS1302命令(地址+数据)* 输入: addr,dat* 输出: 无******************************************************************************* /void Ds1302Write(uchar addr, uchar dat){uchar n;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。
_nop_();RST = 1; //然后将RST(CE)置高电平。
_nop_();for (n=0; n<8; n++)//开始传送八位地址命令{DSIO = addr & 0x01;//数据从低位开始传送addr >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();}for (n=0; n<8; n++)//写入8位数据{DSIO = dat & 0x01;dat >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();}RST = 0;//传送数据结束_nop_();}/****************************************************************************** ** 函数名: Ds1302Read* 函数功能: 读取一个地址的数据* 输入: addr* 输出: dat******************************************************************************* /uchar Ds1302Read(uchar addr){uchar n,dat,dat1;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。
msp430f149中文[最新]
msp430f149中文[最新] MSP430F149中文========================================第1页========================================MSP430单片机的开发及应用MSP430000263# 7100612003年7月西安邮电学院63# 710061陈小忠12004.9.6开始看,其实以前看过,忘记了。
再看~========================================第2页========================================MSP430单片机的开发及应用目录第一章概述第二章MSP430 F149语言介绍第一节开发环境及程序下载第二节语言介绍第三章MSP430F149资源的应用介绍及开发第一节中断介绍及存储器段介绍第二节硬件乘法器第三节P口第四节定时器及数模转换第五节时钟模块第六节USART 通信模块第七节比较器第八节模数转换第四章MSP430F149 开发板的介绍及测试第一节模数转换模块第二节传感器模块第三节外存和实时时钟模块第四节485和232模块第五节电源管理模块及晶振模块第六节PWM波形滤波西安邮电学院63# 710061 陈小忠2========================================第3页======================================== MSP430单片机的开发及应用MSP430是德州公司新开发的一类具有 16位总线的带FLASH的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐.它采用16位的总线,外设和内存统一编址 ,寻址范围可达 64K,还可以外扩展存储器 .具有统一的中断管理 ,具有丰富的片上外围模块 , 片内有精密硬件乘法器、两个16位定时器、一个 14路的12位的模数转换器、一个看门狗、6路P口、两路USART通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M的时钟.由于为FLASH型,则可以在线对单片机进行调试和下载,且JTAG口直接和 FET(FLASH EMULATION TOOL) 的相连,不须另外的仿真工具 ,方便实用 ,而且,可以在超低功耗模式下工作,对环境和人体的辐射小,测量结果为 100mw左右的功耗(电流为14mA左右),可靠性能好,加强电干扰运行不受影响,适应工业级的运行环境,适合与做手柄之类的自动控制的设备.我们相信MSP430单片机将会在工程技术应用中得以广泛应用 , 而且,它是通向DSP系列的桥梁,随着自动控制的高速化和低功耗化,MSP430系列将会得到越来越多人的喜爱.通过两过多月的毕业设计 ,我对MSP430有了初步了解,对内部的硬件资源和自身的汇编语法进行了实验,并开发了一个应用板 ,并进行了调试.鉴于时间和能力有限,没能对所有的应用一一实验.MSP430 F149MSP430是德州公司的新产品 ,有独特的开发环境和自身语言 ,下面是我在毕业设计中对 F149的开发环境熟悉中遇到的一些问题的处理和汇编语言的用法及程序中遇到的问题的体会 .1.开发环境:在EW23环境下进行编程 ,汇编,连接,在C—SPY环境下进行调试 ,下载是在连接之后,调试之前,通过计算机的串口下载的.关于环境的操作 ,可以参考有关资料 , 其中可能遇到的问题及解决方法有:西安邮电学院63# 710061 陈小忠3========================================第4页======================================== MSP430单片机的开发及应用(1) .汇编是对源程序而言的 ,因此必须打开一个源文件才能汇编 ,而连接是对一个工程文件而言的,连接是对工程文件的所有源代码 (包括多个源文件)和数据的定位,因此连接必须打开一个工程文件才能连接.(2)连接中必须将库文件的路径改正确,且必须选定 C—SPY 的驱动方式 ,即在project 中的options 的xlink的include 下修改 (先选中 )xcl的库路径为$TOOLKIT_DIR$\icc430\msp430F149A.xcl , 选择C—SPY 的驱动 drive为simulator 或FLASH EMULATION TOOL ,当没连接430片子时可以选 simulator, 当连接430片子时,选FLASHEMULATION TOOL 进行在线下载调试 . (3)由于430支持汇编语言和 C语言两种语言 ,因此可以在一个工程文件中同时用两种语言 ,但建议用汇编语言 ,因为便于在调试时寻找逻辑和指令的联系及地址的定位正确与否.(4)在在线的C—SPY的调试中 ,单步需要将 Control 的Reatime 前的勾取消才能进行单步测试.(5)在线调试时 ,不能将58管脚(复位 /非屏蔽中断)外部变高 ,否则,会强制退出调试环境.2.程序下载原理及脱机工作原理:程序的在线调试是通过JATG口和F149片子的RST、TCK、TDI、TDO、TMS引脚按一定的时序串行的传递程序代码和数据的,调试指令的命令传递都是通过这些数据线和控制线传递的 , 下载时序可参见资料 1,其中的地址0FFFEH为复位向量的地址,它是程序遇到非屏蔽中断和程序启动的首要地址,地址中存放的是程序段开始的首地址 ,因此必须把程序段的首地址标号表示在中断向量中或程序伪指令的开头位置,否则,连接时将会出错 ,具体的表示方法在下一节中表示.程序的下载和在线调试的电源是通过计算机在JATG提供的,不须另外给加电源 .脱机工作时 ,是将F149的电源线上电 ,此时的复位时序同下载后在线复位的时序一样,只是时钟是通过 F149内部时钟 DCO提供的,上电后,程序将复位向量 0FFFE 中的地址装入 PC,PC开始从程序段的首地址开始执行.脱机工作启动不需要任何操作,只需上电即可 ,电压要大于 1.8v,一般取3v左右,另外,在脱机工作时 ,可以给RST端口加一个低电平脉冲以复位从程序开始重新执行.西安邮电学院63# 710061 陈小忠4========================================第5页======================================== MSP430单片机的开发及应用MSP430有自身语言,汇编语言也不同于其他类型的单片机 ,伪指令也是变幻魔测,但又很重要,下面是我毕业设计的一些尝试、出问题的地方 .也可参见资料。
DS1302时钟芯片读写详解
DS1302时钟芯片读写详解DS1302时钟芯片读写详解2008-09-26 13:07/*DS1302读写程序(C51)*/sbit DS13CLK =P1^5; /*DS1302的SCLK脚脉冲*/ sbit DS13IO =P1^6; /*DS1302的IO脚数据*/ sbit DS13CS =P1^7; /*DS1302的RST脚片选*/ /*向DS1302写一个字节*/void _wds13byte(uchar _code){uchar i;DS13CLK =0;DS13CLK =0;for(i=0;i<8;i++){if(_code&0x01) DS13IO =1;else DS13IO =0;DS13CLK =1;DS13CLK =1;DS13CLK =0;DS13CLK =0;_code =_code >> 1;}}/*从DS1302读一个字节*/uchar _rds13byte(void){uchar i,_code;_code=0;DS13CLK =0;DS13CLK =0;DS13IO =1;for(i=0;i<8;i++){_code =_code >>1;if(DS13IO) _code =_code|0x80;DS13CLK =1;DS13CLK =1;DS13CLK =0;DS13CLK =0;}return _code;}/*读功能 _code读功能命令 */uchar readds1302(uchar _code){DS13CS =0; /*关闭DS1302*/DS13CLK =0;DS13CLK =0;DS13CS =1; /*使能DS1302*/_wds13byte(_code); /*读代码*/_code=_rds13byte(); /*返回读取数字*/ DS13CLK =1;DS13CS =0; /*关闭DS1302*/ return _code;}/*写功能 fp写的地址,_code写的内容*/ void writeds1302(uchar fp,uchar _code) {DS13CS =0; /*关闭DS1302*/DS13CLK =0;DS13CLK =0;DS13CS =1; /*使能DS1302*/_wds13byte(fp); /*写控制命令*/_wds13byte(_code); /*写入数据*/DS13CLK=1;DS13CS =0; /*关闭DS1302*/}/*******DS1302设置快速充电***************/void ds13_charg(void){writeds1302(0x8e,0x00); /*解除写保护*/writeds1302(0x90,0xa5); /*单二极管2K电阻充电*/writeds1302(0x8e,0x80); /*置位写保护*/};;;DS1302读写程序(汇编);;;;************************************************************** *******/T_CLK Bit P1.5 ;实时时钟时钟线引脚T_IO Bit P1.6 ;实时时钟数据线引脚T_RST Bit P1.7 ;实时时钟复位线引脚;**********************************************************;子程序名:Set1302;功能:设置DS1302 初始时间,并启动计时。
ds1302读秒程序
uchar sec,n,n10;
sbit CLK =P3^5;
sbit IO =P3^6;
sbit RST =P3^7;
int qw,bw,sw,gw,a,b,c,i,k,j;
b=12;
void delay()//延时程序
{uchar j;
for(j=250;j>0;j--);
{
wr_com(0x8b);
n10=read1302(0x85);
n=read1302(0x85)&0x0f;//时
n10=n10>>4;
wr_data(n10+48);//注意是映射码,液晶中是写入的内部规定的映射表
wr_data(n+48);
display(":");
n10=read1302(0x83);//分
{
uchar i;
for(i=8;i>0;i--)
{
IO=(bit)(ucda&0x01);
CLK=1;
CLK=0;
ucda>>=1;
}
}
//--------------ReadOneByteData-----------------/
uchar ReadByte(void)
{
uchar i,a;
for(i=8;i>0;i--)
}
del() /*延时0.2秒*/
{
unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
MPS430F149单片机之_实时时钟芯片DS1302的设计与应用
SCLK_LO();
CE_Enable();
//0xff:时钟多字节读命令
WriteByte(0xff);
//31Byte 寄存器数据
for (i = 31; i > 0; i--)
{
CE_Enable();
//0xbe:时钟多字节写命令
WriteByte(0xbe);
//8Byte = 7Byte 时钟数据 + 1Byte 控制
for (i = 8; i > 0; i--)
{
//写1Byte数据
WriteByte(*pClock);
//0xbf:时钟多字节读命令
WriteByte(0xbf);
for (i = 8; i > 0; i--)
{
//读1Byte数据
*pClock = ReadByte();
pClock++;
void WriteByte(char nVal);
char ReadByte(void);
void WriteTo1302(char nAddr, char nVal);
char ReadFrom1302(char nAddr);
void BurstWriteTime(char *pWClock);
_NOP();
for(i = 0; i < 8; i++)
{
nSend = (nTemp & 0x01);
if(nSend == 1)
{
P1OUT |= SDA;
}
else
超详细的ds1302使用说明及其例程
图1 DS1302的外部引脚分配
图2 DS1302的内部结构 各引脚的功能为:
Vcc1:主电源;Vcc2:备份电源。当 Vcc2>Vcc1+0.2V 时, 由 Vcc2向 DS1302供电,当 Vcc2< Vcc1时,由 Vcc1向 DS1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出; I/O:三线接口时的双向数据线; CE:输入信号,在读、写数据期间,必须为高。该引脚有两 个功能:第一,CE 开始控制字访问移位寄存器的控制逻辑;其次,
在很多单片机系统中都要求带有实时时钟电路,如最常见的数字钟、钟控设备、数据记 录仪表,这些仪表往往需要采集带时标的数据,同时一般它们也会有一些需要保存起来的重 要数据,有了这些数据,便于用户后期对数据进行观察、分析。本小节就介绍市面上常见的 时钟芯片 DS1302的应用。DS1302是美国 DALLAS 公司推出的一款高性能、低功耗、带内 部 RAM 的实时时钟芯片(RTC),也就是一种能够为单片机系统提供日期和时间的芯片。通 过本小节的学习,我们将会把 RTC 相关的一些技术粗略介绍一下,然后介绍 DS1302与单片 机之间的软硬件应用。
图1 51单片机综合学习系统主机部分图片
图2 51单片机综合学习系统配套书本教程——《单片机快速入门》
上图是我们将要使用的51单片机综合学习系统硬件平台,如图1所示,本期实验我们用 到了综合系统主机、板载的 DS1302时钟芯片,综合系统其它功能模块原理与使用详见前几 期《电子制作》杂志及后期连载教程介绍。
MSP430F149串口与电脑发送接收通信
TXBUF1 = RXBUF1; // RXBUF1 to TXBUF1
}
void delay(unsigned long DELAY)
UCTL1 |= CHAR; // 8-bit character
UTCTL1 |= SSEL0; // UCLK = ACLK
UBR01 = 0x03; // 32k/9600 - 3.41
UBR11 = 0x00; //
UMCTL1 = 0x4A; // Modulation
UCTL1 &= ~SWRST; // Initialize USART state machine
{
unsigned long i;
for(i=DELAY;i>0;i--);
}
实现通信当单片机接收到什么字符后它会自动把接收的字符发送个电脑
MSP430F149串口与电脑发送接收通信
使用MSP430F149芯片,透过串口与电脑发送接收通信,波特率9600,8数据,无校验。使用32.768k晶振,使用P3.6和P3.7口作为发送和接收口,使用异步通信USART1,采用中断形式。实现通信,当单片机接收到什么字符后,它会自动把接收的字符发送个电脑。
//******************************************************************************
//程序正确验证,发送接收。
#include
void delay(unsigned long DELAY);
void main(void)
ds1302时钟程序详解,ds1302程序流程图(C程序)
ds1302时钟程序详解,ds1302程序流程图(C程序)ds1302时钟程序详解DS1302 的控制字如图2所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
ds1302程序流程图DS1302实时时间流程图4示出DS1302的实时时间流程。
根据此流程框图,不难采集实时时间。
下面结合流程图对DS1302的基本操作进行编程:根据本人在调试中遇到的问题,特作如下说明:DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6 =0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入),D0=1,指定读操作(输出)。
MSP430F149的串口RS232接口
MSP430F149的串口RS232接口1、概述具有同步串口模式(SPI),异步通信模式(UART)。
作异步通信时,P3.4,P3.5,P3.6,P3.7第二功能分别是UTXD0, URXD0, UTXD1, UTXD2 2、使用方法概述2.1 程序架构配置寄存器设置工作模式{设置IO口为第二功能作为串口收发引脚;使能串口收发功能;选择每帧数据位为7或8;选择波特率发生器时钟源;配置波特率(查表得出值再配置UxBR0, UxBR1,UxMCTL);软件清除串口复位位(SWRST);若采用中断方式则使能接受、发送中断}编写接受/发送程序,可采用查询方式或中断方式。
同51单片机不同的是,UTXIFG,URXIF 在发送下一个数据和读取数据时被自动清零了,无需软件清除。
2.2 细节描述配置波特率时用户手册上有速查表,如下设置波特率时要选择合适的时钟源。
对于较低的波特率(9600b/s及以下),可选ACLK,大于9600要选用SMCLK,因为串口波特率发生器分频系数要求大于3。
UxBR0(低)UxBR1(高)值的计算式为:选择的时钟源/波特率,再取整。
为了精确,MSP430设置了小数分频功能,通过UxMCTL来完成。
3、相关寄存器1.ME1, Module Enable Register 1UTXE0 Bit 7 USART0 transmit enable. This bit enables the transmitter for USART0.0 Module not enabled1 Module enabledURXE0 Bit 6 USART0 receive enable. This bit enables the receiver for USART0.0 Module not enabled1 Module enabled2.UxCTL(UCTLx), USART Control RegisterCHAR Bit 4 Character length. Selects 7-bit or 8-bit character length.0 7-bit data1 8-bit dataSWRST Bit 0 Software reset enable0 Disabled. USART reset released for operation1 Enabled. USART logic held in reset state3.UxTCTL(UTCTLx), USART Transmit Control RegisterSSELx Bits5-4Source select. These bits select the BRCLK source clock.00 UCLKI01 ACLK10 SMCLK11 SMCLK4.UxBR0, USART Baud Rate Control Register 0,低8位UxBR1, USART Baud Rate Control Register 1,高8位5. UxMCTL, USART Modulation Control RegisterUxMCTLx Bits7−0Modulation bits. These bits select the modulation for BRCLK.6.IFG1, Interrupt Flag Register 1UTXIFG0 Bit 7 USART0 transmit interrupt flag. UTXIFG0 is set when U0TXBUF is empty.0 No interrupt pending1 Interrupt pendingURXIFG0 Bit 6 USART0 receive interrupt flag. URXIFG0 is set when U0RXBUF has receiveda complete character.0 No interrupt pending1 Interrupt pending7.IE1, Interrupt Enable Register 1UTXIE0 Bit 7 USART0 transmit interrupt enable. This bit enables the UTXIFG0 interrupt.0 Interrupt not enabled1 Interrupt enabledURXIE0 Bit 6 USART0 receive interrupt enable. This bit enables the URXIFG0 interrupt.0 Interrupt not enabled1 Interrupt enabled4、实例4.1 配置为N.8.1,9600,查询方式收发数据/*******************************************函数名称:InitUART功能:初始化UART端口参数:无返回值:无********************************************/void InitUART(void){P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= URXE0 + UTXE0; // Enable USART0 T/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x03; // 32k/9600 - 3.41UBR10 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machine }收数据if(IFG1 & URXIFG0) Disp1Char(U0RXBUF); //如果收到字符发数据while (!(IFG1 & UTXIFG0)); TXBUF0 =Char;4.2 配置接收数据中断方式P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受UCTL0 |= CHAR; // 选择8位字符UTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x03; // 波特率9600UBR10 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // 初始化UART状态机IE1 |= URXIE0; // 使能USART0的接收中断_EINT();中断服务函数#pragma vector = UART0RX_VECTOR __interrupt void UART0_RXISR(void) { }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/********************************************************* 文件名称:* IIC.c* 文件说明:* 使用口线模拟IIC* 程序使用波特率为2400,程序运行时需要在pc机上使用一个串口* 接收发送程序,任意发送字符,接收的字符为十六进制时间数据* MSP-FET430P149 Demo - Basic Clock, MCLK Sourced from HF XTAL XT2* L.TCH* Feb 2007* Built with IAR Embedded Workbench Version: 3.10A*******************************************************//*********************************************************/#include <MSP430X14X.h>/********************************************************** 定义*********************************************************/#define RST BIT7#define SDA BIT6#define SCLK BIT5char pbuf[7];char clok[7]={0x16,0x15,0x14,0x13,0x12,0x04,0x07};char cbuf;char bbuf;char *pda;char *pck;char *prg;/************************************************说明************************************************/void Port_Init(void);void Init_CLK(void);void Init_UART0(void);void RST_Enable(void);void RST_Disable(void);void SCLK_HI(void);void SCLK_LO(void);void WriteByte(char nVal);char ReadByte(void);void WriteTo1302(char nAddr, char nVal);char ReadFrom1302(char nAddr);void BurstWriteTime(char *pWClock);void BurstReadTime(char *pRClock);void BurstWriteRam(char *pWReg);void BurstReadRam(char *pRReg);void SetTime(char *pClock);void GetTime(char pTime[]);/***********************************************/void Port_Init(void){P1DIR |= RST; //设置CE为输出管脚P1DIR |= RST; //设置SCLK为输出管脚P1DIR |= SCLK;P2DIR |= 0x02; // Set P2.1 to output directionreturn;}void Init_CLK(void){unsigned int i;BCSCTL1 = 0X00; //将寄存器的内容清零//XT2震荡器开启//LFTX1工作在低频模式//ACLK的分频因子为1do{IFG1 &= ~OFIFG; // 清除OSCFault标志for (i = 0xFF; i > 0; i--);}while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1BCSCTL1 &= ~(XT2OFF + XTS); //open XT2, LFTX2 select low frequency //BCSCTL1 |= RSEL0 + RSEL1 + RSEL2; //DCO Rsel=7(Freq=3200k/25摄氏度)//BCSCTL1 |= 0x07;BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1return;}void Init_UART0(void){U0CTL = 0X00; //将寄存器的内容清零UCTL0|=SWRST;P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL1; // UCLK = SMCLKUBR00 = 0xD3; // 3.58Mhz/2400 -1491UBR10 = 0x05; //UMCTL0 = 0x00; // no modulationUCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interruptIE1 &= ~UTXIE0; // Disable USART TX interrupt return;}void RST_Enable(void){P1OUT |= RST;return;}void RST_Disable(void){P1OUT &= ~(RST);return;}void SCLK_HI(void){P1OUT |= SCLK;return;}void SCLK_LO(void){P1OUT &= ~(SCLK);return;}/*-------------------------------* 功能: 写入1Byte数据* 调用:* 输入: nVal 写入的数据* 返回值: 无*------------------------------*/void WriteByte(char nVal){char i,j;char nTemp = nV al;char nSend;P1DIR |= SDA; //设置DATA为输出管脚_NOP();_NOP();_NOP();_NOP();for(i = 0; i < 8; i++) //发8位,从0位开始{nSend = (nTemp & 0x01);if(nSend == 1){P1OUT |= SDA;}else{P1OUT &= ~(SDA);}SCLK_HI();for(j = 10;j > 0;j--) ;SCLK_LO();for(j = 10;j > 0;j--) ;nTemp >>= 1; //从0位开始,发8位}return;}/*--------------------------------------* 功能: 读取1Byte数据* 调用:* 输入:* 返回值: nTemp*------------------------------------*/char ReadByte(void){char nTemp = 0;int i;int j;P1DIR &=~SDA; //设置DATA为输入管脚_NOP();_NOP();_NOP();_NOP();for(i = 0; i < 8; i++) //接受8位{SCLK_HI();for(j = 10;j > 0;j--);SCLK_LO();_NOP();_NOP();if(P1IN & SDA) //如果第i位是高电平置1{nTemp |= (0x01 << i);}for(j = 10;j > 0;j--);}return nTemp;}/*-----------------------------------------* 功能: 往DS1302写入1Byte数据* 调用:* 输入: nVal 写入的数据* 返回值: 无*------------------------------------------*/void WriteTo1302(char nAddr, char nVal){RST_Disable();SCLK_LO();RST_Enable();_NOP();_NOP();_NOP();_NOP();WriteByte(nAddr); //地址,命令WriteByte(nVal); //写1Byte数据SCLK_HI();RST_Disable();return;}/*-----------------------------------------* 功能: 从DS1302读取1Byte数据* 调用:* 输入:* 返回值: nDta*-----------------------------------------*/char ReadFrom1302(char nAddr){char nData;RST_Disable();SCLK_LO();RST_Enable();_NOP();_NOP();_NOP();_NOP();WriteByte(nAddr); //地址,命令nData = ReadByte(); //读1Byte数据SCLK_HI();RST_Disable();cbuf = nData; //return(nData);}/*-------------------------------------* 功能: 往DS1302写入时钟数据(多字节方式)* 调用:* 输入: pClock[]: 时钟数据地址格式为: 秒分时日月星期年控制* 8Byte (BCD码)* 返回值: 无*----------------------------------*/void BurstWriteTime(char *pClock){char i;WriteTo1302(0x8e,0x00); //控制命令,写操作.。
WP=0开写保护RST_Disable();SCLK_LO();RST_Enable();WriteByte(0xbe); //0xbe:时钟多字节写命令for (i = 8; i > 0; i--) //8Byte = 7Byte 时钟数据+ 1Byte 控制(即写保护){WriteByte(*pClock); //写1Byte数据pClock++;}SCLK_HI();RST_Disable();return;}/*-----------------------------------------* 功能: 读取DS1302时钟数据(多字节方式)* 调用:* 输入: pClock[]: 时钟数据地址格式为: 秒分时日月星期年控制* 8Byte (BCD码)* 返回值: ucDa :读取的数据*---------------------------------------*/void BurstReadTime(char *pClock){char i;RST_Disable();SCLK_LO();RST_Enable();WriteByte(0xbf); //0xbf:时钟多字节读命令for (i = 8; i > 0; i--){*pClock = ReadByte(); //读1Byte数据pClock++;}SCLK_HI();RST_Disable();return ;}/*-----------------------------------------* 功能: 往DS1302寄存器数写入数据(多字节方式)* 调用:* 输入: pReg: 寄存器数据地址* 返回值: 无*----------------------------------------*/void BurstWriteRam(char *pReg){char i;WriteTo1302(0x8e,0x00); //控制命令,WP=0,写操作RST_Disable();SCLK_LO();RST_Enable();WriteByte(0xfe); //0xfe:寄存器数据多字节写命令for (i = 31; i > 0; i--) //31Byte 寄存器数据{WriteByte(*pReg); //写1Byte数据pReg++;}SCLK_HI();RST_Disable();return;}/*------------------------------------------* 功能: 读取DS1302寄存器数据* 调用:* 输入: pReg: 寄存器数据地址* 返回值: 无*----------------------------------------*/void BurstReadRam(char *pReg){char i;RST_Disable();SCLK_LO();RST_Enable();WriteByte(0xff); //0xff:寄存器数据多字节读命令for (i = 31; i > 0; i--) //31Byte 寄存器数据{*pReg = ReadByte(); //读1Byte数据pReg++;}SCLK_HI();RST_Disable();return;}/*------------------------------------------* 功能: 设置初始时间(以单字节读写进行)* 调用:* 输入: pClock[]: 初始时间地址。