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()
  • 相关阅读:
    adb连接夜神模拟器报错adb server version(36) doesn‘t match this client(41);killing...报错的问题
    python实现九九乘法表正三角和倒三角
    python之json格式的读写
    接口自动化get&post的封装
    2020-7-10-解决windows 10内存占用高问题
    2020-6-29-Python3-day1作业
    2020-6-29-Python3-指定解释器和字符编码
    2020-6-29-Python3-文件的操作
    2020-6-28-Python3-列表的操作
    2020-6-28-Python3-变量的命名规则
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2666938.html
Copyright © 2011-2022 走看看