文章目录[隐藏]
系列文章
提示:单片机与接口技术专栏,观看更多内容!
点我直达–>单片机与接口技术专栏
前言
编写程序实现CC2530每2秒钟周期性地发送字符串“Hello,this is *********” 到串口终端软件,其中*********表示学号。在发送字符串的同时LED3灯亮300ms然后熄灭。要求串口波特率为38400,无奇偶校验位,1位停止位。要求给出源代码及注释。
选做1: 要求用定时器实现上述2秒钟周期发送。
选做2: 可以利用按键进行控制发送,即按键按下时开始发送,再次按下时停止发送。
1.main.c
#include <ioCC2530.h> //引入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 <ioCC2530.h> //引入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 <ioCC2530.h> //引入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_1
void 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);
总结
大家喜欢的话,给个👍,点个关注!继续跟大家分享敲代码过程中遇到的问题!
版权声明:本文为CSDN博主「发现你走远了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011027547/article/details/121551650
暂无评论