3712|0

6105

帖子

4

TA的资源

版主

楼主
 
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

【R7F0C809】家用用电无线控制定时器 [复制链接]

本帖最后由 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

查看全部赞赏

点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表