⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart4800.c

📁 使用MSP430F413的低功耗水表系统
💻 C
📖 第 1 页 / 共 2 页
字号:
//  MSP-FET430P410 Demo - Timer_A, UART 4800 Echo, DCO SMCLK
//  ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz
//
//                MSP430F413
//            -----------------
//        /|\|              XIN|-
//         | |                 | 32.768kHz
//         --|RST          XOUT|-
//           |                 |
//           |    P1.0/CCI0A/TX|--------->
//           |                 | 4800 8N1
//           |    P1.1/CCI0B/RX|<---------
//
/*功能描述:计算 bcc 并存入 RXTXBUF[num]中                       */
void checkbcc(unsigned char num)
{
    unsigned char i,bcc=0;
    bcc = 0;
    for(i=0;i<num;i++) bcc += RXTXBUF[i];
    RXTXBUF[num] = bcc&0x7f;
}
/************************************************************/
/*功能描述:发送N 个字节数据                                */
/*函数说明:                                                */
/*调用函数:delay(uint) TX_BYTE()                            */
/*全局变量: RXTXDATA RXTXBUF[0~14]                          */
/*输入: i 表示发送的数据长度                                */
/************************************************************/
void TX_NBYTE(unsigned char i)
{
 unsigned char j;
 delay_ms(38);//延时38ms
 P1DIR |= TXD;
 RXTXDATA=0;
 for(j=0;j<i;j++)
    {   
     RXTXDATA=RXTXBUF[j];
     TX_BYTE();
     _NOP();
    }
 P1DIR &=~TXD;
 CCTL0 =0;
}
/************************************************************/
/*功能描述:写time[0~2](ss:mm:hh)                           */
/*函数说明:                                                */
/*调用函数:checkbcc()    TX_NBYTE(uchar)                    */
/*全局变量: RXTXNUF[0~5]           addr                     */
/*输入:     RXTXBUF[7~9]                                    */
/************************************************************/
void write_time_res(unsigned char *p)
{
  unsigned char i;
  for(i=0;i<3;i++)
     {
      if(*p>0x59|(*p&0x0f)>9){return;}
      *p++;
     }
  p--;
  if(i==3&*p<0x24)
    {
     time[2]=*p--;
     time[1]=*p--;
     time[0]=*p;
     RXTXBUF[0]=0XE9; 
     RXTXBUF[1]=0X2C; 
     RXTXBUF[2]=0X04; 
     RXTXBUF[3]=addr; 
     RXTXBUF[5]=0XF0;
     checkbcc(4);
     TX_NBYTE(6);
    }
}
/************************************************************/
/*功能描述:写地址                                          */
/*函数说明:      要求写入的地址在2~6之间                  */
/*调用函数:checkbcc()    TX_NBYTE(uchar)
WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中              */
/*全局变量: RXTXBUF[0~5]         addr                       */
/*输入:     RXTXBUF[7]                                      */
/************************************************************/
void write_address_res(unsigned char *p)//写地址
{
  if(*p>1&*p<7)
  {
   addr=*p;
   WRNBYTE_I2C(PEG1,a_addr,&addr,1);
   RXTXBUF[0]=0XE9; 
   RXTXBUF[1]=0X28; 
   RXTXBUF[2]=0X04; 
   RXTXBUF[3]=addr; 
   RXTXBUF[5]=0XF0;
   checkbcc(4);
   TX_NBYTE(6);
  }
}
/************************************************************/
/*功能描述:写wt_who[0~6]                                   */
/*函数说明:       低位在前,高位在后                       */
/*调用函数:checkbcc() TX_NBYTE(uchar) LCD_OUT(uchar*) main.c中
           WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中   */
/*全局变量: wt_who[0~6]  RXTXBUF[0~5]    addr               */
/*输入:     RXTXBUF[7,8,9] 低位在前,高位在后               */
/************************************************************/
void write_data_res(unsigned char *p)//写数据
{
  unsigned char i;
  for(i=3;i<7;i++)
     {
      wt_who[i]=*p++;
     }
  for(i=0;i<3;i++)
     {
      wt_who[i]=0;
     }
    RDNBYTE_I2C(PEG1,addr_who,wt_who+4,4);//读整数+小数地址
    RDNBYTE_I2C(VAL_PEG,wt_who[7],wt_who,4);//读小数
  if(lcd_show==0x55)
  {
   LCD_OUT(wt_who);
  }
   RXTXBUF[0]=0XE9; 
   RXTXBUF[1]=0X22; 
   RXTXBUF[2]=0X04; 
   RXTXBUF[3]=addr; 
   RXTXBUF[5]=0XF0;
   checkbcc(4);
   TX_NBYTE(6);
}
/************************************************************/
/*功能描述:写constant[0~2]                                 */
/*函数说明:        低位在前,高位在后                      */
/*调用函数:checkbcc() TX_NBYTE(uchar) 
           WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中   */
/*全局变量: constant[0~2]   RXTXBUF[0~5]   addr             */
/*输入:RXTXBUF[7~9]=constant[0~2] RXTXBUF[10~12]=yymmdd[0~2]*/
/************************************************************/
void write_constant_res(unsigned char *p)
{
  unsigned char i;
  unsigned char yymmdd[3];
  for(i=0;i<3;i++)constant[i]=*p++;
  for(i=0;i<3;i++)yymmdd[i]=*p++;
  WRNBYTE_I2C(PEG1,constant_addr,constant,3);
  WRNBYTE_I2C(PEG1,yymmdd_addr,yymmdd,3);
  RXTXBUF[0]=0XE9;
  RXTXBUF[1]=0X29;
  RXTXBUF[2]=0X04; 
  RXTXBUF[3]=addr; 
  RXTXBUF[5]=0XF0;
  checkbcc(4);
  TX_NBYTE(6);
}
/************************************************************/
/*功能描述:写show_mode                                     */
/*函数说明:    0,1有效,其它数据无效                       */
/*调用函数:checkbcc() TX_NBYTE(uchar) LCD_OUT(uchar*) main.c中
           WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中   */
/*全局变量: show_mode  RXTXBUF[0~5]  wt_who[0~6]  addr      */
/*输入:     RXTXBUF[7]                                      */
/************************************************************/
void write_show_mode_res(unsigned char *p)
{
  if(*p<2)
  {
    show_mode=*p;
    WRNBYTE_I2C(PEG1,show_mode_addr,&show_mode,1); 
    RXTXBUF[0]=0XE9;
    RXTXBUF[1]=0X2A;
    RXTXBUF[2]=0X04; 
    RXTXBUF[3]=addr; 
    RXTXBUF[5]=0XF0;
    checkbcc(4);
    TX_NBYTE(6);
    LCD_OUT(wt_who);
  }
}
/************************************************************/
/*功能描述:写password[0~2]                                 */
/*函数说明:           低位在前,高位在后                   */
/*调用函数:checkbcc() TX_NBYTE(uchar)                       
           WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中   */
/*全局变量: password[0~2]      addr 表地址                  */
/*输入:     RXTXBUF[7,8,9] 低位在前,高位在后               */
/************************************************************/
void write_password_res(unsigned char *p)
{
  unsigned char i;
  for(i=0;i<3;i++)password[i]=*p++;
  WRNBYTE_I2C(PEG1,password_addr,password,3); 
  RXTXBUF[0]=0XE9;
  RXTXBUF[1]=0X21;
  RXTXBUF[2]=0X04; 
  RXTXBUF[3]=addr; 
  RXTXBUF[5]=0XF0;
  checkbcc(4);
  TX_NBYTE(6);
}
/************************************************************/
/*功能描述:写lcd_show                                      */
/*函数说明:0x55  开显示  0xaa 关显示                       */
/*调用函数:checkbcc() TX_NBYTE(uchar)                       
           WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中   */
/*全局变量: lcd_show       addr                             */
/*输入:     RXTXBUF[7]                                      */
/************************************************************/
void write_lcd_show_res(unsigned char *p)
{
  if(*p==0x55|*p==0xaa)
  {
    lcd_show=*p;
    WRNBYTE_I2C(PEG1,lcd_show_addr,&lcd_show,1); 
      if(lcd_show==0x55)
     {
         /*液晶初始化*/
       LCDCTL=LCDON+LCD4MUX+LCDP1;
       BTCTL  = BTFRFQ1;              
       P5SEL|=0XFC;
     }
     else
     {
      LCDCTL=0;
      BTCTL=0;
      P5SEL=0;
     }
    RXTXBUF[0]=0XE9;
    RXTXBUF[1]=0X2F;
    RXTXBUF[2]=0X04; 
    RXTXBUF[3]=addr; 
    RXTXBUF[5]=0XF0;
    checkbcc(4);
    TX_NBYTE(6);
  }
}
/*************************************************************/
/*功能描述:写uart_mode                                      */
/*函数说明:main中 uart_mode=0x55 水量每增加10L,发送一次数据*/
/*调用函数: checkbcc() TX_NBYTE(uchar)                       
            WRNBYTE_I2C(uchar,uchar*,uchar) 程序在i2c.c 中   */
/*全局变量: uart_mode 0x55 or 0有效 其它数据无效   addr      */
/*输入:     RXTXBUF[7]                                       */
/*************************************************************/
void write_uart_mode_res(unsigned char *p)
{
  if(*p==0x55|*p==0)
  {
    uart_mode=*p;
    WRNBYTE_I2C(PEG1,uart_mode_addr,&uart_mode,1); 
    RXTXBUF[0]=0XE9;
    RXTXBUF[1]=0X26;
    RXTXBUF[2]=0X05; 
    RXTXBUF[3]=addr; 
    RXTXBUF[5]=0XF0;
    checkbcc(4);
    TX_NBYTE(6);
   }
}
/*************************************************************/
/*功能描述:向TCB发送time                                    */
/*函数说明:  time[0~2] ss:mm:hh                             */
/*调用函数: checkbcc() TX_NBYTE(uchar)                       */
/*全局变量: RXTXBUF[0~8]  time[0~2]        addr表地址        */
/*输入:                                                      */
/*************************************************************/
void read_time_res(void)
{ 
 RXTXBUF[0]=0XE9;
 RXTXBUF[1]=0X3C;
 RXTXBUF[2]=0X07;
 RXTXBUF[3]=addr;
 RXTXBUF[4]=time[0];
 RXTXBUF[5]=time[1];
 RXTXBUF[6]=time[2];
 checkbcc(7);
 RXTXBUF[8]=0XF0;
 TX_NBYTE(9);
}
/*************************************************************/
/*功能描述:向TCB发送addr                                    */
/*函数说明:                                                 */
/*调用函数: checkbcc() TX_NBYTE(uchar)                       */
/*全局变量: RXTXBUF[0~5]        addr表地址                   */
/*输入:                                                      */
/*************************************************************/
void read_address_res(void)
{ 
 RXTXBUF[0]=0XE9;
 RXTXBUF[1]=0X38;
 RXTXBUF[2]=0X04;
 RXTXBUF[3]=addr; 
 RXTXBUF[5]=0XF0;
 checkbcc(4);
 TX_NBYTE(6);
}
/*************************************************************/
/*功能描述:向TCB发送data                                    */
/*函数说明:data=12345.67m3 addr=5 0x12 0x34 0x56 
addr!=5 0x23,0x45,0x67  发送时低位在前,高位在后             */
/*调用函数: checkbcc() TX_NBYTE(uchar)                       */
/*全局变量: RXTXBUF[0~10]    addr表地址  wt_who              */
/*输入:                                                      */
/*************************************************************/
void read_data_res(void)
{
  RXTXBUF[0]=0XC0;
  RXTXBUF[1]=0X22;
  RXTXBUF[2]=0X69;
  RXTXBUF[3]=0X6E;
  RXTXBUF[4]=0x73;
  RXTXBUF[5]=addr;
  if(addr==0x05)
  {
   RXTXBUF[8]=wt_who[3];
   RXTXBUF[7]=wt_who[4];
   RXTXBUF[6]=wt_who[5];
  }
  else
  {
   RXTXBUF[8]=(wt_who[3]>>4)+(wt_who[4]<<4);
   RXTXBUF[7]=(wt_who[4]>>4)+(wt_who[5]<<4);
   RXTXBUF[6]=(wt_who[5]>>4)+(wt_who[6]<<4);
  }
  RXTXBUF[10]=0xD0;
  checkbcc(9);
  TX_NBYTE(11);
}
/*******************************************************************/
/*功能描述:向TCB发送constant以及写constant 的时间                 */
/*函数说明:低位在前,高位在后                                     */
/*调用函数: checkbcc() TX_NBYTE(uchar) RDNBYTE_I2C(addr,uchar*,sum)*/
/*全局变量: RXTXBUF[0~10]    addr表地址  constant[0~2]             */
/*输入:                                                            */
/*******************************************************************/
void read_constant_res(void)
{
unsigned char yymmdd[3];
RDNBYTE_I2C(PEG1,yymmdd_addr,yymmdd,3); 
RXTXBUF[0]=0XE9; 
RXTXBUF[1]=0X39; 
RXTXBUF[2]=0X0A; 
RXTXBUF[3]=addr; 
RXTXBUF[4]=constant[0];
RXTXBUF[5]=constant[1];
RXTXBUF[6]=constant[2];
RXTXBUF[7]=yymmdd[0];
RXTXBUF[8]=yymmdd[1];
RXTXBUF[9]=yymmdd[2];
RXTXBUF[11]=0XF0;
checkbcc(10);
TX_NBYTE(12);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -