用串口UART0显示时钟

 #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])%10+48;      
      senddata[6]=(char)(time[2])/10+48;      
      senddata[4]=(char)(time[1])%10+48;      
      senddata[3]=(char)(time[1])/10+48;      
      senddata[1]=(char)(time[0])%10+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
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Zynq 7020是一款Xilinx公司生产的可编程逻辑器件。它内部集成了ARM Cortex-A9双核处理器和可编程逻辑单元,具有强大的计算和通信能力。UART(Universal Asynchronous Receiver/Transmitter)是一种常用的串行通信接口,用于在不同设备之间传输数据。 编写Zynq 7020上的UART0串口程序需要以下步骤: 1. 配置UART0的引脚:首先,需要设置Zynq 7020的引脚,将UART0的发送和接收引脚与外部设备连接起来。 2. 初始化UART0:通过对UART0控制寄存器进行设置,可以配置串口的波特率、数据位数、停止位数和校验位等参数。 3. 发送数据:通过写入UART0的数据寄存器,可以向外部设备发送数据。可以使用循环将一串数据连续发送。 4. 接收数据:通过读取UART0的数据寄存器,可以从外部设备接收数据。可以使用循环读取多个数据,并将其存储在内存中。 5. 处理数据:接收到的数据可以进一步进行处理,如解码、验证或转换成特定格式。 6. 关闭UART0:使用完UART0后,应该关闭串口,并释放相关资源。 总的来说,Zynq 7020 UART0串口程序的关键是配置和控制UART硬件,从外部设备读取数据并向外部设备发送数据。具体的实现方法可以参考Xilinx提供的相关文档和开发工具。 ### 回答2: Zynq 7020是Xilinx推出的一款SoC(系统片上系统),其中包含了双核ARM Cortex-A9处理器和可编程逻辑单元(PL),可用于嵌入式系统开发。UART0是其中的一个串口接口。 在Zynq 7020上,我们可以通过编写程序来使用UART0串口。首先,我们需要配置Zynq 7020的PL部分来使UART0工作。这可以通过Vivado设计套件来完成。配置的过程涉及到连接PL中的UART0 IP核(Intellectual Property,知识产权)到PS(Processing System,处理系统)上的MIO(Multiplexed I/O)引脚,并设置相应的时钟和波特率等参数。 然后,我们可以使用C语言编写程序来与UART0进行通信。首先,我们需要打开UART0的设备文件,该文件位于Linux系统中的/dev目录下。通过打开设备文件,我们可以访问UART0的寄存器。接下来,我们可以使用标准的文件操作函数(如read和write)来发送和接收数据。 例如,要发送数据,我们可以使用write函数向设备文件写入数据。将要发送的数据存储在一个字符数组中,然后使用write函数将数据写入设备文件。类似地,我们可以使用read函数从设备文件中读取接收到的数据,并将其存储在另一个字符数组中。 除了发送和接收数据,我们还可以使用其他的配置函数来设置UART0的参数,例如设置波特率、数据位数、停止位等。这些函数可以在Linux系统的UART驱动程序中找到。 总之,Zynq 7020的UART0串口程序涉及到配置PL部分、使用C语言编写程序,并使用文件操作函数从设备文件中读取和写入数据。 ### 回答3: Zynq 7020是一款Xilinx公司生产的可编程SoC器件,它融合了双核ARM Cortex-A9处理器和可编程逻辑部分(PL)。UART(通用异步收发传输器)是一种在计算机和外部设备之间传输数据的通信协议。 使用Zynq 7020的UART0串口,我们可以通过编写程序来实现与其他设备的通信。下面是一个简单的Zynq 7020 UART0串口程序的示例: 首先,我们需要在Vivado中设计并配置Zynq 7020的系统,包括设置处理器和PL的连接方式以及配置UART0。然后,在开发板上上电并启动系统。 针对UART0串口的程序编写可以分为发送和接收两部分。 发送部分的代码如下: 1. 首先,需要引入UART0的寄存器地址,可以通过查阅Zynq 7020的参考手册获得。 2. 配置UART0的波特率、数据位、停止位、奇偶校验位等参数。 3. 使用对应的寄存器写入要发送的数据。 接收部分的代码如下: 1. 首先,需要引入UART0的寄存器地址。 2. 配置UART0的波特率、数据位、停止位、奇偶校验位等参数。 3. 使用对应的寄存器读取接收到的数据。 这是一个基本的Zynq 7020 UART0串口程序示例。根据实际需求,你可以对发送和接收部分的代码进行调整和扩展。同时,还需要合适的硬件连接和电源供应来确保UART0串口能够正常工作。 总结起来,Zynq 7020 UART0 串口程序的编写需要首先设计和配置Zynq 7020系统,并在这个基础上编写发送和接收部分的代码。通过这样的程序,我们可以实现与其他设备之间的数据通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值