阅读 306

单片机学习专栏——实验四4.1串口实验

步骤

  • 系列文章

  • 前言


    • 1.main.c

    • 2.sys_init.c

    • 3.sys_init.h

  • 总结


系列文章

提示:单片机与接口技术专栏,观看更多内容!
点我直达–>单片机与接口技术专栏


前言

编写程序实现CC2530每2秒钟周期性地发送字符串“Hello,this is *********” 到串口终端软件,其中*********表示学号。在发送字符串的同时LED3灯亮300ms然后熄灭。要求串口波特率为38400,无奇偶校验位,1位停止位。要求给出源代码及注释。
选做1: 要求用定时器实现上述2秒钟周期发送。
选做2: 可以利用按键进行控制发送,即按键按下时开始发送,再次按下时停止发送。


1.main.c

#include                                           //引入CC2530所对应的头文件(包含各SFR的定义)#include "sys_init.h" /*******************************************************
函数名称:主函数
*******************************************************/uint counter = 0; //全局变量char message[ ]={     "Hello,this is,miao ze hao,19145120"}; //定义字符串数组void main(void){     
  xtal_init();//初始化系统时钟
  time1_init();//初始化t1
  led_init();//初始化led灯
  initUARTtest();//初始化串口
  ext_init();  // 按键初始化以及中断配置
  
  while(1)
  {     //    //选做1 定时器//    if(counter>=2000){  //此处数字5根据实际需要设定  0.250MS *2000=2000ms//      D6=0;//开灯//      counter=0;//      UartTX_Send_String(message,strlen(message));//这里使用strlen函数实现获取字符数组长度//    }//    else if(counter>=300){     //      D6=0;//关灯//    }//    //    //基础//    MyWait(2000);//间隔两秒//    UartTX_Send_String(message,strlen(message));//这里使用strlen函数实现获取字符数组长度

  }}//串口发送字符串函数void UartTX_Send_String(char *Data,int len){     
  int j;
  for(j=0;j<len;j++)
  {     
    U0DBUF = *Data++;   // 每次循环发送1个字符
    while(UTX0IF == 0); // 等待发送完毕
    UTX0IF = 0;
  }}/*******************************************************
函数名称:中断
功能:中断函数
入口参数:无
出口参数:无
返回值:无
*******************************************************/#pragma vector = T1_VECTOR      
 __interrupt void T1_ISR(void)            
 {            
   EA=0;//关总中断
   //要求每隔500+120ms亮灭
   //此处补充时间控制和亮灭代码
   counter=counter+1;


   T1IF=0;  // 清除中断标志
   EA=1;                           //开总中断 
 }/*******************************************************
函数名称:P0_ISR
功能:中断函数
入口参数:无
出口参数:无
返回值:无
*******************************************************/#pragma vector = P0INT_VECTOR__interrupt  void P0_ISR (void){     
      EA = 0; //关中断,这也意味着 同时只能有一个中断操作
      
      UartTX_Send_String(message,strlen(message));//这里使用strlen函数实现获取字符数组长度
      //开中断
      P0IEN |= 0x10;
      P0IEN |=0x10;


      EA = 1; //开中断}

2.sys_init.c

#include              //引入CC2530所对应的头文件(包含各SFR的定义)#include "sys_init.h"/*系统时钟初始化
-------------------------------------------------------*/void xtal_init(void){     
  SLEEPCMD &= ~0x04;              //都上电
  while(!(CLKCONSTA & 0x40));     //晶体振荡器开启且稳定
  CLKCONCMD &= ~0x47;             //选择32MHz晶体振荡器
  SLEEPCMD |= 0x04;}/*led初始化
-------------------------------------------------------*/void led_init(void){     
  P1SEL &= ~0x11;          //P1.0  为普通 I/O 口 P1.1  为普通 I/O 口
  P1DIR |= 0x11;           //输出 
  
  D6 = 1;                //关LED 
  D7 = 1;                //关LED }/*按键初始化
-------------------------------------------------------*/void ext_init(void)
 {     
   P0SEL &= ~0x10;        //P0.0 和 P0.1为普通 I/O 口
   P0DIR |= ~0x10;        //P0.0 和 P0.1输出
   P0INP &= ~0x10;        //P0.0 和 P0.1上拉
   D7 = 1;                //关LED  KEY1 P0_1
   D6 = 1;                //关LED  KEY2 P0_0
  
   P0IFG &=~0X10;  //P0 4中断标志清0
   
   P0IEN|=0X10;   //开P0端口使能中断
   P0IE=1;        //P0中断使能
   
   PICTL |=0x01;  //P0下降沿产生中断
   
   EA=1;         //总中断使能
 }/*c串口初始化
-------------------------------------------------------*/void initUARTtest(void){     
 //使用串口备用位置1 P0口
    PERCFG = 0x00;
    //P0用作串口
    P0SEL = 0x3c;
 
    //UART方式
    U0CSR |= 0x80;
    
    //波特率baud_e的选择,书本p99页表5.6
    U0GCR |= 10;	
    //波特率设为38400
    U0BAUD |= 59;  
 }/*******************************************************
函数名称: time1_init
功能:初始化定时器1
入口参数:无
出口参数:无
返回值:无
*******************************************************/void time1_init(){     
  int value=125;  //此处数值根据实际需要设定  2500==20毫秒一次  125==1毫秒一次
  
  T1CTL = 0x0E; //T1定时器 128 分频,模模式 ;
  //此处分频系数根据实际需要设定

  T1CCTL0 |= 0x04;  //设定timer1通道0输出比较模式
  //设定计数溢出值
  T1CC0H = value/256;
  T1CC0L= value %256;     
  //定时器1中断使能
  IEN1|=0X02;
  

  //开总中断
  EA=1;  }          


  /*延时函数
-------------------------------------------------------*/void halWait(unsigned char wait){     
  unsigned long largeWait;

  if(wait == 0)
  {     return;}
  largeWait = ((unsigned short) (wait << 7));
  largeWait += 114*wait;

  largeWait = (largeWait >> CLKSPD);
  while(largeWait--);

  return;}/*延时函数2
-------------------------------------------------------*/void MyWait(unsigned short wait){     
  unsigned char a,b,i;
  a= wait % 250; //表示余数
  b= wait / 250; //表示有几个整的
  for(i=0;i<b;i++){     
     halWait(250); //取整数的halWait延时
  }
  halWait(a); //取余数的halWait延时
  return;}

3.sys_init.h

#include              //引入CC2530所对应的头文件(包含各SFR的定义)/*----------------------------------------------------------------------------*//*                            macro declaration 	                      *//*----------------------------------------------------------------------------*/#define D6    P1_0              //定义D6为P1_0口控制 #define D7    P1_1              //定义D6为P1_0口控制 #define uint   unsigned  int#define uchar  unsigned  char#define CLKSPD  ( CLKCONCMD & 0x07 )    //getting the clock division factor#define KEY2 P0_0#define KEY1 P0_1void xtal_init(void);void led_init(void);//初始化led灯void initUARTtest(void);void halWait(unsigned char wait);void MyWait(unsigned short wait);void UartTX_Send_String(char *Data,int len);void ext_init(void);  // 按键初始化以及中断配置void time1_init(void);

总结

大家喜欢的话,给个,点个关注!继续跟大家分享敲代码过程中遇到的问题!


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐