单片机学习专栏——实验四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);
总结
大家喜欢的话,给个,点个关注!继续跟大家分享敲代码过程中遇到的问题!