424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

发表于 2014-3-20 10:06 | 显示全部楼层
本帖最后由 ahao 于 2014-3-20 14:06 编辑

客厅的低功耗小主机,下载东西、临时查个资料什么的,可以长期运行,装有监控卡也可以充当监控器使用。

还有一个电源控制部分,集12v电源和控制一体,可以提供小主机的12v供电,和电视、机顶盒的电源控制。大致功能:需要看电视时按下电视遥控器任意一个按键,控制器接收到遥控信号继电器吸合,电视机、机顶盒接通220v市电,电视机、机顶盒可以开机收看节目;关机时只需遥控关闭电视机,控制器延时20分钟后彻底切断电视和机顶盒的220v市电。(这个功能是我专门为家人制作的,因为我家人只会遥控关闭电视,从来不会主动去拔插头或者关闭插排上的开关,造成电视机长期通电,浪费电不说某种程度上也存在一些安全隐患)目前这个控制部分已经稳定使用几个月了,效果相当理想,再也不用担心电视机长期不断电了。




图片稍后更新

如图,上面白色的是小主机,中间银色的是电源控制,显示P126表示目前电视机、机顶盒功耗126瓦(显示值不准确只是模拟出来的大概值)。
00.jpg

424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2014-3-20 10:06 | 显示全部楼层
本帖最后由 ahao 于 2014-3-20 10:42 编辑

小主机改造过程


淘的一个低功耗小主机
01.jpg

旁边是监控卡
02.jpg

接口和挡板部分碍事,下了
03.jpg


适当处理能插到pci插槽上了
04.jpg
05.jpg

但是盖不上盖子,又淘了一个90度拐弯的pci转接卡
06.jpg

插上转接卡试机发现监控卡失灵,后经多次对比测试是转接卡金手指部分两侧插针定义问题,打通孔焊接导体短接。
07.jpg

再次试机ok了,监控卡工作已经正常
08.jpg


小主机主板上预留一个能插笔记本无线网卡的插槽,不能浪费了。拆了一个报废笔记本的无线网卡和天线部分强制装上去了
09-0.jpg
09.jpg

天线部分随便粘在机壳外面,测试信号刚刚的。
10.jpg

424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2014-3-20 10:07 | 显示全部楼层
本帖最后由 ahao 于 2014-3-20 10:44 编辑

控制电源部分

找了一个DVB的壳子,按需要进行适当裁切。
11.jpg

电源部分
12.jpg

控制部分,用的单片机是STC12C5A08S2
13.jpg

424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2014-3-20 10:08 | 显示全部楼层
本帖最后由 ahao 于 2014-3-20 10:49 编辑

电路原理和程序部分

控制部分原理图.gif



程序如下红字部分

#include "STC12C5A60S2.H"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit gewei=P1^7;
sbit shiwei=P1^6;
sbit baiwei=P1^5;
sbit qianwei=P1^4;
sbit dian=P3^7;

sbit on=P0^0;
sbit key=P1^3;
sbit ir=P1^1;

uint tt_on,xyz,adc_p;
uchar tt_js,tt_off,tt01,tt02,tt11,tmp,m,zt1,zt2;

uchar code led[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //定义led 0-9数组

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=100;y>0;y--);
}

uint get_ad_result(uchar channel)                //AD转换函数
{
        uchar ad_finished=0;                                //存储A/D转换标志
        ADC_RES=0;                                                        //高8位清零
        ADC_RESL=0;                                                        //低2位清零
        channel&=0x07;                                                //0000 0111 清零高5位
        ADC_CONTR=0x60;                                                //转换速率为70个时钟周期转换1次
        _nop_();
        ADC_CONTR|=channel;                                        //选择A/D当前通道                                       
        _nop_();
        ADC_CONTR|=0x80;                                        //启动A/D电源
        delay(1);                                                        //延时一下使输入电压达到稳定
        ADC_CONTR|=0x08;                                        //0000,1000 令 ADCS = 1, 启动A/D转换,
    ad_finished=0;
    while(ad_finished==0)                        //等待A/D转换结束
    {
        ad_finished=(ADC_CONTR&0x10);         //0001,0000 测试A/D转换结束否
    }
    ADC_CONTR&=0xE7;                              //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
        return(ADC_RES*256+ADC_RESL);                //返回 A/D 高8位+低2位转换结果
}

void display(uint abc)
{
        if(on==1)                                                          //开机状态时数码管显示功率
        {
                if(abc>15)                                                 //功耗大于15显示具体值
                {
                        P3=led[abc%10];
                        gewei=0;
                        delay(20);
                        gewei=1;
                        
                        P3=led[abc%100/10];
                        if(abc>=10)
                                shiwei=0;
                        delay(20);
                        shiwei=1;
               
                        P3=led[abc%1000/100];
                        if(abc>=100)
                                baiwei=0;
                        delay(20);
                        baiwei=1;
                  
                          if(abc>=1000)
                                P3=led[abc/1000];         
                        else
                                P3=0x73;                        //显示P 0111 0011 表示电视功耗                        
                        qianwei=0;
                        delay(20);
                        qianwei=1;
                }
                else                                                  //否则功耗小于15时
                {
                        P3=0x40;                                //显示---- 0100 0000
                        gewei=0;
                        delay(20);
                        gewei=1;

                        shiwei=0;
                        delay(20);
                        shiwei=1;

                        baiwei=0;
                        delay(20);
                        baiwei=1;

                        qianwei=0;
                        delay(20);
                        qianwei=1;
                }
        }
        else                                                 //关机状态时只显示百位上的点
        {
                P3=0x00;
                dian=1;
                baiwei=!baiwei;               
                delay(20);
        }
}

void init()
{
        TMOD=0x11;                           //设定定时器0工作方式
        EA=1;                                         //开总中断

        ET0=1;                                         //开定时器0
        TR0=1;                                         //启动定时器0
        TH0=(65536-50000)/256;         //高8位装初值 定时50ms
        TL0=(65536-50000)%256;         //低8位装初值

        ET1=1;                                         //开定时器1
        TH1=(65536-1000)/256;         //高8位装初值
        TL1=(65536-1000)%256;         //低8位装初值
}

void main()
{
        P0M0=0x01;                                        //0000 0001 设定P0/0口为强推挽输出模式
        P3M0=0xff;                                  //1111 1111 设定P3口为强推挽输出模式
        P1ASF=0x01;                                        //0000 0001 将P1.0置为模拟口
        AUXR1|=0x04;                                //0000 0100 令ADRJ=1,10位A/D转换结果的最高2位放在ADC_RES寄存器,低8位放在ADC_RESL
        ADC_CONTR|=0x80;                        //打开A/D转换电源启动A/D转换        
        init();
        xyz=0;
        on=0;

        while(1)
        {
                if(on==0)                                          //关机状态时遥控有效
                {
                        if((ir==0)&&(m==1))                  //有遥控信号产生同时变量m为1时
                        {
                                tmp++;
                                m=0;                                  //变量置0,目的是只让进入此函数一次
                                tt_off=0;

                                  if(tmp<15)                           //开启定时器1
                                {
                                        TR1=1;
                                }
                                else                                //超过15个脉冲后判断变量值
                                {
                                        if(tt11<40)                //如果用时不超过40ms就开机
                                                on=1;
        
                                        TR1=0;                        //关闭定时器1,变量置0
                                        tt11=0;
                                        tmp=0;
                                }
                        }
        
                        if(ir==1)
                        {
                                m=1;
                        }

                        if(tt_off>20)
                                display(0);
                        tt_on=0;
                }

                else                                                 //开机状态下
                {
                        if(xyz<20)                                //功耗小于20 延时后关机
                        {
                                tt_js=1;                           //计时变量置1,开始计时
                                if(tt_on>24000)                   //50ms*24000=1200s=20分钟
                                        on=0;        
                        }
                        else
                        {
                                tt_js=0;
                                tt_on=0;
                        }               
                        
                        if(tt02>5)                                                   //300msAD转换一次
                        {
                                adc_p=get_ad_result(0);          //算出具体电压值模拟功率
                                if(adc_p>30)
                                        xyz=adc_p*0.63+18;
                                else
                                        xyz=adc_p*1.2;
                                 tt02=0;
                         }

                        display(xyz);        
                }

                if(key==0)                                                   //开关机按键按下
                {
                        zt1=1;
                        if(tt01>=10)                                //延时500ms消抖
                        {
                                if(zt2==0)
                                {
                                        on=~on;                                //执行开机或者关机动作
                                           zt2=1;
                                }
                        }
                }
                else
                {
                        zt1=0;
                        tt01=0;
                        zt2=0;        
                }
        }

}

void timer0() interrupt 1                          //定时器0中断程序        装初值50ms
{
        TH0=0x3c;                                                //TH0=(65536-50000)/256;
        TL0=0xb0;                                                //TL0=(65536-50000)%256;
        if(zt1==1)
        {
                if(tt01<100)
                        tt01++;
        }

        if(tt02<100)
                tt02++;

        if(tt_off<100)
                tt_off++;

        if(tt_js==1)
        {
                if(tt_on<50000)
                        tt_on++;
        }
}

void timer1() interrupt 3                        //定时器1中断程序        装初值1ms
{
        TH1=0xfc;                                      //TH1=(65536-1000)/256;                        
        TL1=0x18;                                      //TL1=(65536-1000)%256;
        if(tt11<100)                                     //让变量tt11最大为100
                tt11++;
}

点评

A板的脑袋就是好使,总能整出稀奇实用的小玩意,A板的贴详细严谨堪称表范!  发表于 2014-3-20 21:59

评分

参与人数 1经验 +10 魅力 +10 收起 理由
兄妹小江 + 10 + 10 赞一个!

查看全部评分

1

主题

0

好友

56

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
649241
帖子
327
精华
0
经验
56 点
金钱
54 ¥
注册时间
2013-12-18
发表于 2014-3-20 10:21 | 显示全部楼层
主意不错啊,向版主学习啦。

75

主题

1

好友

909

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
239981
帖子
3102
精华
0
经验
909 点
金钱
857 ¥
注册时间
2010-9-13
发表于 2014-3-20 13:11 | 显示全部楼层
顶A版,好像在HTPC版块有人直接用遥控控制主机的

72

主题

2

好友

4886

积分

罗宾汉 当前离线

小撸则已。。。大撸伤己。。。

Rank: 7Rank: 7Rank: 7

UID
499605
帖子
5240
精华
0
经验
4886 点
金钱
4174 ¥
注册时间
2012-5-27
发表于 2014-3-20 22:01 | 显示全部楼层
支持折腾!
貌似功耗也不低,我拆了一台用类似主板的终端机,电源部分用+12V开关电源供电,经过一个带稳压和控制的一个小PCB得出主板所需电源。估计功耗在数十W。。。

这种终端机俺也有一台闲置的(专门用于那种远程多媒体广告播放的终端机)。。。就是性能不行,跑个XP也卡。。。应该没有利用的余地了

3

主题

0

好友

-18

积分

禁言警告级 当前离线

Rank: 1

UID
533787
帖子
52
精华
0
经验
-18 点
金钱
46 ¥
注册时间
2012-10-7
发表于 2015-8-12 22:30 | 显示全部楼层

2

主题

0

好友

58

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
798932
帖子
81
精华
0
经验
58 点
金钱
55 ¥
注册时间
2015-8-25
发表于 2015-9-5 20:22 | 显示全部楼层
这个主意真不错

8

主题

0

好友

173

积分

论坛游民 当前离线

生活,不将就

Rank: 3Rank: 3

UID
502332
帖子
322
精华
0
经验
173 点
金钱
160 ¥
注册时间
2012-6-7
发表于 2015-9-7 00:09 | 显示全部楼层
版主全能啊,搞出这么大的工程

1

主题

0

好友

55

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
792967
帖子
90
精华
0
经验
55 点
金钱
53 ¥
注册时间
2015-5-21
发表于 2015-9-21 03:15 | 显示全部楼层
思路不错哦,有直接成品吗?
头像被屏蔽

1

主题

0

好友

1153

积分

禁止发言 当前离线

音乐狂神

UID
20218
帖子
1118
精华
0
经验
1153 点
金钱
967 ¥
注册时间
2007-3-15

乐于助人

发表于 2021-2-2 02:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版| ( 鄂ICP备2025138941号-3 ICP证:鄂B2-20130019 公安局网监备:420100007348 邮箱:1343292467@qq.com )

GMT+8, 2025-11-21 11:26 , Processed in 2.237492 second(s), 13 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部