zoukankan      html  css  js  c++  java
  • 嵌入式成长轨迹53 【Zigbee项目】【CC2430基础实验】【串口时钟PC显示】


    void InitT1(void) ;
    函数原型:

     1 void InitT1(void) 
     2 { 
     3   T1CCTL0 = 0X44; 
     4   //T1CCTL0 (0xE5) 
     5   //T1 ch0  中断使能 
     6   // 比较模式 
     7  
     8   T1CC0H = 0x03; 
     9   T1CC0L = 0xe8; 
    10   //0x0400 = 1000D) 
    11  
    12   T1CTL |= 0X02; 
    13   //start count 
    14   // 在这里没有分频。 
    15   // 使用比较模式  MODE = 10(B) 
    16  
    17   IEN1 |= 0X02; 
    18   IEN0 |= 0X80; 
    19   // 开T1中断 
    20 } 


    函数功能:开T1中断,T1为比较计数模式。因 T1计数时钟为 0.25M (见 void InitClock(void)说明),T1CC0 = 0X03E8  = 1000,因此 250 次中断溢出为 1s 。
     
    void InitClock(void);
    函数原型:

    1 void InitClock(void) 
    2 { 
    3   CLKCON = 0X38; 
    4   //TICKSPD = 111  定时器计数时钟源 0.25M 
    5   while(!(SLEEP&0X40)); 
    6   // 等晶振稳定 
    7 } 


    函数功能:设置系统时钟为晶振,同时将计数器时钟设为0.25M 。晶振振荡稳定后退出函数。
     
    void InitUART0(void) ;
    函数原型:

     1 void InitUART0(void) 
     2 { 
     3  PERCFG = 0x00;   //位置1 P0 口 
     4  P0SEL = 0x3c;    //P0用作串口 
     5  U0CSR |= 0x80;    //UART方式 
     6  U0GCR |= 10;    //baud_e 
     7  U0BAUD |= 216;   //波特率设为57600 
     8   UTX0IF = 1; 
     9  
    10  U0CSR |= 0X40;    //允许接收 
    11  IEN0 |= 0x84;    //开总中断,接收中断 
    12 } 


    函数功能:串口0 映射位置 1,UART 方式,波特率57600,允许接收,开接收中断。
     
    void T1_ISR(void) ;
    函数原型:

     1 __interrupt void T1_ISR(void) 
     2  { 
     3         IRCON &= ~0x02;//清中断标志 
     4         counter++; 
     5         if(counter == 250) 
     6         { 
     7           counter = 0; 
     8           timetemp = 1;         // 一秒到 
     9           led1 = ~led1;         //  调试指示用 
    10         } 
    11  } 


    函数功能:T1中断服务程序,每 250 次中断将timetemp 置1,表示 1 秒时间到,同时改变 LED的状态。
     
    void UART0_ISR(void) ;
    函数原型:

    1 __interrupt void UART0_ISR(void) 
    2  { 
    3   URX0IF = 0;    // 清中断标志 
    4   temp = U0DBUF; 
    5  } 


    函数功能:从串口0 接收用于设置时间的字符。

     1 //clock.c
     2 /**************************
     3 T1用比较模式
     4 **************************/
     5 
     6 #include <ioCC2430.h>
     7 
     8 /**************************
     9 计数时钟 0.25M
    10 **************************/
    11 void InitClock(void)
    12 {
    13   CLKCON = 0X38;
    14   //TICKSPD = 111 定时器计数时钟源
    15   while(!(SLEEP&0X40));
    16   //等晶振稳定
    17 }
     1 //timer.c
     2 
     3 #include "ioCC2430.h"
     4 
     5 /****************************
     6 T1初始化
     7 ****************************/
     8 void InitT1(void)
     9 {
    10   T1CCTL0 = 0X44;
    11   //T1CCTL0 (0xE5)
    12   //T1 ch0 中断使能
    13   //比较模式
    14 
    15   T1CC0H = 0x03;
    16   T1CC0L = 0xe8;
    17   //0x03e8 = 1000D)
    18 
    19   T1CTL |= 0X02;
    20   //start count
    21   //在这里没有分频。
    22   //使用比较模式 MODE = 10(B)
    23 
    24   IEN1 |= 0X02;
    25   IEN0 |= 0X80;
    26   //开T1中断
    27 }
     1 //uart.c
     2 //初始化UART0
     3 
     4 # include "ioCC2430.h"
     5 
     6 /*****************************************
     7 *函数功能 :初始化串口                
     8 *入口参数 : 无                            
     9 *返 回 值 :无                            
    10 *说    明 :57600-n-8-0        
    11 *****************************************/
    12 void InitUART0(void)
    13 {
    14     PERCFG = 0x00;                //位置1 P0口
    15     P0SEL = 0x3c;                //P0用作串口
    16     
    17     U0CSR |= 0x80;                //UART方式
    18     U0GCR |= 10;                //baud_e
    19     U0BAUD |= 216;                //波特率设为57600
    20     UTX0IF = 1;
    21 
    22     U0CSR |= 0X40;                //允许接收
    23     IEN0 |= 0x84;                //开总中断,接收中断
    24 }
    25 
    26 /****************************************************************
    27 *函数功能 :串口发送字符串函数                                    
    28 *入口参数 : data:数据                    
    29 *        len :数据长度                                        
    30 *返 回 值 :无                                                    
    31 *说    明 :                            
    32 ****************************************************************/
    33 void UartTX_Send_String(char *Data,int len)
    34 {
    35   int j;
    36   for(j=0;j<len;j++)
    37   {
    38     U0DBUF = *Data++;
    39     while(UTX0IF == 0);
    40     UTX0IF = 0;
    41   }
    42 }
      1 //main.c
      2 /*****************************************
      3 //设置时间格式:#+00+00+00
      4 *****************************************/
      5 #include "ioCC2430.h"
      6 
      7 
      8 #define led1 P1_0
      9 #define gled P1_1
     10 
     11 char time[3]={23,59,55};        //时间初值
     12 char Recdata[9];                //串口接收到的数据
     13 char SendData[10]="00:00:00  "; //时间数据包
     14 char timetemp;                  //钞针
     15 char counter = 0;               //中断计数
     16 char temp;                      //用于读串口接收到的数
     17 char number = 0;                //
     18 char follow_second;             //时间跟随
     19 
     20 extern void UartTX_Send_String(char *data,int len);
     21 extern void InitClock(void);
     22 extern void InitT1(void);
     23 extern void InitUART0(void);
     24 
     25 /*****************************************
     26 *函数功能 :
     27 *入口参数 :    
     28 *返 回 值 :
     29 *说    明 :
     30 *****************************************/
     31 void InitIO(void)
     32 {
     33   P1DIR |= 0X03;
     34   P1_1 = 1;
     35   P1_0 = 1;
     36 }
     37 
     38  /****************************************************************
     39 *函数功能 :T1中断函数                    
     40 *入口参数 : 无                            
     41 *返 回 值 :无                            
     42 *说    明 :    
     43 ****************************************************************/
     44 #pragma vector = T1_VECTOR
     45  __interrupt void T1_ISR(void)
     46  {
     47         IRCON &= ~0x02;//清中断标志
     48         counter++;
     49         if(counter == 250)
     50         {
     51           counter = 0;
     52           timetemp = 1;         //一秒到
     53           led1 = ~led1;         // 调试指示用
     54         }
     55  }
     56 
     57 /****************************************************************
     58 *函数功能 :串口接收一个字符                    
     59 *入口参数 : 无                            
     60 *返 回 值 :无                            
     61 *说    明 :接收完成后打开接收                    
     62 ****************************************************************/
     63 #pragma vector = URX0_VECTOR
     64  __interrupt void UART0_ISR(void)
     65  {
     66      URX0IF = 0;                //清中断标志
     67     temp = U0DBUF;
     68  }
     69 /*****************************************
     70 主函数
     71 *****************************************/
     72  void main(void)
     73  {
     74    InitClock();
     75    InitT1();
     76    InitUART0();
     77    InitIO();
     78    UartTX_Send_String(SendData,8);
     79    do{
     80      if(timetemp == 1)   //if0
     81      {
     82        if(time[2]<59)   //second  //if1
     83        {
     84          time[2]++;
     85        }
     86        else
     87        {
     88          time[2] = 0;
     89          if(time[1]<59) //minute  //if2
     90          {
     91            time[1]++;
     92          }
     93          else
     94          {
     95            time[1] = 0;
     96            if(time[0]<23) //hour  //if3
     97            {
     98              time[0]++;
     99            }
    100            else
    101            {
    102              time[0] = 0;
    103            }                //end if3
    104          }                  //end if2
    105        }                    //end if1
    106      timetemp = 0;
    107      }//end if0
    108 
    109      if(temp != 0)
    110      {
    111        Recdata[number++]=temp;
    112        temp = 0;
    113      }
    114 /********上程序段用来计时,最小精度为秒*********************/
    115      if((Recdata[0] == '#')&&(number == 9))     //F0 为设时间的数据段首字节
    116      {
    117         time[2] = (Recdata[7]-48)*10+(Recdata[8]-48);;
    118         if(time[2]>59)time[2]=0;
    119 
    120         time[1] = (Recdata[4]-48)*10+(Recdata[5]-48);
    121         if(time[1]>59)time[1]=0;
    122 
    123         time[0] = (Recdata[1]-48)*10+(Recdata[2]-48);
    124         if(time[0]>23)time[0]=0;
    125 
    126         gled = !gled;                         //for test
    127         Recdata[0] = 0;
    128         number = 0;
    129      }
    130 
    131 /************************以上程序段用来处理PC命令***************************/
    132 
    133      if(follow_second != time[2])
    134      {
    135            SendData[7] = (char)(time[2])%10+48;
    136            SendData[6] = (char)(time[2])/10+48;
    137            SendData[4] = (char)(time[1])%10+48;
    138            SendData[3] = (char)(time[1])/10+48;
    139            SendData[1] = (char)(time[0])%10+48;
    140            SendData[0] = (char)(time[0])/10+48;
    141 /**************************以上程序将时间数据打包****************************/
    142            UartTX_Send_String(SendData,10);
    143            follow_second = time[2];
    144      }//end if
    145    }while(1);//end
    146  }//end main()
  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2666938.html
Copyright © 2011-2022 走看看