Zigbee 问题
1
#define LED1 P1_0 // 定义P1.0口为LED1控制端
#define LED2 P1_1 // 定义P1.1口为LED2控制端
#define LED3 P1_4 // 定义P1.4口为LED3控制端
#define KEY1 P0_1 // 定义P0.1口为S1控制端
LED1 和 KEY1 是关键词吗?
KYT1=0是按下状态
uchar KeyScan(void)
{
if (KEY1 == 0)
{
DelayMS(10); //延时10MS去抖 为什么需要延时去抖?
if (KEY1 == 0)
{
while(!KEY1); //松手检测 调用一次函数只返回一个值,不因循环而列外
return 1; //有按键按下
}
}
return 0; //无按键按下
}
1 P0IFG为1时就是在执行中断吗?
2 当EA = 1;总中断打开当 P0IFG = 0; //清中断标志
P0IF = 0; //清端口0中断标志
后总中断也是没有关闭吗?
3 为什么中断都有死循环?
/****************************************************************************
* 名 称: UartSendString()
* 功 能: 串口发送函数
* 入口参数: Data:发送缓冲区 len:发送长度
* 出口参数: 无
****************************************************************************/
void UartSendString(char *Data, int len)
{
uint i;
for(i=0; i<len; i++)
{
U0DBUF = *Data++; U0DBUF为发送寄存器只是数据的寄存
while(UTX0IF == 0); 作用:当UTX0IF等于0时(注意,当前状态, UTX0IF=0),即数据
UTX0IF = 0; 仍在发送,故UTX0IF=0, 循环判断.直到数据发送完成, UTX0IF=1, 循环结束.
直观 while(UTX0IF == 0)
{ };
UTX0IF = 0;
}
}
/****************************************************************************
while(1)
{
if(UartState == UART0_RX) //接收状态
{
if(RxBuf != 0) 说明不能发送0
{
if((RxBuf != '#')&&(count < 50))//以'#'为结束符,一次最多接收50个字符
为什么count没有一个量都能够通过以及RxBuf在if没有量问题及解答
RxData[count++] = RxBuf;
else
{
if(count >= 50) //判断数据合法性,防止溢出
{
count = 0; //计数清0
memset(RxData, 0, SIZE);//清空接收缓冲区
}
else
UartState = UART0_TX; //进入发送状态
}
RxBuf = 0;
}
}
if(UartState == UART0_TX) //发送状态
{
U0CSR &= ~0x40; //禁止接收
UartSendString(RxData, count); //发送已记录的字符串。
U0CSR |= 0x40; //允许接收
UartState = UART0_RX; //恢复到接收状态
count = 0; //计数清0
memset(RxData, 0, SIZE); //清空接收缓冲区
}
}
}
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 清中断标志
RxBuf = U0DBUF;
}
中断问题综合
1 当接收字符后将其储存在数组RxData中时如果还没有来储存又接收了字符触发中断将原本需要储存的字符无法储存?
猜想:是因为从电脑发送而引起触发中断经过的时间比储存的时间要长。
2 当已经接收后再发送给电脑时中断标志URX0IF也触发为1也会触发中断进入中断程序将寄存器中的值赋值给Rxbuf最终最后一个值会把Rxbuf不为0而存入数组RxData?
猜想:当接收开始时就触发中断此时值还在UOBUF中,发送时发送完成触发中断UOBUF中值不在为0使最终将0赋值给RxBuf。
应该在接收时中断后将UOBUF将值赋值给Rxbuf后就已经为0吗还是将值给电路板某个地方或者发送到电路板后自动将这个值废掉,然后继续执行主程序;
系统睡眠——定时器问题
具体代码是怎样体现的句话:
读 ST0 将 捕获 24 位计数器的当前值。因此,ST0 寄存器必须在 ST1 和 ST2 之前读,以捕获一个正确的睡眠定时器计数 值。
如何移位:
sleepTimer |= ST0;
sleepTimer |= (ulong)ST1 << 8;
sleepTimer |= (ulong)ST2 << 16;
sleepTimer += ((ulong)sec * (ulong)32768);
ST2 = (uchar)(sleepTimer >> 16);
ST1 = (uchar)(sleepTimer >> 8);
ST0 = (uchar) sleepTimer;
休眠后是重新从主函数进入还是从原有程序处开始?
个人认为从源程序开始
定时器问题:
猜想:当ST0,ST1,ST2睡眠定时器被更新后睡眠定时器继续运转(在没被更新的时间段不运转即定时器不复位),而其他定时器一直运转。
1手册摘录:如果尚未在 32kHz 时钟上检测到一个正时钟边沿,ST2:ST1:ST0 中的睡眠定时器值不更新(是值变为0还是继续增加?), 要保证读出一个最新的值, 必须在读睡眠定时器值之前,在 32kHz 时钟上通过轮询 SLEEPSTA.CLK32K 位,等待一个正的变换。
2 手册摘录:定时器 在复位之后立即启动,如果没有中断就继续运行。
1和2矛盾但倾向于1,当ST不随时钟变化而变则2对反之1对
猜想:当睡眠定时器的值达到比较值后不变为零,而是继续增加否则ST的值将是与之前的值的加和与之不符合。
第17
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr)[0])
while(1)
{
memset(strTemp, 0, ARRAY_SIZE(strTemp));
UartSendString(str, 8); //输出提示信息
该语句是不是定义了一个叫ARRAY_SIZE的宏?----是
a是不是该宏的一个参数?
----是
(sizeof(a) / sizeof((a)[0]))代表什么意思???
-----数组元素的个数
sizeof是求字节数的,sizeof数组名是数组占用的字节数,sizeof(a[0])是第一个元素的字节数,总数除以一个的大小,就是个数