用串口UART0显示时钟

    xiaoxiao2021-12-14  20

     #include <iocc2530.h> #define rled P1_0 #define gled P1_1

    /*变量定义和赋值*******************************/ char time[3]={10,44,55};    //时间初值 char recdata[10];           //串口接收到的数据 char senddata[10]="00:00:00  "; //时间数据字符串 char timetemp;      //秒针变量 char counter=0;     //中断次数统计 char temp;          //串口接收到的数据临时变量 char number=0;     char follow_second; //时间跟随 用于判断是否用串口输出时间

    void Init_Io(void) {     P1SEL &=0XFC; //P1_0,P1_1接口设为通用接口模式     P1DIR|=0X03;  //P1_0,P1_1接口设为输出模式     rled=0;     gled=0; }

    void Init_Clock(void) {     CLKCONCMD &= 0XBF;  //选择系统时钟为32MHZ石英晶振     CLKCONCMD |= 0X28;  //定时器标记输出值设为1MHZ  这里不是很明白 定时器是以这个频率为基准的吗?     while(CLKCONSTA & 0X40);    //等待时钟稳定   CLKCONCMD &= ~0X07;         //主时钟频率为32MHZ }

    //T3初始化 void Init_T3(void){     T3CCTL0 |= 0X44;  // T3通道0中断使能 T3通道0为比较模式       T3CC0 = 0XFA;     //T3通道0比较寄存器值设为250     T3CTL |= 0X80;    //T3定时计数时钟为16分频     T3CTL |= 0X02;    //T3计时模式位模模式,从0X00->T3CC0   //T3CTL |= 0X08;    //溢出中断使能 因为产生的是T3通道0比较中断而不是T3的溢出中断 故本句可以不要    IEN1 |= 0X08;     //T3中断使能     EA |= 1;          //总中断使能     T3CTL |=0X10;     //启动T3 } 

    //初始化串口0函数 void Init_Uart0(void) {     PERCFG &= 0XFE;  //设USART0的ALT 1     P0SEL |= 0X3C;   //P0口2、3、4、5做外设     P2DIR &= 0X3F;   //P0外设优先级USART0最高     U0CSR |= 0X80;   //设USART0 工作方式为 UART     U0GCR |= 9;     U0BAUD |= 59;    //设波特率为19200   UTX0IF= 0;       //UART0 TX中断标志位清0     U0CSR |= 0X40;   //USART0 接收使能     IEN0 |= 0X04;    //usart0 接收中断使能     IEN0 |= 0X80;    //总中断使能 }

    //串口发送字符串函数 void uarttx_send_string(char *data,int len) {     int j;     for(j=0;j<len;j++)     {         U0DBUF=*data++;         while(UTX0IF==0);         UTX0IF=0;     } }

    void main(void) {     Init_Clock();     Init_T3();     Init_Uart0();     Init_Io();          do{    //计时程序段         if(timetemp==1)//到1秒后 将时分秒的数字改变         {             if(time[2]<59)//秒                       time[2]++;                   else//将秒设为0分加1             {                 time[2]=0;                 if(time[1]<59)//分                            time[1]++;                 else                 {                     time[1]=0;                     if(time[0]<23)//时                                  time[0]++;                               else                                   time[0]=0;                  }             }             timetemp=0;         }          //接收到的字符串赋给recdata         if(temp!=0)         {             recdata[number]=temp;             number++;             temp=0;         }             //如果接收到9个字符 并且以#开头 则将time数组里的时间进行更新         if((recdata[0]=='#')&&(number==9))         {             time[2]= (recdata[7]-48)*10+(recdata[8]-48);//秒,0的ASCII码为48             if(time[2]>59)                 time[2]=0;             time[1]=(recdata[4]-48)*10+(recdata[5]-48);//分             if(time[1]>59)                 time[1]=0;             time[0]=(recdata[1]-48)*10+(recdata[2]-48);//时             if(time[0]>23)                 time[0]=0;                    gled=!gled;   //设时间时,黄灯指示变换。             recdata[0]=0; //接收首位设0,以区别#             number=0;         }              //时间字符串发送显示         if(follow_second!=time[2])//秒数更新         {             senddata[7]=(char)(time[2])+48;             senddata[6]=(char)(time[2])/10+48;             senddata[4]=(char)(time[1])+48;             senddata[3]=(char)(time[1])/10+48;             senddata[1]=(char)(time[0])+48;             senddata[0]=(char)(time[0])/10+48;             uarttx_send_string(senddata,10);             follow_second=time[2];         }     }while(1); }

    //T3中断函数 #pragma vector=T3_VECTOR __interrupt void T3_ISR(void) {     IRCON &=0XF7;//清除T3中断标志位     counter++;     if(counter==250)//计时公式:250比较值*16分频*250次中断计数=1M,1秒     {         counter=0;         timetemp=1; //1秒标记,每一秒执second++         rled=!rled;      } }   

    //接收中断函数 #pragma vector=URX0_VECTOR __interrupt void UART0_ISR(void) {     URX0IF=0;     //清标志     temp=U0DBUF;  //读取缓存到temp }

    转载请注明原文地址: https://ju.6miu.com/read-971968.html

    最新回复(0)