久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3666|回復: 0
打印 上一主題 下一主題
收起左側

msp430 G2553自動打鈴系統設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:343004 發表于 2018-6-1 17:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、任務
    采用MSP-EXP430G2553試驗板設計并制作一臺自動打鈴系統。要求完成的作品必須固化軟件,測試檢查時上電即可工作,采用串口與上位機進行通信來實現人機交互。
二、要求
1.基本要求
      1)基本計時、溫度測量和顯示功能(用12小時制顯示)。
           包括上下午標志,時、分、秒的數字顯示,秒信號指示,XX.X℃。
      2)能設置當前時間(含上、下午,時,分,秒)
      3)能實現基本打鈴功能,規定:
          上午630起床鈴;打鈴5秒、停2秒、再打鈴5秒。
          下午11:00熄燈鈴;打鈴5秒、停2秒、再打鈴5秒。
    鈴聲可用LED燈光顯示,LED燈的亮滅以呼吸燈形式體現。
2.發揮部分
    1)增加整點報時功能,整點時響鈴5秒,要求有控制啟動和關閉功能。
    2)增加調整起床鈴、熄燈鈴時間的功能。
    3)增加調整打鈴時間長短和間歇時間長短的功能。
    4)增設上午4節課的上、下課打鈴功能,規定:8:00上課,850下課;855上課,945下課;10:00上課,1050下課;1055  上課,1145下課;每次鈴聲5秒。
5)利用板上按鍵做一個12小時/24小時的顯示格式切換。
6)設置錯誤時間后會報錯。
7)溫度到達30℃后報警。
8)掉電保存上一次的時間信息,下次上電后自動從掉電前開始計時。

單片機源程序如下:
  1. /*
  2. automatic alarming system instructions
  3. 1 change time : " a/pm000000#";
  4. 2 change wake/sleep time: "*a/pm000000#";
  5. 3 change alarming/pause time: "&00#";
  6. 4 input "s#"  start o'clock alarm;
  7. 5 input "c#"  cancel o'clock alarm;
  8. 6 input "d#"  am070000/pm113000 alarming
  9. 7 input "e#"  am073000/pm120000 alarming
  10. 8 press P1^3 12/24h transform
  11. */
  12. #include <msp430g2553.h>
  13. #include"Flash.h"
  14. float temp;
  15. long IntDegC;
  16. unsigned int i;
  17. unsigned char time[8]={'a','m','0','0','0','0','0','0'};
  18. unsigned char buf[];
  19. unsigned char array[9];
  20. unsigned char bed[3];
  21. unsigned char Temp[4];
  22. unsigned char data,sum;
  23. unsigned char flag[]={"°C"};
  24. unsigned char flag_1[]={"Temperature:"};
  25. unsigned char flag_2[]={"  Time:"};
  26. unsigned char flag_3,flag_4,flag_5,flag_6,flag_7,flag_8;
  27. unsigned char alarm[]={"  TIME ERROR"};
  28. unsigned char alarm1[]={"  TEMPERATURE ERROR"};
  29. void putchar(unsigned char c)
  30. {
  31.                 while(!(IFG2&UCA0TXIFG));
  32.                 UCA0TXBUF=c;
  33. }
  34. void putstr(unsigned char*s)
  35. {
  36.                 //IE2 &=~UCA0RXIE;
  37.                 while((*s)!='\0')
  38.                 {putchar(*s);s++;}
  39.                 //IE2 &|=UCA0RXIE;
  40. }
  41. void breath_light(void)
  42. {
  43.                 unsigned int static t,m,j;
  44.                 //unsigned int static j;
  45.                 WDTCTL = WDTPW | WDTHOLD;
  46.                 //unsigned const PWMPeriod=300;
  47.                 P1DIR|=BIT6;
  48.                 P1SEL|=BIT6;
  49.                 TA0CCR0=280;//set pwm period
  50.                 TA0CCTL1=OUTMOD_7;//set/reset mode
  51.                 TA0CTL=TASSEL_2+MC_1;//SMCLK/UP mode
  52.                 //TA0CCR0=600;
  53.                 if(flag_6) TA0CCR0=280*(bed[1]-48);
  54.        for(j=0;j<=4;j++)
  55.        {
  56.                 TA0CCR1=0;
  57.                 for(t=0;t<TA0CCR0;t++)
  58.                 {
  59.                         TA0CCR1=t;
  60.                         __delay_cycles(2000);
  61.                 }

  62.                 for(t=TA0CCR0;t>0;t--)
  63.                 {
  64.                         TA0CCR1=t;
  65.                         __delay_cycles(2000);
  66.                 }
  67.                 TA0CCR1=0;
  68.        }
  69.            TA0CCR1=0;
  70.            if(flag_6)
  71.            {m=(bed[2]-48);
  72.                    for(;m>0;m--)
  73.                    __delay_cycles(1000000);}
  74.            else __delay_cycles(2000000);

  75.     for(j=0;j<=4;j++)
  76.          {
  77.                   TA0CCR1=0;
  78.                   for(t=0;t<TA0CCR0;t++)
  79.                   {
  80.                           TA0CCR1=t;
  81.                           __delay_cycles(2000);
  82.                   }

  83.                   for(t=TA0CCR0;t>0;t--)
  84.                   {
  85.                           TA0CCR1=t;
  86.                           __delay_cycles(2000);
  87.                   }
  88.                   TA0CCR1=0;
  89.          }
  90. }
  91. void control_1(void)
  92. {
  93.         unsigned int static t;
  94.         unsigned int static j;
  95.         unsigned const PWMPeriod=280;
  96.         WDTCTL = WDTPW | WDTHOLD;
  97.         P1DIR|=BIT6;
  98.         P1SEL|=BIT6;
  99.         TA0CCR0=PWMPeriod;//set pwm period
  100.         TA0CCTL1=OUTMOD_7;//set/reset mode
  101.         TA0CTL=TASSEL_2+MC_1;//SMCLK/UP mode
  102.    for(j=0;j<=4;j++)
  103.    {
  104.         TA0CCR1=0;
  105.         for(t=0;t<PWMPeriod;t++)
  106.         {
  107.                 TA0CCR1=t;
  108.                 __delay_cycles(2000);
  109.         }

  110.         for(t=PWMPeriod;t>0;t--)
  111.         {
  112.                 TA0CCR1=t;
  113.                 __delay_cycles(2000);
  114.         }
  115.         TA0CCR1=0;
  116.    }
  117. }
  118. void IO_interrupt(void)
  119.         {
  120.          P1REN |= BIT3;           //啟用P1.3內部上下拉電阻
  121.          P1OUT |= BIT3;          //將電阻設置為上拉

  122.          //----配置P1.3中斷參數----
  123.          P1DIR &= ~BIT3;         //P1.3設為輸入(可省略)
  124.          P1IES |= BIT3;             //P1.3設為下降沿中斷
  125.          P1IE  |= BIT3;  //允許P1.3中斷
  126.      P1IFG&=~BIT3;
  127.         }
  128. void TimerA1(void)
  129. {
  130.             TA1CCTL0 = CCIE;                        // CCR0中斷使能
  131.             TA1CCR0 = 65535;
  132.             TA1CTL = TASSEL_2 + MC_3 + TACLR+ID_3;  // ACLK, 增計數模式, 清除TAR計數器
  133.             _enable_interrupts();
  134.            // __bis_SR_register(LPM0_bits+GIE);
  135. }

  136. void USCI_A0_init(void)
  137. {
  138.             BCSCTL1 = CALBC1_1MHZ;
  139.             DCOCTL = CALDCO_1MHZ;
  140.             P1SEL |=BIT1+BIT2;
  141.             P1SEL2 |=BIT1+BIT2;
  142.             UCA0CTL1 |=UCSSEL_2;
  143.             UCA0MCTL = UCBRS_0;
  144.             UCA0BR0=104;
  145.             UCA0BR1=0;
  146.             UCA0CTL1 &= ~UCSWRST;
  147.             IE2 |=UCA0RXIE;
  148.             //__bis_SR_register(LPM0_bits+GIE);
  149. }
  150. void ADC10_init(void)
  151. {
  152.     ADC10CTL0 &= ~ENC;
  153.     ADC10CTL0 = ADC10ON + REFON + ADC10SHT_3 + SREF_1;
  154.     ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3+SHS_0 + INCH_10;
  155.     __delay_cycles(3000);
  156.     ADC10CTL0 |= ENC;
  157. }
  158. void send_temp(void)
  159. {
  160.             static unsigned int z;
  161.             ADC10CTL0|=ENC+ADC10SC;
  162.                 while((ADC10CTL0 & ADC10IFG)==0);
  163.                  temp=ADC10MEM;
  164.            // IntDegC=((temp*(1.5)/1023)-0.986)/0.00355;
  165.                  IntDegC=temp*4225/1024-2777;
  166.             while(!(IFG2 & UCA0TXIFG));
  167.             putstr(flag_1);
  168.                 __delay_cycles(1000);
  169.                 UCA0TXBUF =IntDegC/100+48;
  170.                 __delay_cycles(1000);
  171.                 UCA0TXBUF =(IntDegC%100)/10+48;
  172.                 __delay_cycles(1000);
  173.                 UCA0TXBUF =46;
  174.                 __delay_cycles(1000);
  175.                 UCA0TXBUF =(IntDegC%100)%10+48;
  176.                 __delay_cycles(1000);
  177.                 putstr(flag);
  178.                 if (flag_8) z=((Temp[1]-48)*100)+((Temp[2]-48)*10)+(Temp[3]-48);else z=260;
  179.                 if(IntDegC>=z)    putstr(alarm1);

  180. }

  181. int main(void)
  182. {
  183.         static  int c=0;
  184.         WDTCTL = WDTPW | WDTHOLD;// Stop watchdog timer
  185.     Flash_Init();
  186.     P1DIR|=BIT0;
  187.     IO_interrupt();
  188.     ADC10_init();
  189.     USCI_A0_init();
  190.         TimerA1();
  191.         for(c=0;c<8;c++)
  192.                     {
  193.                             time[c]=FlashRead_Char(SegD+c);

  194.                     }

  195.     while(1)
  196.     {
  197.      if(flag_3){ breath_light();flag_3=0;}//5 2 5
  198.      if(flag_4){ control_1();flag_4=0;}//5
  199.      if(flag_5){ control_1();flag_5=0;}//5
  200.     }

  201.     }

  202. #pragma vector=TIMER1_A0_VECTOR// TA1中斷服務程序
  203. __interrupt void TIMER1_A0_ISR(void)
  204. {
  205.     static int c=0;
  206.         P1OUT^=BIT0;
  207.         send_temp();
  208.         putstr(flag_2);
  209.         putchar(time[0]);
  210.         putchar(time[1]);
  211.         putchar(time[2]);
  212.         putchar(time[3]);
  213.         putchar(58);
  214.         putchar(time[4]);
  215.         putchar(time[5]);
  216.         putchar(58);
  217.         putchar(time[6]);
  218.         putchar(time[7]++);
  219.         if(flag_7){putstr(alarm);flag_7=0;}        // forecast error
  220.         for(c=0;c<8;c++)
  221.                 {
  222.                         FlashErase_Seg(SegD+c);
  223.                 }
  224.                 for(c=0;c<8;c++)
  225.                 {
  226.                         FlashWrite_Char(SegD+c,time[c]);
  227.                 }
  228.              c=0;
  229.         if(time[7]==':'){time[7]='0';time[6]++;}
  230.         if(time[6]=='6'){time[6]='0';time[5]++;}
  231.         if(time[5]==':'){time[5]='0';time[4]++;}
  232.         if(time[4]=='6'){time[4]='0';time[3]++;}
  233.         if(time[3]==':'){time[3]='0';time[2]++;}
  234.         if((time[2]=='1')&&(time[3]=='2')&&(time[4]=='0')&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0'))
  235.         {if( time[0]=='a') time[0]='p';
  236.         else time[0]='a';
  237.         }
  238.         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';}
  239.         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
  240.         if(sum=='1')//P1^3 12/24h transform
  241.     {
  242.         if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='4')) {time[2]='0';time[3]='0';time[0]='a';}sum=0;
  243.         if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='3')) {time[2]='1';time[3]='1';}sum=0;
  244.         if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='2')) {time[2]='1';time[3]='0';}sum=0;
  245.         if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='1')) {time[2]='0';time[3]='9';}sum=0;
  246.         if((time[0]=='p')&&(time[2]=='2')&&(time[3]=='0')) {time[2]='0';time[3]='8';}sum=0;
  247.         if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='9')) {time[2]='0';time[3]='7';}sum=0;
  248.         if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='8')) {time[2]='0';time[3]='6';}sum=0;
  249.         if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='7')) {time[2]='0';time[3]='5';}sum=0;
  250.         if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='6')) {time[2]='0';time[3]='4';}sum=0;
  251.         if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='5')) {time[2]='0';time[3]='3';}sum=0;
  252.         if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='4')) {time[2]='0';time[3]='2';}sum=0;
  253.         if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='3')) {time[2]='0';time[3]='1';}sum=0;
  254.     }
  255.         if(sum=='2')
  256.         {
  257.         if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='1')) {time[2]='2';time[3]='3';}sum=0;
  258.         if((time[0]=='p')&&(time[2]=='1')&&(time[3]=='0')) {time[2]='2';time[3]='2';}sum=0;
  259.         if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='9')) {time[2]='2';time[3]='1';}sum=0;
  260.         if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='8')) {time[2]='2';time[3]='0';}sum=0;
  261.         if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='7')) {time[2]='1';time[3]='9';}sum=0;
  262.         if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='6')) {time[2]='1';time[3]='8';}sum=0;
  263.         if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='5')) {time[2]='1';time[3]='7';}sum=0;
  264.         if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='4')) {time[2]='1';time[3]='6';}sum=0;
  265.         if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='3')) {time[2]='1';time[3]='5';}sum=0;
  266.         if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='2')) {time[2]='1';time[3]='4';}sum=0;
  267.         if((time[0]=='p')&&(time[2]=='0')&&(time[3]=='1')) {time[2]='1';time[3]='3';}sum=0;
  268.         }
  269.     // begin/end class alarm
  270.         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;}
  271.         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;}
  272.         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;
  273.         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;
  274.         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;
  275.         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;

  276.         if(data=='s')//start o'clock alrm
  277.         {
  278.            if((time[2]<='2')&&(time[3]>='0')&&(time[4]=='0')&&(time[5]=='0')&&(time[6]=='0')&&(time[7]=='0')) flag_4=1;
  279.         }

  280.         if(data=='c') flag_4=0;//cancel o'clock alrm

  281.         if((time[0]==array[1])&&(time[1]==array[2])&&(time[2]==array[3])&&(time[3]==array[4])&&(time[4]==array[5])&&
  282.         (time[5]==array[6])&&(time[6]==array[7])&&(time[7]==array[8])){ flag_3=1;data='z';}

  283.         if((data!='d')&&(data!='e')&&(data!='z'))
  284.         {
  285.         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;
  286.         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;
  287.         }
  288.         if(data=='d')
  289.         {
  290.         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;
  291.         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;
  292.         }
  293.         if(data=='e')
  294.         {
  295.         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;
  296.         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;
  297.         }
  298. }
  299. #pragma vector=USCIAB0RX_VECTOR//uart interrupt
  300. __interrupt void uart()
  301. {
  302.         static int t=0;
  303.         static int j=0;
  304.     while(!(IFG2 & UCA0TXIFG));
  305.     buf[t] = UCA0RXBUF;t++;
  306.     if(buf[t-1]=='#')
  307.     {
  308.     if(t) t=0;
  309.     switch(buf[0])
  310.     {
  311.     case's': data=buf[0];UCA0RXBUF=0;break;//開啟整點報時功能
  312.     case'c': data=buf[0];UCA0RXBUF=0;break;//取消整點報時功能
  313.     case'd': data=buf[0];UCA0RXBUF=0;break;//調整打鈴,起床時間
  314.     case'e': data=buf[0];UCA0RXBUF=0;break;
  315.     case'&': j=1;flag_6=1;
  316.             while(buf[j]!='#')//adjust alarm time
  317.         {bed[j] = buf[j] ;j++;}
  318.         if(j==3)
  319.                 j=0;
  320.     break;
  321.     case'*':j=1;//adjust bed time
  322.                 while(buf[j]!='#')
  323.                 {array[j] = buf[j] ;j++;}
  324.                 if(j==9)
  325.                         j=0;
  326.        break;
  327.     case't':j=1;flag_8=1;//adjust temperature
  328.                    while(buf[j]!='#')
  329.                    {Temp[j] = buf[j] ;j++;}
  330.                    if(j==4)
  331.                            j=0;
  332.           break;
  333.     case'a'://adjust time
  334.             if((buf[1]!='m')||(buf[2]>='2')||(buf[4]>='6')||(buf[6]>='6')||((buf[2]=='2')&&(buf[3]>='4'))) flag_7=1;
  335.             else
  336.             {flag_7=0;
  337.             while(buf[j]!='#')
  338.             {time[j] = buf[j] ;j++;}
  339.             if(j==8)
  340.                     j=0;}
  341.     break;
  342.     case'p'://adjust time
  343.                 if((buf[1]!='m')||(buf[2]>='3')||(buf[4]>='6')||(buf[6]>='6')||((buf[2]=='2')&&(buf[3]>='4'))) flag_7=1;
  344.                 else
  345.                 {flag_7=0;
  346.                 while(buf[j]!='#')
  347.                 {time[j] = buf[j] ;j++;}
  348.                 if(j==8)
  349.                         j=0;}
  350.         break;
  351.     default:flag_7=1;break;

  352.     }
  353. }}
  354. #pragma vector = PORT1_VECTOR//P1^3 interrupt
  355. __interrupt void PORT1_ISR(void)
  356. {
  357.         static unsigned char m;
  358.         if(P1IFG&BIT3)
  359.         {
  360.         __delay_cycles(1000000);
  361.         if(P1IFG&BIT3)
  362.         {m++;
  363.         if(m%2==1)
  364.         sum='1';//檢測通過,則會調用事件處理函數
  365.         else sum='2';        //退出中斷前必須手動清除IO口中斷標志
  366.         P1IFG = 0;
  367.         }
  368.         while(P1IFG&BIT3);
  369.         }
  370. }


復制代碼

源碼下載:
msp430g2553打鈴系統.docx (21.72 KB, 下載次數: 27)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷午夜天 | 久久久久久99 | 日韩在线国产精品 | 色婷婷综合久久久中字幕精品久久 | av黄色免费在线观看 | 国产sm主人调教女m视频 | 久久99一区二区 | 在线免费亚洲视频 | 欧美日韩亚洲一区 | 人人人艹| 亚洲视频欧美视频 | 国产aⅴ| 日韩一区二区免费视频 | 一区二区成人 | 91日韩在线| 日韩中字幕 | 久久国产香蕉 | 在线观看国产 | 国产视频精品在线观看 | 99国产精品99久久久久久 | 国产精品久久久久久久久久免费看 | 一区二区免费看 | 精品视频一区二区 | 请别相信他免费喜剧电影在线观看 | 日本涩涩网| 亚洲视频在线一区 | 成人一区二区三区在线观看 | 伊人一区 | 国户精品久久久久久久久久久不卡 | 久久成人一区二区三区 | 国产欧美一区二区精品久导航 | 毛片网站在线观看 | 欧美a免费 | 日韩二三区 | 中文字幕乱码亚洲精品一区 | 一本一道久久a久久精品综合 | 国产aa | 一区二区三区四区不卡 | 美女毛片 | 孰女乱色一区二区三区 | 亚洲国产成人在线视频 |