一、任務 采用MSP-EXP430G2553試驗板設計并制作一臺自動打鈴系統。要求完成的作品必須固化軟件,測試檢查時上電即可工作,采用串口與上位機進行通信來實現人機交互。 二、要求 1.基本要求 (1)基本計時、溫度測量和顯示功能(用12小時制顯示)。 包括上下午標志,時、分、秒的數字顯示,秒信號指示,XX.X℃。 (2)能設置當前時間(含上、下午,時,分,秒) (3)能實現基本打鈴功能,規定: 上午6:30起床鈴;打鈴5秒、停2秒、再打鈴5秒。 下午11:00熄燈鈴;打鈴5秒、停2秒、再打鈴5秒。 鈴聲可用LED燈光顯示,LED燈的亮滅以呼吸燈形式體現。 2.發揮部分 (1)增加整點報時功能,整點時響鈴5秒,要求有控制啟動和關閉功能。 (2)增加調整起床鈴、熄燈鈴時間的功能。 (3)增加調整打鈴時間長短和間歇時間長短的功能。 (4)增設上午4節課的上、下課打鈴功能,規定:8:00上課,8:50下課;8:55上課,9:45下課;10:00上課,10:50下課;10:55 上課,11:45下課;每次鈴聲5秒。 (5)利用板上按鍵做一個12小時/24小時的顯示格式切換。 (6)設置錯誤時間后會報錯。 (7)溫度到達30℃后報警。 (8)掉電保存上一次的時間信息,下次上電后自動從掉電前開始計時。
單片機源程序如下:
- /*
- automatic alarming system instructions
- 1 change time : " a/pm000000#";
- 2 change wake/sleep time: "*a/pm000000#";
- 3 change alarming/pause time: "&00#";
- 4 input "s#" start o'clock alarm;
- 5 input "c#" cancel o'clock alarm;
- 6 input "d#" am070000/pm113000 alarming
- 7 input "e#" am073000/pm120000 alarming
- 8 press P1^3 12/24h transform
- */
- #include <msp430g2553.h>
- #include"Flash.h"
- float temp;
- long IntDegC;
- unsigned int i;
- unsigned char time[8]={'a','m','0','0','0','0','0','0'};
- unsigned char buf[];
- unsigned char array[9];
- unsigned char bed[3];
- unsigned char Temp[4];
- unsigned char data,sum;
- unsigned char flag[]={"°C"};
- unsigned char flag_1[]={"Temperature:"};
- unsigned char flag_2[]={" Time:"};
- unsigned char flag_3,flag_4,flag_5,flag_6,flag_7,flag_8;
- unsigned char alarm[]={" TIME ERROR"};
- unsigned char alarm1[]={" TEMPERATURE ERROR"};
- void putchar(unsigned char c)
- {
- while(!(IFG2&UCA0TXIFG));
- UCA0TXBUF=c;
- }
- void putstr(unsigned char*s)
- {
- //IE2 &=~UCA0RXIE;
- while((*s)!='\0')
- {putchar(*s);s++;}
- //IE2 &|=UCA0RXIE;
- }
- void breath_light(void)
- {
- unsigned int static t,m,j;
- //unsigned int static j;
- WDTCTL = WDTPW | WDTHOLD;
- //unsigned const PWMPeriod=300;
- P1DIR|=BIT6;
- P1SEL|=BIT6;
- TA0CCR0=280;//set pwm period
- TA0CCTL1=OUTMOD_7;//set/reset mode
- TA0CTL=TASSEL_2+MC_1;//SMCLK/UP mode
- //TA0CCR0=600;
- if(flag_6) TA0CCR0=280*(bed[1]-48);
- for(j=0;j<=4;j++)
- {
- TA0CCR1=0;
- for(t=0;t<TA0CCR0;t++)
- {
- TA0CCR1=t;
- __delay_cycles(2000);
- }
- for(t=TA0CCR0;t>0;t--)
- {
- TA0CCR1=t;
- __delay_cycles(2000);
- }
- TA0CCR1=0;
- }
- TA0CCR1=0;
- if(flag_6)
- {m=(bed[2]-48);
- for(;m>0;m--)
- __delay_cycles(1000000);}
- else __delay_cycles(2000000);
- for(j=0;j<=4;j++)
- {
- TA0CCR1=0;
- for(t=0;t<TA0CCR0;t++)
- {
- TA0CCR1=t;
- __delay_cycles(2000);
- }
- for(t=TA0CCR0;t>0;t--)
- {
- TA0CCR1=t;
- __delay_cycles(2000);
- }
- TA0CCR1=0;
- }
- }
- void control_1(void)
- {
- unsigned int static t;
- unsigned int static j;
- unsigned const PWMPeriod=280;
- WDTCTL = WDTPW | WDTHOLD;
- P1DIR|=BIT6;
- P1SEL|=BIT6;
- TA0CCR0=PWMPeriod;//set pwm period
- TA0CCTL1=OUTMOD_7;//set/reset mode
- TA0CTL=TASSEL_2+MC_1;//SMCLK/UP mode
- for(j=0;j<=4;j++)
- {
- TA0CCR1=0;
- for(t=0;t<PWMPeriod;t++)
- {
- TA0CCR1=t;
- __delay_cycles(2000);
- }
- for(t=PWMPeriod;t>0;t--)
- {
- TA0CCR1=t;
- __delay_cycles(2000);
- }
- TA0CCR1=0;
- }
- }
- void IO_interrupt(void)
- {
- P1REN |= BIT3; //啟用P1.3內部上下拉電阻
- P1OUT |= BIT3; //將電阻設置為上拉
- //----配置P1.3中斷參數----
- P1DIR &= ~BIT3; //P1.3設為輸入(可省略)
- P1IES |= BIT3; //P1.3設為下降沿中斷
- P1IE |= BIT3; //允許P1.3中斷
- P1IFG&=~BIT3;
- }
- void TimerA1(void)
- {
- TA1CCTL0 = CCIE; // CCR0中斷使能
- TA1CCR0 = 65535;
- TA1CTL = TASSEL_2 + MC_3 + TACLR+ID_3; // ACLK, 增計數模式, 清除TAR計數器
- _enable_interrupts();
- // __bis_SR_register(LPM0_bits+GIE);
- }
- void USCI_A0_init(void)
- {
- BCSCTL1 = CALBC1_1MHZ;
- DCOCTL = CALDCO_1MHZ;
- P1SEL |=BIT1+BIT2;
- P1SEL2 |=BIT1+BIT2;
- UCA0CTL1 |=UCSSEL_2;
- UCA0MCTL = UCBRS_0;
- UCA0BR0=104;
- UCA0BR1=0;
- UCA0CTL1 &= ~UCSWRST;
- IE2 |=UCA0RXIE;
- //__bis_SR_register(LPM0_bits+GIE);
- }
- void ADC10_init(void)
- {
- ADC10CTL0 &= ~ENC;
- ADC10CTL0 = ADC10ON + REFON + ADC10SHT_3 + SREF_1;
- ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3+SHS_0 + INCH_10;
- __delay_cycles(3000);
- ADC10CTL0 |= ENC;
- }
- void send_temp(void)
- {
- static unsigned int z;
- ADC10CTL0|=ENC+ADC10SC;
- while((ADC10CTL0 & ADC10IFG)==0);
- temp=ADC10MEM;
- // IntDegC=((temp*(1.5)/1023)-0.986)/0.00355;
- IntDegC=temp*4225/1024-2777;
- while(!(IFG2 & UCA0TXIFG));
- putstr(flag_1);
- __delay_cycles(1000);
- UCA0TXBUF =IntDegC/100+48;
- __delay_cycles(1000);
- UCA0TXBUF =(IntDegC%100)/10+48;
- __delay_cycles(1000);
- UCA0TXBUF =46;
- __delay_cycles(1000);
- UCA0TXBUF =(IntDegC%100)%10+48;
- __delay_cycles(1000);
- putstr(flag);
- if (flag_8) z=((Temp[1]-48)*100)+((Temp[2]-48)*10)+(Temp[3]-48);else z=260;
- if(IntDegC>=z) putstr(alarm1);
- }
- int main(void)
- {
- static int c=0;
- WDTCTL = WDTPW | WDTHOLD;// Stop watchdog timer
- Flash_Init();
- P1DIR|=BIT0;
- IO_interrupt();
- ADC10_init();
- USCI_A0_init();
- TimerA1();
- for(c=0;c<8;c++)
- {
- time[c]=FlashRead_Char(SegD+c);
- }
- while(1)
- {
- if(flag_3){ breath_light();flag_3=0;}//5 2 5
- if(flag_4){ control_1();flag_4=0;}//5
- if(flag_5){ control_1();flag_5=0;}//5
- }
- }
- #pragma vector=TIMER1_A0_VECTOR// TA1中斷服務程序
- __interrupt void TIMER1_A0_ISR(void)
- {
- static int c=0;
- P1OUT^=BIT0;
- send_temp();
- putstr(flag_2);
- putchar(time[0]);
- putchar(time[1]);
- putchar(time[2]);
- putchar(time[3]);
- putchar(58);
- putchar(time[4]);
- putchar(time[5]);
- putchar(58);
- putchar(time[6]);
- putchar(time[7]++);
- if(flag_7){putstr(alarm);flag_7=0;} // forecast error
- for(c=0;c<8;c++)
- {
- FlashErase_Seg(SegD+c);
- }
- for(c=0;c<8;c++)
- {
- FlashWrite_Char(SegD+c,time[c]);
- }
- c=0;
- if(time[7]==':'){time[7]='0';time[6]++;}
- if(time[6]=='6'){time[6]='0';time[5]++;}
- if(time[5]==':'){time[5]='0';time[4]++;}
- if(time[4]=='6'){time[4]='0';time[3]++;}
- if(time[3]==':'){time[3]='0';time[2]++;}
- if((time[2]=='1')&&(time[3]=='2')&&(time[4]=='0')&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0'))
- {if( time[0]=='a') time[0]='p';
- else time[0]='a';
- }
- if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='4')&&(time[4]=='0')&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0')) {time[2]='0';time[3]='0';time[0]='a';}
- if((time[2]=='1')&&(time[3]=='3')&&(time[4]=='0')&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0')) { time[2]='0';time[3]='1';}//12 h
- if(sum=='1')//P1^3 12/24h transform
- {
- if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='4')) {time[2]='0';time[3]='0';time[0]='a';}sum=0;
- if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='3')) {time[2]='1';time[3]='1';}sum=0;
- if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='2')) {time[2]='1';time[3]='0';}sum=0;
- if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='1')) {time[2]='0';time[3]='9';}sum=0;
- if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='0')) {time[2]='0';time[3]='8';}sum=0;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='9')) {time[2]='0';time[3]='7';}sum=0;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='8')) {time[2]='0';time[3]='6';}sum=0;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='7')) {time[2]='0';time[3]='5';}sum=0;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='6')) {time[2]='0';time[3]='4';}sum=0;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='5')) {time[2]='0';time[3]='3';}sum=0;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='4')) {time[2]='0';time[3]='2';}sum=0;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='3')) {time[2]='0';time[3]='1';}sum=0;
- }
- if(sum=='2')
- {
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='1')) {time[2]='2';time[3]='3';}sum=0;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='0')) {time[2]='2';time[3]='2';}sum=0;
- if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='9')) {time[2]='2';time[3]='1';}sum=0;
- if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='8')) {time[2]='2';time[3]='0';}sum=0;
- if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='7')) {time[2]='1';time[3]='9';}sum=0;
- if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='6')) {time[2]='1';time[3]='8';}sum=0;
- if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='5')) {time[2]='1';time[3]='7';}sum=0;
- if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='4')) {time[2]='1';time[3]='6';}sum=0;
- if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='3')) {time[2]='1';time[3]='5';}sum=0;
- if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='2')) {time[2]='1';time[3]='4';}sum=0;
- if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='1')) {time[2]='1';time[3]='3';}sum=0;
- }
- // begin/end class alarm
- if((time[0]=='a')&&(time[2]=='0')&&(time[3]=='8')&&((time[4]=='0')||(time[4]=='5'))&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0')){ flag_5=1;}
- if((time[0]=='a')&&(time[2]=='1')&&(time[3]=='0')&&((time[4]=='0')||(time[4]=='5'))&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0')){ flag_5=1;}
- if((time[0]=='a')&&(time[2]=='0')&&(time[3]=='8')&&(time[4]=='5')&&(time[5]=='5')&&(time[6]=='0')&&(time[7]=='0'))flag_5=1;
- if((time[0]=='a')&&(time[2]=='1')&&(time[3]=='0')&&(time[4]=='5')&&(time[5]=='5')&&(time[6]=='0')&&(time[7]=='0'))flag_5=1;
- if((time[0]=='a')&&(time[2]=='0')&&(time[3]=='9')&&(time[4]=='4')&&(time[5]=='5')&&(time[6]=='0')&&(time[7]=='0'))flag_5=1;
- if((time[0]=='a')&&(time[2]=='1')&&(time[3]=='1')&&(time[4]=='4')&&(time[5]=='5')&&(time[6]=='0')&&(time[7]=='0'))flag_5=1;
- if(data=='s')//start o'clock alrm
- {
- if((time[2]<='2')&&(time[3]>='0')&&(time[4]=='0')&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0')) flag_4=1;
- }
- if(data=='c') flag_4=0;//cancel o'clock alrm
- if((time[0]==array[1])&&(time[1]==array[2])&&(time[2]==array[3])&&(time[3]==array[4])&&(time[4]==array[5])&&
- (time[5]==array[6])&&(time[6]==array[7])&&(time[7]==array[8])){ flag_3=1;data='z';}
- if((data!='d')&&(data!='e')&&(data!='z'))
- {
- if((time[0]=='a')&&(time[2]=='0')&&(time[3]=='6')&&(time[4]=='3')&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0')) flag_3=1;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='1')&&(time[4]=='0')&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0')) flag_3=1;
- }
- if(data=='d')
- {
- if((time[0]=='a')&&(time[2]=='0')&&(time[3]=='7')&&(time[4]=='0')&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0')) flag_3=1;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='1')&&(time[4]=='3')&&(time[5]=='0')&&(time[4]=='0')&&(time[5]=='0')) flag_3=1;
- }
- if(data=='e')
- {
- if((time[0]=='a')&&(time[2]=='0')&&(time[3]=='7')&&(time[4]=='3')&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0')) flag_3=1;
- if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='2')&&(time[4]=='0')&&(time[5]=='0')&&(time[4]=='0')&&(time[5]=='0')) flag_3=1;
- }
- }
- #pragma vector=USCIAB0RX_VECTOR//uart interrupt
- __interrupt void uart()
- {
- static int t=0;
- static int j=0;
- while(!(IFG2 & UCA0TXIFG));
- buf[t] = UCA0RXBUF;t++;
- if(buf[t-1]=='#')
- {
- if(t) t=0;
- switch(buf[0])
- {
- case's': data=buf[0];UCA0RXBUF=0;break;//開啟整點報時功能
- case'c': data=buf[0];UCA0RXBUF=0;break;//取消整點報時功能
- case'd': data=buf[0];UCA0RXBUF=0;break;//調整打鈴,起床時間
- case'e': data=buf[0];UCA0RXBUF=0;break;
- case'&': j=1;flag_6=1;
- while(buf[j]!='#')//adjust alarm time
- {bed[j] = buf[j] ;j++;}
- if(j==3)
- j=0;
- break;
- case'*':j=1;//adjust bed time
- while(buf[j]!='#')
- {array[j] = buf[j] ;j++;}
- if(j==9)
- j=0;
- break;
- case't':j=1;flag_8=1;//adjust temperature
- while(buf[j]!='#')
- {Temp[j] = buf[j] ;j++;}
- if(j==4)
- j=0;
- break;
- case'a'://adjust time
- if((buf[1]!='m')||(buf[2]>='2')||(buf[4]>='6')||(buf[6]>='6')||((buf[2]=='2')&&(buf[3]>='4'))) flag_7=1;
- else
- {flag_7=0;
- while(buf[j]!='#')
- {time[j] = buf[j] ;j++;}
- if(j==8)
- j=0;}
- break;
- case'p'://adjust time
- if((buf[1]!='m')||(buf[2]>='3')||(buf[4]>='6')||(buf[6]>='6')||((buf[2]=='2')&&(buf[3]>='4'))) flag_7=1;
- else
- {flag_7=0;
- while(buf[j]!='#')
- {time[j] = buf[j] ;j++;}
- if(j==8)
- j=0;}
- break;
- default:flag_7=1;break;
- }
- }}
- #pragma vector = PORT1_VECTOR//P1^3 interrupt
- __interrupt void PORT1_ISR(void)
- {
- static unsigned char m;
- if(P1IFG&BIT3)
- {
- __delay_cycles(1000000);
- if(P1IFG&BIT3)
- {m++;
- if(m%2==1)
- sum='1';//檢測通過,則會調用事件處理函數
- else sum='2'; //退出中斷前必須手動清除IO口中斷標志
- P1IFG = 0;
- }
- while(P1IFG&BIT3);
- }
- }
復制代碼
源碼下載:
msp430g2553打鈴系統.docx
(21.72 KB, 下載次數: 27)
2018-6-1 17:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|