嵌入式成长轨迹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()