查看: 7244  |  回复: 8
参赛作品《RGB全彩显示创意时钟》
单片机技术宅
2
主题
5
回复
发表于2018-05-08 10:36:29 | 显示全部楼层
1# 电梯直达

【报名阶段需要填写的内容】


1. 参赛者姓名(必填项):毕世良


2. 单位或学校名称(选填项):


3. 当前职务或职称(选填项):


4. 参赛作品的名字(必填项):RGB全彩显示创意时钟


5. 简要陈述您的idea和作品(必填项):

    现想到的作品雏形是这样的,时钟由两部分组成,中间才用1寸(或更大的数码管显示当前时间,日期,温度等信息)外面是一圈60个RGB的LED,显示当前的秒数据,在12点,3点,6点,9点上的LED用特殊颜色显示,外面一圈显示秒数据的LED是RGB全彩的,所以可以显示任意颜色,成品可以做出多种显示样式,多种颜色,可供用户选择,也可随机显示。

    功能方面:a、采用高精度时钟芯片,确保走时精准,

             b、可以加入温度,湿度等信息的采集及显示,

             c、准备加入充电管理电路,接上锂电池,实现无需外接电源

             d、加入红外遥控调试功能

             e、外观采用亚克力板或木质盒子,制作为可挂可立摆放,此条暂定,看制作时间是否允许。

6. 拟用到的立创商城在售物料(必填项):stc单片机芯片,LED数码管,时钟芯片


7. 拟用到的非立创商城物料或其它补充(必填项):电阻,电容


8. 拟用到的EDA工具软件名称(必填项):LCEDA


【作品正式发表(报名成功后进入设计阶段)需要填写的内容】


一、作品简介

例如,可以包括但不局限于以下内容:

1.作品的整机外观图片或焊接组装好的PCBA图片;

 点击查看大图

 点击查看大图

 点击查看大图

 点击查看大图

 点击查看大图

 点击查看大图

2.作品的研究背景、目的和功能、市场应用前景;

    走时精度高,省去频繁调整时间的时钟,是每个家庭,每个人都需要的。本作品设计为圆形显示,继承了传统指针式钟表的外观,但是具有了电子时钟的高精度和便捷。

    功能:1、高精度万年历 2 、自带温度检测 3、时间、日期、星期、温度分屏滚动显示  4、闹铃功能  5、显示亮度可调  6、可锂电池供电和充电  7供电方式多选(usb/锂电池/usb边充电边供电)


3.作品在创新性、趣味性、实用性甚至公益性方面,有哪些亮点可体现?

   采用高精度时钟芯片DS3231,省去外部晶振,采用内部集成时钟,内部集成时钟会以64秒的周期去自动的检测温度来调整时钟矩阵,从而到达高精度。采用1寸高亮数码管显示外加RGB-LED显示秒数据,显示可以多样化选择,增加了美观性和趣味性。留出蓝牙接口后续可以加入蓝牙连接手机读取手机时间来设置自身时间。


二、系统构架图

用流程图或思维导图等形式,描述您的作品的组成构架,即方案图。

 


三、硬件部分的描述

1.附上原理图&PCB实物图的图片或者源文件(官方建议大家尽量用源文件上传),如果是图片,请确保图片是清晰可辨的;

RGB创意时钟原理图.pdf 

RGB创意时钟PCB.pdf 

2.用文字把该作品的实现原理、系统的工作过程大致讲解一下。

    本设计为了追求走时的精度问题,采用了高精度,能自动调整晶振矩阵的时钟芯片DS3231,此时钟芯片产生标准的实时时钟数据,单片机通过读取数据,最终显示。时间,日期,星期,温度等信息采用1寸大数码管显示,时钟的秒数据采用的PCB外圈的60个RGB全彩的5050LED显示,显示样式可选,数码管和RGB-LED的显示亮度会随着环境亮度自动调节,显示到此结束,程序还做了闹铃,整点报时等功能。在时间的设置调整上,可以采用产品背面的两个贴片按键实现,还可以通过红外遥控器实现时间的设置,还可以插上蓝牙模块和手机连接获取手机的时间来设置自身时间(此部分程序还为实现,电路接口以留出,后续程序更新将实现此功能)。

3.注明所用到的EDA工具软件名称并附上设计链接。

设计软件用的就是立创EDA,工程首页链接https://lceda.cn/account/project?project=673f3d7cec3b4a028e8f153a97ecebd4


四、材料清单(BOM列表)

列出您这个作品所用到的主要器件(关键器件即可),比如单片机&ARM芯片、专用集成芯片(ASIC)、传感器、功能模块等。

如果所列出的芯片是来自我们立创商城上的,最好能写出该器件的商品编号或附上对应购买链接。

 点击查看大图

 点击查看大图


五、软件部分的描述(选填)

如果您的作品涉及到软件,请列出作品对应的软件工作流程图,及关键部分的例程、源码(如果您想开源的话请上传全部源码)。

   点击查看大图


//---------------------------------------------------------------
// 函数功能:    定时器中断服务函数    
// 参数:                                        
//---------------------------------------------------------------
void timer0_ser() interrupt 1{
	time++;
	if(time==10){									//100us   //亮度调节
		time=0;
		time0++;		
		if(time0==10){   							//1000us=1ms    // 刷新数码管显示
			flag_disp=1;							//数码管刷新标志位
			time0=0;
			time1++;
			time_ms++;     							//1ms加1,用作按键扫描
			if(time_ms==20){flag_key=1;time_ms=0;}    //20ms时间到,去扫描按键一次。							
			if(time1==500){     					//0.5s  读取数据 
				time1=0;
				flag_key_shanshuo=~flag_key_shanshuo;    //0.5s时间闪烁标志位
				time_05s++;
				if(time_05s==2){    					//1s 时间到,
					time_05s=0;
					flag_sec=1;    						//1s 标志位
					sec++;								//1秒记录,用于切换显示数据
					if(sec==25){sec=0;}					
				}
				
			}
		
		}
		
	} 
  
}
以下是DS3231驱动函数部分
//---------------------------------------------------------------
// 函数功能:    //IIC总线限速延时函数  需要包含  <intrins.h>
// 参数:       无                                  
//---------------------------------------------------------------
void delay_IIC()  
{
	_nop_();_nop_();_nop_();_nop_();
}
//-------------------------------------------------------------------
// 函数功能:    IIC总线初始化函数    
// 参数:       无                                 
//---------------------------------------------------------------
void IIC_Init()  
{
   // IIC_RST=1;
    IIC_SDA=1;     //释放IIC总线的数据线。
    IIC_SCL=1;     //释放IIC总线的时钟线。
}
//---------------------------------------------------------------
// 函数功能:   IIC总线产生起始信号函数     
// 参数:       无                                 
//---------------------------------------------------------------
void IIC_start()
{    
     IIC_SDA=1;//拉高数据线
     IIC_SCL=1;//拉高时钟线
    // delay_IIC();
     IIC_SDA=0;//在时钟线为高电平时,拉低数据线,产生起始信号。
    // delay_IIC();
     IIC_SCL=0;//拉低时钟线
}
//---------------------------------------------------------------
// 函数功能:   IIC总线产生停止信号函数     
// 参数:       无                                 
//---------------------------------------------------------------
void IIC_stop()
{
    IIC_SDA=0;//拉低数据线
    delay_IIC();
    IIC_SCL=1;//拉高时钟线。
    delay_IIC();
    IIC_SDA=1;//时钟时线为高电平时,拉高数据线,产生停止信号。
    delay_IIC();
}
//---------------------------------------------------------------
// 函数功能:    接收应答信号函数    
// 参数:      返回 bit ack 应答信号                                  
//---------------------------------------------------------------
bit IIC_Tack()
{
    bit ack;//定义一个位变量,来暂存应答状态。
    IIC_SDA=1;//释放数据总线,准备接收应答信号。
    delay_IIC();
    IIC_SCL=1;//拉高时钟线。
    delay_IIC();
    ack=IIC_SDA;//读取应答信号的状态。
    delay_IIC();
    IIC_SCL=0;//拉低时钟线。
    delay_IIC();
    return ack;//返回应答信号的状态,0表示应答,1表示非应答。
}
//---------------------------------------------------------------
// 函数功能:     向ds3231写入一个字节的数据函数   
// 参数:     写入数据 Data                                   
//---------------------------------------------------------------
void IIC_write_byte(unsigned char Data)
{
    unsigned char i;
     for(i=0;i<8;i++)//有8位数据
    {
        IIC_SDA=Data&0x80;//写最高位的数据
          delay_IIC();
          IIC_SCL=1; //拉高时钟线,将数写入到设备中。
        delay_IIC();
        IIC_SCL=0;//拉低时钟线,允许改变数据线的状态
        delay_IIC();
        Data=Data<<1;//数据左移一位,把次高位放在最高位,为写入次高位做准备
    }
}
//---------------------------------------------------------------
// 函数功能:     从ds3231读取一个字节的数据函数   
// 参数:        返回 读到的数据 Data                                
//---------------------------------------------------------------
unsigned char IIC_read_byte()
{
    unsigned char i;
    unsigned char Data;       //定义一个缓冲寄存器。
    for(i=0;i<8;i++)//有8位数据
    {
        IIC_SCL=1;//拉高时钟线,为读取下一位数据做准备。
        delay_IIC();
        Data=Data<<1;//将缓冲字节的数据左移一位,准备读取数据。
        delay_IIC();
       
        if(IIC_SDA)//如果数据线为高平电平。
            Data=Data|0x01;//则给缓冲字节的最低位写1。
        IIC_SCL=0;//拉低时钟线,为读取下一位数据做准备。
        delay_IIC();
    }
    return Data;//返回读取的一个字节数据。
}
//---------------------------------------------------------------
// 函数功能:    向任意地址写入一个字节数据函数    
// 参数:        写入 地址 waddr  数据 Data                                
//---------------------------------------------------------------
void IIC_single_byte_write(unsigned char Waddr,unsigned char Data)
{
    IIC_start();//产生起始信号
    IIC_write_byte(0xd0);//写入设备地址(写)
    IIC_Tack();//等待设备的应答
    IIC_write_byte(Waddr);//写入要操作的单元地址。
    IIC_Tack();//等待设备的应答。
    IIC_write_byte(Data);//写入数据。
    IIC_Tack();//等待设备的应答。
    IIC_stop();//产生停止符号。
}
//---------------------------------------------------------------
// 函数功能:    从任意地址读取一个字节数据函数    
// 参数:        写入 地址 waddr  返回 该地址下的数据 Data                                
//---------------------------------------------------------------
unsigned char IIC_single_byte_read(unsigned char Waddr)
{
    unsigned char Data;//定义一个缓冲寄存器。
    IIC_start();//产生起始信号
    IIC_write_byte(0xd0);//写入设备地址(写)
    IIC_Tack();//等待设备的应答
    IIC_write_byte(Waddr);//写入要操作的单元地址。
    IIC_Tack();//等待设备的应答。
    IIC_stop();//产生停止符号。

    IIC_start();//产生起始信号
    IIC_write_byte(0xd1);//写入设备地址(写)
    IIC_Tack();//等待设备的应答
    Data=IIC_read_byte();//写入数据。
    delay_IIC();
    IIC_stop();//产生停止符号。
    return Data;//返回读取的一个字节数据。
}
//---------------------------------------------------------------
// 函数功能:   读取ds3231时间   
// 参数:       读取到的时间数据保存到 l_tmpdate[i]   数组                               
//---------------------------------------------------------------
void Read_RTC(void)   
{
    unsigned char i,p;
	IIC_Init();  
	p=0;
    for(i=0;i<7;i++)            //分7次读取 秒分时日月周年
    {
      l_tmpdate[i]=IIC_single_byte_read(p);
      p++;
    } 
	WH=IIC_single_byte_read(0x11);		//读取温度高位
	WL=IIC_single_byte_read(0x12);   //读取温度小数
}
//---------------------------------------------------------------
// 函数功能:  设置时间      
// 参数:      写入 set_time[] 数组里的时间                                  
//---------------------------------------------------------------
void Set_RTC(void)   
{
    unsigned char i;
	IIC_Init();  
     for(i=0;i<7;i++)        // 分7次写入 秒分时 星期 日月年
     {
        IIC_single_byte_write(i,set_time[i]);
    }
    IIC_single_byte_write(0x0e,0x00);     //启动振荡器,输出方波1HZ,不启动温度转换,两组闹铃中断关闭
}
//---------------------------------------------------------------
// 函数功能:   初始化时钟芯片  设置时钟控制寄存器
// 参数:       无                                 
//---------------------------------------------------------------
void DS3231_Initial()  
{
   // IIC_RST=1;
    IIC_SDA=1;//释放IIC总线的数据线。
    IIC_SCL=1;
    IIC_single_byte_write(0x0e,0x00); //启动振荡器,输出方波1HZ,不启动温度转换,两组闹铃中断关闭
}


六、作品演示

请上传您的作品的功能演示到腾讯视频,并编辑到本楼(或附上视频链接)。按要求上传视频可获得10分,具体详见活动规则。

邀请你看《第三届立创电子制作节RGB全彩显示创意时钟》https://v.qq.com/x/page/u0762909pb0.html?pcsharecode=B3IIwqqK&sf=uri


七、总结

例如您在完成该作品过程中的一些体会、碰到的技术问题或调试经验、作品的未来规划,及对我们主办方的建议和意见等。

    终于完成了,遇到最大的问题就是没有时间,自己拖延症又犯了,再加工作原因,在制作期间外出了2个月,所以最后只能草草完成一个样品,外壳没做,只是有亚克力简单做了块面板来做出显示效果。

电路设计方面还是不够简洁,后续版本打算改用ws2812做显示,再把中间捞空,这样出来的效果会更好一点。在后续的版本中会实现蓝牙设置时间的更能。

    因为第一次使用立创EDA,所以在摸索中画图,费了好多时间。软件实现pcb中挖空功能有些麻烦,没有资料,最后好不容易才在官方资料中找到方法,无奈那会板子已经发出打样了。


YeeRay
7
主题
215
回复
发表于2018-05-08 19:54:58   |  显示全部楼层
3#

楼主,能解答下这个帖子里的问题么?

http://club.szlcsc.com/article/details_12775_1.html


主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部