|
2015瑞萨电子设计大赛作品
项目名称: |
家用用电无线控制定时器 |
项目实现的功能说明: |
主要功能:
1,定时功能。实现时分秒定时。定时时间为24小时以下,精确到秒。 2,定时时显示功能。显示设置的时分秒,显示正在定时的时分秒。
3,定时时外部IO LED提醒功能(后面可以用它控制外部继电器实现动作,因没制板目前只是LED提醒)。
4,按键设置功能。有三个按键对无线控制替代按键设置。
5,无线控制。无线控制使用外接的无线串口透传模块。把数据从电脑传到无线控制模块,空中发射到无线接受模块。然后串口发送给定时器。 |
项目进展状态: |
完成 |
软硬件设计思路: |
软件功能:
1,定时功能。实现时分秒定时。定时时间为24小时以下,精确到秒。时分秒显示格式为10进制。
2,定时显示功能。显示设置的时分秒,显示正在定时的时分秒走时,每秒更新一次显示。
3,定时时外部IO LED提醒功能(后面可以用它控制外部继电器实现动作,因没制板目前只是LED提醒)。
4,按键设置功能。有三个按键对无线控制替代按键设置:
A:设置/设置时位移动键 ,
B:设置时数据+键,
C:设置完成键/定时重新启动键。
当要设置时,按下A键开始设置,时分秒的某一值周期闪动,按B键改变数值,设置好后按A键移动到另外时分秒中一个值再次设置。完成后按C键把数据固定下来。再按C键开始定时。如果不改变定时值重新定时,再按C键即可。
5,无线控制。
无线控制使用外接的无线串口透传模块。把数据从电脑传到无线控制模块,空中发射到无线接受模块。然后串口发送给定时器。设置数据和启动定时。
设置命令:f5(头)+时+分+秒
开启命令:f5(头)+AA+00+00
软件采用中断+查询+状态机:
串口采用中断,主程序每次查询是否有控制命令,如果有。则执行控制命令改变设置或控制定时启动。
另外状态机分为设置状态和显示状态。
设置状态查询3个按键。对定时器进行设置。
A键开始设置,也兼位移动功能,B键值加1,C键设置完成。
显示状态只查询A按键和C按键,如果是A键按下,转换到设置状态,如果C键按下,开始定时器定时。
1秒定时和LED闪动安排在定时器中。
按键键值的获得由按键中断处理。
硬件功能:
器件:
采用CPU:瑞萨r7f0C8096
外围按键
LED
电池盒
电池
无线模块(采用ZIGBEE串口透传模块)
电路原理图:见图
采用CPU功能:
瑞萨r7f0C8096 是瑞萨公司的一款小型单片机,但功能还不错。根据产品需求,采用了如下功能:
IO口GPIO功能(驱动LED)。
键盘中断功能解决键盘按键问题。
串口功能解决无线模块和串口连接问题。
定时器功能解决定时器定时和显示闪动提醒LED提醒功能。 |
原理图: |
- |
源码: |
- |
相关帖子集锦: |
大家讨论一下 R7FC08096 不能使用自动代码生成工具的问题https://bbs.eeworld.com.cn/thread-471569-1-1.html
瑞萨电子设计大赛--家用用电无线控制定时器 之一 跑DEMO
https://bbs.eeworld.com.cn/thread-471558-1-1.html
瑞萨电子设计大赛--家用用电无线控制定时器 之二 通用IO和复用IO
https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=476040&page=1&extra=#pid1939588
瑞萨电子设计大赛--R7FC08096 键盘中断
https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=477281&page=1&extra=#pid1947082 |
作品形象代表照片: |
|
作品总结: |
该产品是一个通用的无线+定时功能产品,主要实现定时,定时显示,按键和无线控制功能,可以扩展外接控制和外部数据采集(后面有兴趣的朋友可以加)。充分使用了rf7c08096芯片的IO,定时,按键中断,串口中断等功能。是一个比较方便大家参考的小项目。为后面网友们改装为无线采集器。无线控制器等物联网设备提供参考。现实使用方面就是方便大家直接用它实现家用定时需求,这也是我一直想要使用的一个家用定时小产品。谢谢大家。 |
最后陈述,为自己的作品拉票: |
为我的定时器加油!网友们可以用源码直接改成无线采集器。无线控制器等物联网设备.喜欢定时器小产品的朋友可以直接使用代码。看看吧。支持吧。大家一起提高!!! |
演示视频: |
http://v.youku.com/v_show/id_XMTM4NjgyMzM0MA==.html |
本帖最后由 damiaa 于 2015-11-16 14:06 编辑
大家讨论一下 R7FC08096 不能使用自动代码生成工具的问题
https://bbs.eeworld.com.cn/thread-471569-1-1.html
瑞萨电子设计大赛--家用用电无线控制定时器 之一 跑DEMO
https://bbs.eeworld.com.cn/thread-471558-1-1.html
瑞萨电子设计大赛--家用用电无线控制定时器 之二 通用IO和复用IO
https://bbs.eeworld.com.cn/forum. ... 1&extra=#pid1939588
瑞萨电子设计大赛--R7FC08096 键盘中断
https://bbs.eeworld.com.cn/forum. ... 1&extra=#pid1947082
]
PDF格式原理图:
r7fc80962_time.pdf
(98.24 KB, 下载次数: 4)
ZIP打包源代码:
MYOLED_UART_RF.zip
(932.39 KB, 下载次数: 6)
主程序流程图
diagram designer软件画的主程序流程图:
定时器主程序流程图.zip
(1.5 KB, 下载次数: 4)
主程序 MAIN部分代码:
void main(void)
{
MD_STATUS status; /* UART Status */
status = R_UART0_Receive(g_Uart0RxBuf,4); /* UART0 receive buffer setting */
R_UART0_Start(); /* Start the UART0 Tx/Rx operation */
g_Uart0RxOK=0;
inttm00counter = 0U;
g_SW_Counter = 0U; /* Initialization counter of SW input */
g_TDR00_WorkH = g_DTR000_DataH[0U]; /* Set initial interval */
g_TDR00_WorkL = g_DTR000_DataL[0U];
Port_Init();
R_TAU0_Channel0_Start();
LCD_Init();
LCD_CLS();
workstatus=1;
LCD_P16x16Ch(2*16+8,0,0); //
LCD_P16x16Ch(3*16+8,0,1); //
LCD_P16x16Ch(4*16+8,0,2); //
LCD_P8x16Str(2*16+8,2,str1);
LCD_P8x16Str(1*16+8,4,str2);
while (1U)
{
if(g_Uart0RxOK)
{
if(g_Uart0RxBuf[0] ==0xf5)
{
if(g_Uart0RxBuf[1] == 0xaa)
{ nowhour =0; nowmin =0; nowsec =0; keyval =0; starttimeflag =1;
}
else
{
hour =g_Uart0RxBuf[1]; min =g_Uart0RxBuf[2]; sec =g_Uart0RxBuf[3];
g_Uart0TxEnd = R_UART0_Send(messageOK, 4); /* transmit "OK" */
while (g_Uart0TxEnd == 0){};
}/* wait for final transmit */
}
ClearUart0RxBuf();
}
if(1 ==workstatus)
{
if( 1 == keyval )
{
disp_setuppoint=1; keyval =0; workstatus =2;
}
if( 3 == keyval)
{
nowhour =0; nowmin =0; nowsec =0; keyval =0; starttimeflag =1;
}
}
if(2 == workstatus)
{
//setup
switch(keyval)
{
case 1:
disp_setuppoint++;
if(disp_setuppoint>3) disp_setuppoint=1;
keyval =0;
break;
case 2:
switch(disp_setuppoint)
{
case 1:
hour++;
if(hour >= 24) hour =0;
break;
case 2:
min++;
if(min >= 60) min =0;
break;
case 3:
sec++;
if(sec >= 60) sec =0;
break;
default:
disp_setuppoint =1;
break;
}
keyval =0;
break;
case 3:
nowhour =0; nowmin =0; nowsec =0;
disp_setuppoint =0;
keyval =0;
workstatus =1;
starttimeflag =0;
break;
default:
if(keyval !=0){ keyval =0;}
break;
}
}
disptime();
}
}
键盘中断源代码:extern uint8_t keyval;
__interrupt void R_Key_Interrupt(void)
{
switch(KRF)
{
case 0x10: keyval =1;
break;
case 0x20: keyval =2;
break;
case 0x40: keyval =3;
break;
default:break;
}
KRF = 0; /* clear flag for next key in */
}
串口通信中断流程图:
__interrupt void R_UART0_Interrupt_Receive(void)
{
uint8_t rx_data;
rx_data = RXD0;
if (g_Uart0RxLen > g_Uart0RxCnt)
{
*gp_Uart0RxAddress = rx_data;
gp_Uart0RxAddress++;
g_Uart0RxCnt++;
if (g_Uart0RxLen == g_Uart0RxCnt)
{
g_Uart0RxOK=1;
R_UART0_Callback_ReceiveEnd();
}
}
}
__interrupt void R_UART0_Interrupt_Send(void)
{
if (g_Uart0TxCnt > 0U)
{
TXD0 = *gp_Uart0TxAddress;
gp_Uart0TxAddress++;
g_Uart0TxCnt--;
}
else
{
R_UART0_Callback_SendEnd();
}
}
void R_UART0_Callback_SendEnd(void)
{
g_Uart0TxEnd = 1U; /* set transmission end flag */
}
MD_STATUS R_UART0_Send(uint8_t* txbuf, uint16_t txnum)
{
MD_STATUS status = MD_OK;
if (txnum < 1U){ status = MD_ARGERROR; }
else
{
gp_Uart0TxAddress = txbuf;
g_Uart0TxCnt = txnum;
STMK0 = 1U; /* disable INTST0 interrupt */
TXD0 = *gp_Uart0TxAddress;
gp_Uart0TxAddress++;
g_Uart0TxCnt--;
STMK0 = 0U; /* enable INTST0 interrupt */
}
return (status);
}
MD_STATUS R_UART0_Receive(uint8_t *rxbuf, uint16_t rxnum)
{
MD_STATUS status = MD_OK;
if (rxnum < 1U)
{
status = MD_ARGERROR;
}
else
{
g_Uart0RxCnt = 0U;
g_Uart0RxLen = rxnum;
gp_Uart0RxAddress = rxbuf;
}
return (status);
}
void R_UART0_Start(void)
{
STIF0 = 0U; /* clear INTST0 interrupt flag */
STMK0 = 0U; /* enable INTST0 interrupt */
SRIF0 = 0U; /* clear INTSR0 interrupt flag */
SRMK0 = 0U; /* enable INTSR0 interrupt */
SREIF0 = 0U; /* clear INTSRE0 interrupt flag */
SREMK0 = 0U; /* enable INTSRE0 interrupt */
SO0 |= 0x01; /* Serial data output of channel 0 is "1" */
SOE0 |= 0x01U; /* enable UART0 output */
SS0 |= 0x03; /* enable UART0 receive and transmit */
}
void R_UART0_Stop(void)
{
ST0 |= 0x03; /* disable UART0 receive and transmit */
SOE0 &= ~0x01; /* disable UART0 output */
STMK0 = 1U; /* disable INTST0 interrupt */
STIF0 = 0U; /* clear INTST0 interrupt flag */
SRMK0 = 1U; /* disable INTSR0 interrupt */
SRIF0 = 0U; /* clear INTSR0 interrupt flag */
SREMK0 = 1U; /* disable INTSRE0 interrupt */
SREIF0 = 0U; /* clear INTSRE0 interrupt flag */
}
定时中断源代码:
__interrupt void R_TAU0_Channel0_Interrupt(void)
{
static uint16_t oledflash=0;
oledflash++;
if(oledflash >400)
{
if(1 == oldeflashflag){ oldeflashflag=0; }
else { oldeflashflag=1; }
oledflash =0;
if(starttimeflag)
{
R_InvertLED(); /* Set new timer interval & LED output */
nowsec++;
if(nowsec==60)
{
nowsec =0;
nowmin++;
if(nowmin==60){ nowhour++; }
}
if((nowsec == sec)&&(nowmin == min)&&(nowhour == hour)){ starttimeflag =0;}
}
}
}
|
赞赏
-
1
查看全部赞赏
-
|