1、单片机MSP430F149DS1302读写及串口收发程序/* 文件名称:* 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 /* 定义*/#define RST BIT7#define
2、 SDA BIT6#define SCLK BIT5 char pbuf7; char clok7=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 Wr
3、iteByte(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); /*/
4、void Port_Init(void) P1DIR |= RST; /设置CE为输出管脚 P1DIR |= RST; /设置SCLK为输出管脚 P1DIR |= SCLK; P2DIR |= 0x02; / Set P2.1 to output direction return;void Init_CLK(void) unsigned int i; BCSCTL1 = 0X00; /将寄存器的内容清零 /XT2震荡器开启 /LFTX1工作在低频模式 /ACLK的分频因子为1 do IFG1 &= OFIFG; / 清除OSCFault标志 for (i = 0xFF; i 0; i-); w
5、hile (IFG1 & OFIFG) = OFIFG); / 如果OSCFault =1 BCSCTL1 &= (XT2OFF + XTS); /open XT2, LFTX2 select low frequency /BCSCTL1 |= RSEL0 + RSEL1 + RSEL2; /DCO Rsel=7(Freq=3200k/25摄氏度) /BCSCTL1 |= 0x07; BCSCTL2 += SELM1; /MCLK的时钟源为TX2CLK,分频因子为1 BCSCTL2 += SELS; /SMCLK的时钟源为TX2CLK,分频因子为1 return;void Init_UART0
6、(void) U0CTL = 0X00; /将寄存器的内容清零 UCTL0|=SWRST; P3SEL |= 0x30; / P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0 + URXE0; / Enable USART0 TXD/RXD UCTL0 |= CHAR; / 8-bit character UTCTL0 |= SSEL1; / UCLK = SMCLK UBR00 = 0xD3; / 3.58Mhz/2400 -1491 UBR10 = 0x05; / UMCTL0 = 0x00; / no modulation UCTL0 &= SWRST; / In
7、itialize USART state machine IE1 |= URXIE0; / Enable USART0 RX interrupt IE1 &= 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;/*-
8、* 功能: 写入1Byte数据* 调用:* 输入: nVal 写入的数据 * 返回值: 无*-*/void WriteByte(char nVal) char i,j; char nTemp = nVal; char nSend; P1DIR |= SDA; /设置DATA为输出管脚 _NOP(); _NOP(); _NOP(); _NOP(); for(i = 0; i 0;j-) ; SCLK_LO(); for(j = 10;j 0;j-) ; nTemp = 1; /从0位开始,发8位 return;/*-* 功能: 读取1Byte数据* 调用: * 输入: * 返回值: nTemp*
9、-*/char ReadByte(void) char nTemp = 0; int i; int j; P1DIR &=SDA; /设置DATA为输入管脚 _NOP(); _NOP(); _NOP(); _NOP(); for(i = 0; i 0;j-); SCLK_LO(); _NOP(); _NOP(); if(P1IN & SDA) /如果第i位是高电平置1 nTemp |= (0x01 0;j-); return nTemp; /*-* 功能: 往DS1302写入1Byte数据* 调用:* 输入: nVal 写入的数据 * 返回值: 无*-*/void WriteTo1302(ch
10、ar 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(); R
11、ST_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
12、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: 时钟
13、数据地址 格式为: 秒 分 时 日 月 星期 年 控制* 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寄存器数写入数据(多字
14、节方式)* 调用: * 输入: 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; /
15、*-* 功能: 读取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;/*-* 功能: 设置初始时间(以单字节读写进
16、行)* 调用: * 输入: pClock: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) * 返回值: 无*-*/void SetTime(char *pClock) /写时间寄存器,顺序是:(1)使寄存器可写,(2)写时间 (3)写保护 /以单个字节的形式进行读写 char i; char nAddr = 0x80; WriteTo1302(0x8e,0x00); /控制命令,WP=0,写操作(使时间寄存器可写) for(i = 7; i 0; i-) WriteTo1302(nAddr,*pClock); /秒 分 时 日 月 星期 年(从80
17、开始共写7个,每次地址2) pClock+; nAddr += 2; WriteTo1302(0x8e,0x80); /控制命令,WP=1,写保护? return;/*-* 功能: 读取DS1302当前时间(以单字节读写进行)* 调用: * 输入: pTime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) * 返回值: 无*-*/void GetTime(char pTime) /只读时间寄存器以单字节读写进行,连续7个 char i; char nAddr = 0x81; for (i = 0; i 7; i+) pTimei = Read
18、From1302(nAddr); /格式为: 秒 分 时 日 月 星期 年 nAddr += 2; return;/*-*接收中断*-*/#pragma vector=UART0RX_VECTOR /接收中断_interrupt void usart0_rx_tx (void)/* char i,t; for(t=0;t1;t+ ) /IFG1&=0XBF; /实际上是清URXIFG0,防止接收中断进入死循环 P2OUT = 0x02; / Toggle P2.1 using exclusive-OR while (!UTXIFG0); / USART0 tX buffer ready?)/GetTime(pbuf); /读1302时间/IE1 |= UTXIE0 ; /开发中断 for(i=0;i ? ( * ?
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2