嵌入式成长轨迹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()
原文地址:https://www.cnblogs.com/zeedmood/p/2666938.html