CMF海水论坛

 找回密码
 注册
img_loading
智能检测中
楼主: fpack

炎炎夏日自己搞个小水冷

    [复制链接]
发表于 2012-7-23 22:59:50 | 显示全部楼层 来自: 中国上海
回复 83# fpack


    给个链接
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2012-7-23 23:44:58 | 显示全部楼层 来自: 中国上海
炎炎夏日需要一个清凉的地 - 自制水冷系统(九 高温作业:焊接)


周六发现没电容元件,郁闷之余发现小板上不需要电容就能焊。
小的显示控制板没有电容,元件比较少,比较困难的是PFC0.5 20脚的连接器。先练下手^^。


LED贴片指示灯和连接器已经焊好了。


按键和LED!完工了,发现效率还是蛮高的。哈哈~~



吸锡线,这个用来吸掉那个引脚很密的连接器上多余的锡。作为新手,只能依靠强大的工具来完成。

很多视频网站上很强大的焊接手法,小弟学不会。
要练这个比较好的一种方法就是去找没用滴电路板,拆了上面的零件然后再焊。不怕坏掉,又没有成本!哇咔咔~~ 。拆的好还可以搞几个高质量元器件,这可是一举多得的事情。


速度很快,周六定的电容包中午就送到。淘宝真的是很好用,不用出门元器件就送到家。
周末上海艳阳高照,北京变成大海的时候。我在焊板子~~~ -_-!!!

准备焊主控板。STC 48脚的51芯片非常迷你~ 呵呵~ ,原来有5颗,前段时间做测试版,被我搞坏了1颗。


焊锡膏,用棉签直接涂到焊盘引脚上。


焊盘上涂层焊锡膏,感觉焊锡膏比较好用。黏糊糊的还能帮忙定位芯片,不会滑动。



芯片对齐后直接上锡定位。~。~ 原本是想拖焊的,结果搞不定就变成这幅鸟样鸟。



上面的贴片焊接完成。焊完发现一个问题 -_-!! 20脚的连接器2变都是同方向,买的时候没有买反向连接线,看来考虑不周问题还是多多。


电路板上可以看到,51芯片和其他原件都离的很远。那是应为没有把握焊好,会碰到其他元器件,才留出这么大空隙。按现在的情况看,以后做的更紧凑些。比较板子每50mm是一个档次,做小了可以节约很多打样的钱。成本就能低点。


晚上下班比较完,周末有事情还有些元件没焊完╮(╯_╰)╭。先给自己提提神,来杯咖啡,O(∩_∩)O~还是要享受一下,继续搞!



还留的一些插件没有什么技术难度,所哟很快就搞定。成品效果!



再来张


来张背面的,又看到反印的Logo了╮(╯▽╰)╭


插接好排线的样子



工作台,脏乱差~~ 上面一堆东西。最值钱的焊台,作为长期使用,作为新手~~ 这个焊台确实好用,能直接控制焊接温度,想要几度就几度非常方便!
为啥要焊台主要是以前没学过焊接,这种细致活如果没练过真的心里一点底都没有。所以搞个高档点的可以省去很多麻烦。

后面那个绿色的板子已经被我蹂躏的不成样子,所有的元件能拆的都被我拆光了。还拆到几颗高档电容。O(∩_∩)O哈哈~


焊接使用的是刀型的烙铁头,感觉这个比较好用。所有元件都是使用这个头焊的,没换过其他头。
网上很多视频都有介绍刀型头的使用方法。大家如果感兴趣可以去看看,真正的大虾门用刀头那可是出神入化。



焊完用万用表打一下,一切OK!再来张成品稿,这种有俺的爪子。O(∩_∩)O~
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2012-7-23 23:49:11 | 显示全部楼层 来自: 中国上海
本帖最后由 fpack 于 2012-7-23 23:50 编辑

回复 85# 红酒

    江浙沪的打样包邮。我那个是广州打样的,快递要25元,太亏了 =_=。
    http://s.taobao.com/search?q=pcb ... 5%E3%BB%A6#J_Filter
回复 支持 2 反对 0

使用道具 举报

发表于 2012-7-24 09:19:38 | 显示全部楼层 来自: 中国河南驻马店
这东西不是一般人能D的{:2_47:}
回复 支持 2 反对 1

使用道具 举报

 楼主| 发表于 2012-7-24 17:28:30 | 显示全部楼层 来自: 中国上海
本帖最后由 fpack 于 2012-7-24 17:30 编辑

慢慢来嘛,我也是现学先用的。


  如果谁给我太车床~~~~~~~~~~~~ ,再给我些铀~ , 哇咔咔~~~ !!!
回复 支持 3 反对 1

使用道具 举报

发表于 2012-7-25 00:00:22 | 显示全部楼层 来自: 中国北京
外观和简单的电路我还能看懂,这样的目前是望尘莫及了,继续关注
回复 支持 反对

使用道具 举报

发表于 2012-7-25 19:43:01 | 显示全部楼层 来自: 中国上海
fpack 发表于 2012-7-23 23:49
回复 85# 红酒

    江浙沪的打样包邮。我那个是广州打样的,快递要25元,太亏了 =_=。

江浙沪正好包邮
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-25 20:47:30 | 显示全部楼层 来自: 中国上海
呵呵,是不错!

小弟双面板还没做过,所以为了减少问题,直接打样确实是比较方便。就是费点钱
回复 支持 2 反对 0

使用道具 举报

发表于 2012-7-25 21:34:54 | 显示全部楼层 来自: 中国浙江杭州
不错呀,我一直在关注,继续等上精品
回复 支持 反对

使用道具 举报

发表于 2012-7-26 10:18:38 | 显示全部楼层 来自: 中国北京
这个太牛B了,实在是佩服
回复 支持 反对

使用道具 举报

发表于 2012-7-30 13:50:54 | 显示全部楼层 来自: 中国辽宁营口
怎么没动静了
回复 支持 反对

使用道具 举报

发表于 2012-8-1 11:03:53 | 显示全部楼层 来自: 中国江苏苏州
达人啊 神一般的制作 膜拜一下
强烈要求预定一套 QQ110747916
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-2 13:19:26 | 显示全部楼层 来自: 中国上海

公司接手了一个项目,脱不开身。
这段时间程序难产了,搞了很长时间程序没没搞定。
回复 支持 30 反对 4

使用道具 举报

发表于 2012-8-7 17:28:47 | 显示全部楼层 来自: 中国香港

达人啊 神一般的制作 膜拜一下
强烈要求预定一套 QQ614006757
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-9 00:57:56 | 显示全部楼层 来自: 中国上海
终于调试通过啦!哇咔咔~~ 不容易啊。
回复 支持 31 反对 6

使用道具 举报

 楼主| 发表于 2012-8-10 01:30:14 | 显示全部楼层 来自: 中国上海
炎炎夏日需要一个清凉的地 - 自制水冷系统(十一 指尖的思绪之程序篇)


前段时间接手了一个项目,所以DIY的进程有些停滞。实际编写的程序并没有多长时间,得益于Keil这个强大的IDE。能在第一次做51开发的时候,如此顺利的完成代码。

不多说废话了,说明下代码的具体思路。具体思路根据(六 控制系统原理图)进行拆分。分为温度显示部分、指示灯、温度获取和继电器操控部分。

LEDDisplay.c            --- 温度显示模块
PilotLamp.c             --- 指示灯控制模块
Temperature.c
12b20Temperature.asm    --- 温度读取模块
Relays.c                --- 继电器控制部分

系统主要控制的指数
1、读取温度的间隔时间
2、在调整温度的时候显示制冷控制温度时间。
3、当达到制冷温度设定值时,关闭或开启控制器一个缓冲量。防止在阀值的时候出现上下跳变问题。
4、控制调整温度的调节范围和调节量

开发中的主要阻力还是来至于温控IC。18B20的时序操作非常严格。如果要自己写调试太耗时间。因此直接从前辈取材,汇编是控制时序是最精确的,在网上找到的很多代码基本也是以汇编为主。我的代码是从杜洋老师已调整好读写时序的汇编代码改编而来。做了些小改动,把温度的精度提高到0.06°C。

另外一个让人抓狂的问题,没能找到根源解决。汇编和C混合开发中,变量的存储地址出现混乱。主程序部分的变量被汇编中的地址操作覆写,导致变量值被冲掉。不知道动了哪根筋,原来木问题后来才有这个问题。  -_-!!哭啊~~ 只能用一个方式规避这个问题,把被覆写变量的地址改为bdata段地址。修改后暂未发现程序中其他变量被覆写的问题。


调试的效果图




贴出第一次写51代码^^。小弟有一点开发经验,只是软硬结合的这种模式属于第一个。
--------------------------------
#include <STC12C5A60S2.h>

#include "Pins.h"
#include "LEDDisplay.h"
#include "Temperature.h"
#include "Relays.h"
#include "PilotLamp.h"

#define uchar unsigned char
#define uint        unsigned int

// 获取温度的时间间隔
#define TEMPGETCOUNT                       5000      // 温度读取间隔, 500ms 读一次温度,即1秒读2次温度。
#define        CHANGINGCOUNT                                        20000                        // 温度调控状态时会显示调控温度值,最长显示时间。
#define CRITICALCOUNTDOWN           5                       // 温度下临界跳变阀值
#define CRITICALCOUNTUP                    5                     // 温度上临界跳变阀值
#define CRITICALCOUNTERR      3         // 温度错误,3次关闭
#define DEFAULTCRITICALTEMP   2500      // 默认跳变温度 25°C
#define VALIDTEMPERATURE_MAX  3000      // 最大有效温度 30°C
#define VALIDTEMPERATURE_MIN  2000      // 最小有效温度 20°C
#define TEMPERATURESPET       50        // 0.5 °C 温度调整步长


#define COOL_POWERALL       0xFF        // 全力运行
#define COOL_MALAISE        0x00        // 萎靡~~~~~ 哇咔咔~~~

#define KEYPRESS_LONG       200         // 按键长按计数,如一只按住不放
#define KEYPRESS_SHORT      15          // 短按计数


#define FOSC  1843200L
#define T1MS        (65536-FOSC/12/1000)                        // 计时器工作频率 12T状态


uint CriticalTempVal;        // 临界温度,跳变温度
uint RealTempVal;     // 当前温度,获取一定次数时都
uint ChangeCount;                        // 临界切换计数

uchar RelayVal;                    // 继电器状态控制位 从右到左 0x03(0000 0011) 那么第一第二个继电器打开。
// 指示灯状态
// 第一位 继电器工作状态,灯亮工作状态,灯灭停止制冷                  
// 第二位 是否为自动模式
// 第三位 温控器故障
// 0000 0111
uchar DirectLamp;
uchar        bdata WorkStatus;
sbit InCritical                        = WorkStatus ^ 0;                                // 临界状态
sbit InWorking                        = WorkStatus ^ 1;                          // 工作状态
sbit InAuto                                        = WorkStatus ^ 2;                                // 自动模式
sbit InHandOn                                = WorkStatus ^ 3;                                // 手动打开状态
sbit CanReadTemp                = WorkStatus ^ 4;                          // 是否允许读取温度
sbit InInitTemp                        = WorkStatus ^ 5;                                // 温度读取是否在初始状态,解决第一次读取出现85°C的问题
sbit InChangingTemp        = WorkStatus ^ 6;                                // 在温度调整中


// 温度读取时间间隔,减少18B20的读取次数,
// 目的是为数码管能获得比较高的刷新频率,提高显示亮度。
// 每次读取会有固定占用时间,能看出每次读取会有变暗的闪烁情况。
uint TempTimerSpace;                                  

uint TempChangingStatusSpace;  // 温度调控状态中

void Init(void);
bit CanUpdateTemp(void);
void UpdateTemperature(void);
void ReadTemperature(void);
void UpdateStatus(void);
void InitTimer(void);
void SearchKeys(void);

unsigned int GetCriticalTemperature(void);
//void SaveCriticalTemperature(unsigned int);


// 按键
// 18 K3  17 K4  16 K5
sbit        Key_Mode          = P1 ^ 1;
sbit        Key_CTDown        = P1 ^ 0;       
sbit        Key_CTUp          = P0 ^ 0;

//enum KeyType (TNone=0, KTMode=1, KTCTDown=2, KTCTUp=4);

uchar KeyCount;
uchar KeyTypeVal;

#define        KEYTYPE_NONE                0 // 没有按键使用
#define KEYTYPE_MODE                1 // 按下模式切换状态
#define KEYTYPE_CTDOWN  2 // 按下温度切换状态
#define KEYTYPE_CTUP                4 // 按下温度切换状态


void main()
{
        Init();
        while(1){
          if (CanReadTemp)
                        ReadTemperature();
               
                SearchKeys();               
                UpdateStatus();       
                UpdateRelays(RelayVal);

                if (!InChangingTemp)
                        DisplayTemperature(RealTempVal);
                else
                        DisplayTemperature(CriticalTempVal);
               
                DisplayPilotLamp(DirectLamp);
        }
}

void Init(void){
        WorkStatus = 0x00;
        InAuto = 1;                    // 默认自动模式
       
        KeyCount = 0;
        KeyTypeVal = KEYTYPE_NONE;
        RealTempVal = DEFAULTCRITICALTEMP;
        CriticalTempVal = GetCriticalTemperature();

        InitTimer();
  InitPilotLamp();
        InitView();
        InitTemperature();
        InitRealys();
}

void SearchKeys(void){
        // 模式切换
        if (Key_Mode == 0){
                KeyTypeVal = KEYTYPE_MODE;
                KeyCount++;
        }

        // 温控温度
        if (Key_CTDown == 0) {
                KeyTypeVal = KEYTYPE_CTDOWN;
                KeyCount ++;
   
    // 长按状态
    if (KeyCount > KEYPRESS_LONG) {
      KeyCount = 0;
                        if (CriticalTempVal > VALIDTEMPERATURE_MIN) {
                                TempChangingStatusSpace = CHANGINGCOUNT;
                                CriticalTempVal -= TEMPERATURESPET;
                        }
    }
        }

        // 温控温度
        if (Key_CTUp == 0) {
                KeyTypeVal = KEYTYPE_CTUP;
                KeyCount ++;
  
    // 长按状态
    if (KeyCount > KEYPRESS_LONG) {
      KeyCount = 0;
                        if (CriticalTempVal < VALIDTEMPERATURE_MAX){
                                TempChangingStatusSpace = CHANGINGCOUNT;
                                CriticalTempVal += TEMPERATURESPET;
                        }
    }
        }

        if (KeyCount > KEYPRESS_SHORT){
                if (Key_Mode == 1 && KeyTypeVal == KEYTYPE_MODE){
                        KeyTypeVal = KEYTYPE_NONE;
                        KeyCount = 0;
                        if (InAuto){
                                InAuto = 0;
                                InHandOn = 1;
                        }
                        else {
                                if (InHandOn)
                                        InHandOn = 0;
                                else
                                        InAuto = 1;
                        }
                }
       
                if (Key_CTDown == 1 && KeyTypeVal == KEYTYPE_CTDOWN){
                        KeyTypeVal = KEYTYPE_NONE;
                        KeyCount = 0;
                        if (CriticalTempVal > VALIDTEMPERATURE_MIN) {
                                CriticalTempVal -= TEMPERATURESPET;
                                TempChangingStatusSpace = CHANGINGCOUNT;
                        }
                }
               
                if (Key_CTUp == 1 && KeyTypeVal == KEYTYPE_CTUP){
                        KeyTypeVal = KEYTYPE_NONE;
                        KeyCount = 0;
                        if (CriticalTempVal < VALIDTEMPERATURE_MAX) {
                                TempChangingStatusSpace = CHANGINGCOUNT;
                                CriticalTempVal += TEMPERATURESPET;
                        }
                }
        }
}


void ReadTemperature(void){
        unsigned int Val;
       
        Val = GetTemperature();       
       
        // 18B20有个特殊问题,第一次读取会出现 85°C
        if (InInitTemp && Val == 8500){
                CanReadTemp = 1;       
                return;
        }
       
        RealTempVal = Val;
  CanReadTemp = 0;
        InInitTemp = 0;
  //
  // 对于临界温度,需要特殊处理。
  // 防止温控在临界时频繁跳变,当在临界一侧温度超缓冲量时才允许跳转模式。
  // 当温控探头无效时优先处理
  //
        // 如果温控探头被拔出,再次插入的时候会出现 85°C的错误情况
        // 只要温度读取错误,那么就认为温控探头是被拔出状态。
        //
  if (RealTempVal == VAL_ERRTEMPERATURE){
                InInitTemp = 1;
    if (InCritical)
      ChangeCount--;
    else {
      InCritical = 1;
      ChangeCount = CRITICALCOUNTERR;
    }
  }
  else if (InWorking) {
                if (RealTempVal < CriticalTempVal){
                        if (InCritical)
                          ChangeCount--;
                        else {
                                InCritical = 1;
                                ChangeCount = CRITICALCOUNTDOWN;
                        }
    }
                else {
                        InCritical = 0;
      ChangeCount = 0;
    }
        }
        else {
                if (RealTempVal > CriticalTempVal){
                        if (InCritical)
                                ChangeCount --;
                        else {
                                InCritical = 1;
                                ChangeCount = CRITICALCOUNTUP;
                        }
                }
                else {
                        InCritical = 0;
      ChangeCount = 0;
    }
        }

}


void InitTimer(void){
        // 使用定时器1作为时间计数
        TMOD  = 0x01;
  TL0 = T1MS;
  TH0 = T1MS >> 8;
  TR0 = 1;
  ET0 = 1;
  EA = 1;  
       
        CanReadTemp = 0;
        TempTimerSpace = TEMPGETCOUNT; // 第一次温度读取
        InInitTemp = 1;                                                          // 温度处于初始状态,解决85°C问题
        TempChangingStatusSpace = 0;         // 不在调温状态
}


void UpdateStatus(void){
  //
  // 温控临界跳变, 缓冲计数为零时跳变
  //
  //
        if (InCritical && !ChangeCount){
          InCritical = 0;
          if ((RealTempVal != VAL_ERRTEMPERATURE) && (RealTempVal > CriticalTempVal))
                  InWorking = 1;
          else
                  InWorking = 0;                                                  
  }
       
        // 是否在调温状态
        if (TempChangingStatusSpace)
                InChangingTemp = 1;
        else
                InChangingTemp = 0;

  //
  // 温控状态和手工状态
  // 温控状态时根据是否工作状态判断,手动模式下通过是否强行开启判断继电器模式
  //  
  if((InAuto && InWorking) || (!InAuto && InHandOn))
          RelayVal = COOL_POWERALL;       
  else
    RelayVal = COOL_MALAISE;
  
  // 工作状态信息更新
  
  if (RelayVal > 0)
          DirectLamp = 1;
  else
    DirectLamp = 0;

        if (InAuto)
                DirectLamp |= 0x02;  
}


unsigned int GetCriticalTemperature(void){
  //todo :  这里的值需要从EEPROM中获取
        return (DEFAULTCRITICALTEMP);
}
/*
void SaveCriticalTemperature(unsigned int Val){
  //todo : 保存临界温度到EEPROM,防止停电丢失数据         
}
*/

void time0(void) interrupt 1{
  // 时钟
  TL0 = T1MS;
  TH0 = T1MS >> 8;       
        TempTimerSpace--;
        if (!TempTimerSpace){
                CanReadTemp = 1;
                TempTimerSpace = TEMPGETCOUNT;
        }
       
        if (TempChangingStatusSpace)
                TempChangingStatusSpace--;
}


评分

参与人数 1威望 +30 金币 +30 收起 理由
剪刀手爱德华 + 30 + 30 很给力!期待成品

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-10 01:30:47 | 显示全部楼层 来自: 中国上海
#include <STC12C5A60S2.h>

#include "LEDDisplay.h"
#include "Temperature.h"
#include "Pins.h"


#define Delay_REF        12               //设置每一个点显示的时间长度(1~20)
#define LED_PWDDEFAULT        9          // LED的调光值 1~9

#define DT_P2M0SET                0x00  // 0000 0000
#define DT_P2M1SET                0x00         // 0000 0000
#define DT_P0M0SET                0xf0        // 1111 0000
#define DT_P0M1SET                0x00  // 0000 0000


// 数码管
// 12 ~ 9
sbit        DT_COM1                        = P0 ^ 4;
sbit        DT_COM2                        = P0 ^ 5;
sbit        DT_COM3                        = P0 ^ 6;
sbit        DT_COM4                        = P0 ^ 7;
// 8 ~ 1
sbit        DT_DpyA                        = P2 ^ 0;
sbit        DT_DpyB                        = P2 ^ 1;
sbit        DT_DpyC                        = P2 ^ 2;
sbit        DT_DpyD                        = P2 ^ 3;
sbit        DT_DpyE                        = P2 ^ 4;
sbit        DT_DpyF                        = P2 ^ 5;
sbit        DT_DpyG                        = P2 ^ 6;
sbit        DT_DpyDP                = P2 ^ 7;
sfr   DT_Dpy      = 0xA0;   // P2


void Delay (unsigned int);
void Dis_Off (void);
void displayHH1 (unsigned char);
void displayHH2 (unsigned char);
void displayHH3 (unsigned char);
void displayHH4 (unsigned char);



data unsigned char Led_PWM;   // 调光 1 ~ 9

unsigned char code NumData[]={
  //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, (None) E, R     
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x00, 0x79, 0x77
};
unsigned int Sec = 0;


void InitView(void){
        P0M0 = DT_P0M0SET;
        P0M1 = DT_P0M1SET;
        P2M0 = DT_P2M0SET;
        P2M1 = DT_P2M1SET;
        //Dis_Off();
        Led_PWM = LED_PWDDEFAULT;
}

void DisplayTemperature(unsigned int t){
  // 无效温度显示 ERR 字样
  if (t != VAL_ERRTEMPERATURE){
                displayHH4(NumData[t / 1000]);
    displayHH3(NumData[t / 100 % 10] + 0x80);
    displayHH2(NumData[t / 10 % 10]);
    displayHH1(NumData[t % 10]);
  }
  else {
                // 无效温度显示 ERR 字样
    //displayHH4(NumData[10]);
    displayHH3(NumData[11]);
    displayHH2(NumData[12]);
    displayHH1(NumData[12]);
  }
}



void Delay (unsigned int count){
        unsigned int i;
        while( count-- != 0){
                for(i = 0; i < Delay_REF; i++);
        }                                    
}

void Dis_Off (void){
  DT_COM1          = 0;
  DT_COM2          = 0;      
  DT_COM3          = 0;
  DT_COM4   = 0;

        DT_Dpy    = 0xFF;
        /*
  DT_DpyA          = 1;
  DT_DpyB          = 1;
  DT_DpyC          = 1;
  DT_DpyD          = 1;
  DT_DpyE          = 1;
  DT_DpyF          = 1;
  DT_DpyG          = 1;
  DT_DpyG  = 1;
*/
        Delay(10-Led_PWM);
}

void displayHH1 (unsigned char d){
        if(d & 0x01){
                DT_COM1 = 1;DT_DpyA = 0;}        Delay(Led_PWM);        Dis_Off();

        if(d & 0x02){
                DT_COM1 = 1;DT_DpyB = 0;}        Delay(Led_PWM);        Dis_Off();

        if(d & 0x04){
                DT_COM1 = 1;DT_DpyC = 0;}        Delay(Led_PWM);        Dis_Off();

        if(d & 0x08){
                DT_COM1 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x10){
                DT_COM1 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x20){
                DT_COM1 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x40){
                DT_COM1 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x80){
                DT_COM1 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
}

void displayHH2 (unsigned char d){
        if(d & 0x01){
                DT_COM2 = 1;DT_DpyA = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x02){
                DT_COM2 = 1;DT_DpyB = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x04){
                DT_COM2 = 1;DT_DpyC = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x08){
                DT_COM2 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x10){
                DT_COM2 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x20){
                DT_COM2 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x40){
                DT_COM2 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x80){
                DT_COM2 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
}

void displayHH3 (unsigned char d){
        if(d & 0x01){
                DT_COM3 = 1;DT_DpyA = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x02){
                DT_COM3 = 1;DT_DpyB = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x04){
                DT_COM3 = 1;DT_DpyC = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x08){
                DT_COM3 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x10){
                DT_COM3 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x20){
                DT_COM3 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x40){
                DT_COM3 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x80){
                DT_COM3 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
}

void displayHH4 (unsigned char d){
        if(d & 0x01){
                DT_COM4 = 1;DT_DpyA = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x02){
                DT_COM4 = 1;DT_DpyB = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x04){
                DT_COM4 = 1;DT_DpyC = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x08){
                DT_COM4 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x10){
                DT_COM4 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x20){
                DT_COM4 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x40){
                DT_COM4 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x80){
                DT_COM4 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
}


-------------------------

#include <STC12C5A60S2.h>

#include "PilotLamp.h"

// LED 指示灯
sbit        Lamp_Work                  = P0 ^ 1;  // 继电器工作状态亮
sbit        Lamp_Auto                  = P0 ^ 2;  // 温控模式
sbit        Lamp_Hand                        = P0 ^ 3;  // 手控模式


void InitPilotLamp(void){
}

void DisplayPilotLamp(unsigned char Val){
// 指示灯状态
// 第一位 继电器工作状态,灯亮工作状态,灯灭停止制冷                  
// 第二位 是否为自动模式
// 第三位 温控器故障
        if (Val & 0x01)
                Lamp_Work    = 1;
        else
                Lamp_Work    = 0;
      
        if (Val & 0x02)
                Lamp_Auto     = 1;
        else
                Lamp_Auto     = 0;
               
        Lamp_Hand     = ~Lamp_Auto;
               
}



--------------------------

#include <STC12C5A60S2.h>

#include "Relays.h"
#include "Pins.h"


sbit        RelayCool1  = P1 ^ 3;
sbit        RelayCool2  = P1 ^ 4;


void InitRealys(void){}

void UpdateRelays(unsigned char Val){
// 例:值 0x03 (0000 0011)
//     开启第一、第二 继电器  
        if (Val){
                RelayCool1 = 0;
          RelayCool2 = 0;
        }
        else {
                RelayCool1 = 1;
                RelayCool2 = 1;
        }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-10 01:32:01 | 显示全部楼层 来自: 中国上海
#include <STC12C5A60S2.h>

#include "LEDDisplay.h"
#include "Temperature.h"
#include "Pins.h"


#define Delay_REF        12               //设置每一个点显示的时间长度(1~20)
#define LED_PWDDEFAULT        9          // LED的调光值 1~9

#define DT_P2M0SET                0x00  // 0000 0000
#define DT_P2M1SET                0x00         // 0000 0000
#define DT_P0M0SET                0xf0        // 1111 0000
#define DT_P0M1SET                0x00  // 0000 0000


// 数码管
// 12 ~ 9
sbit        DT_COM1                        = P0 ^ 4;
sbit        DT_COM2                        = P0 ^ 5;
sbit        DT_COM3                        = P0 ^ 6;
sbit        DT_COM4                        = P0 ^ 7;
// 8 ~ 1
sbit        DT_DpyA                        = P2 ^ 0;
sbit        DT_DpyB                        = P2 ^ 1;
sbit        DT_DpyC                        = P2 ^ 2;
sbit        DT_DpyD                        = P2 ^ 3;
sbit        DT_DpyE                        = P2 ^ 4;
sbit        DT_DpyF                        = P2 ^ 5;
sbit        DT_DpyG                        = P2 ^ 6;
sbit        DT_DpyDP                = P2 ^ 7;
sfr   DT_Dpy      = 0xA0;   // P2


void Delay (unsigned int);
void Dis_Off (void);
void displayHH1 (unsigned char);
void displayHH2 (unsigned char);
void displayHH3 (unsigned char);
void displayHH4 (unsigned char);



data unsigned char Led_PWM;   // 调光 1 ~ 9

unsigned char code NumData[]={
  //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, (None) E, R     
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x00, 0x79, 0x77
};
unsigned int Sec = 0;


void InitView(void){
        P0M0 = DT_P0M0SET;
        P0M1 = DT_P0M1SET;
        P2M0 = DT_P2M0SET;
        P2M1 = DT_P2M1SET;
        //Dis_Off();
        Led_PWM = LED_PWDDEFAULT;
}

void DisplayTemperature(unsigned int t){
  // 无效温度显示 ERR 字样
  if (t != VAL_ERRTEMPERATURE){
                displayHH4(NumData[t / 1000]);
    displayHH3(NumData[t / 100 % 10] + 0x80);
    displayHH2(NumData[t / 10 % 10]);
    displayHH1(NumData[t % 10]);
  }
  else {
                // 无效温度显示 ERR 字样
    //displayHH4(NumData[10]);
    displayHH3(NumData[11]);
    displayHH2(NumData[12]);
    displayHH1(NumData[12]);
  }
}



void Delay (unsigned int count){
        unsigned int i;
        while( count-- != 0){
                for(i = 0; i < Delay_REF; i++);
        }                                    
}

void Dis_Off (void){
  DT_COM1          = 0;
  DT_COM2          = 0;      
  DT_COM3          = 0;
  DT_COM4   = 0;

        DT_Dpy    = 0xFF;
        /*
  DT_DpyA          = 1;
  DT_DpyB          = 1;
  DT_DpyC          = 1;
  DT_DpyD          = 1;
  DT_DpyE          = 1;
  DT_DpyF          = 1;
  DT_DpyG          = 1;
  DT_DpyG  = 1;
*/
        Delay(10-Led_PWM);
}

void displayHH1 (unsigned char d){
        if(d & 0x01){
                DT_COM1 = 1;DT_DpyA = 0;}        Delay(Led_PWM);        Dis_Off();

        if(d & 0x02){
                DT_COM1 = 1;DT_DpyB = 0;}        Delay(Led_PWM);        Dis_Off();

        if(d & 0x04){
                DT_COM1 = 1;DT_DpyC = 0;}        Delay(Led_PWM);        Dis_Off();

        if(d & 0x08){
                DT_COM1 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x10){
                DT_COM1 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x20){
                DT_COM1 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x40){
                DT_COM1 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x80){
                DT_COM1 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
}

void displayHH2 (unsigned char d){
        if(d & 0x01){
                DT_COM2 = 1;DT_DpyA = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x02){
                DT_COM2 = 1;DT_DpyB = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x04){
                DT_COM2 = 1;DT_DpyC = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x08){
                DT_COM2 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x10){
                DT_COM2 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x20){
                DT_COM2 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x40){
                DT_COM2 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x80){
                DT_COM2 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
}

void displayHH3 (unsigned char d){
        if(d & 0x01){
                DT_COM3 = 1;DT_DpyA = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x02){
                DT_COM3 = 1;DT_DpyB = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x04){
                DT_COM3 = 1;DT_DpyC = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x08){
                DT_COM3 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x10){
                DT_COM3 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x20){
                DT_COM3 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x40){
                DT_COM3 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x80){
                DT_COM3 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
}

void displayHH4 (unsigned char d){
        if(d & 0x01){
                DT_COM4 = 1;DT_DpyA = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x02){
                DT_COM4 = 1;DT_DpyB = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x04){
                DT_COM4 = 1;DT_DpyC = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x08){
                DT_COM4 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x10){
                DT_COM4 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x20){
                DT_COM4 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x40){
                DT_COM4 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();

        if(d & 0x80){
                DT_COM4 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
}


-------------------------

#include <STC12C5A60S2.h>

#include "PilotLamp.h"

// LED 指示灯
sbit        Lamp_Work                  = P0 ^ 1;  // 继电器工作状态亮
sbit        Lamp_Auto                  = P0 ^ 2;  // 温控模式
sbit        Lamp_Hand                        = P0 ^ 3;  // 手控模式


void InitPilotLamp(void){
}

void DisplayPilotLamp(unsigned char Val){
// 指示灯状态
// 第一位 继电器工作状态,灯亮工作状态,灯灭停止制冷                  
// 第二位 是否为自动模式
// 第三位 温控器故障
        if (Val & 0x01)
                Lamp_Work    = 1;
        else
                Lamp_Work    = 0;
      
        if (Val & 0x02)
                Lamp_Auto     = 1;
        else
                Lamp_Auto     = 0;
               
        Lamp_Hand     = ~Lamp_Auto;
               
}



--------------------------

#include <STC12C5A60S2.h>

#include "Relays.h"
#include "Pins.h"


sbit        RelayCool1  = P1 ^ 3;
sbit        RelayCool2  = P1 ^ 4;


void InitRealys(void){}

void UpdateRelays(unsigned char Val){
// 例:值 0x03 (0000 0011)
//     开启第一、第二 继电器  
        if (Val){
                RelayCool1 = 0;
          RelayCool2 = 0;
        }
        else {
                RelayCool1 = 1;
                RelayCool2 = 1;
        }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-10 01:34:27 | 显示全部楼层 来自: 中国上海
DSSP  SEGMENT  CODE    ;程序段

PUBLIC  GetTemperature          ;入口地址,跳转到DL标号处执行汇编程序  GetTemperature

RSEG  DSSP                          ;程序段

IN                   EQU         0CBH  ; P5.3 引脚地址
FLAG1     EQU   05H   ;DS18B20器件存在标志
TTL       EQU   07H   ;温度读出值(高位在TTL-1中,低位在TTL中)
;TTL_H     EQU   06H   ;温度读出值(高位在TTL-1中,低位在TTL中)


; 这是DS18B20复位初始化子程序
INIT_1820:
    SETB IN
    NOP
    CLR IN
    ;主机发出延时537微秒的复位低脉冲
    MOV R1,#18;#3
TSR1:
    MOV R0,#107
    DJNZ R0,$
    DJNZ R1,TSR1
    SETB IN;然后拉高数据线
    NOP
    NOP
    NOP
    NOP;12倍
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    MOV R0,#0DEH;#25H
TSR2:
    JNB IN,TSR3;等待DS18B20回应
    DJNZ R0,TSR2
    LJMP TSR4 ; 延时
TSR3:
    SETB FLAG1 ; 置标志位,表示DS1820存在
    LJMP TSR5
TSR4:
    CLR FLAG1 ; 清标志位,表示DS1820不存在
    LJMP TSR7
TSR5:
    MOV R7,#6
TSR6:
    MOV R0,#117
    DJNZ R0,$ ; 时序要求延时一段时间 */
    DJNZ R7,TSR6 ; 时序要求延时一段时间 */
TSR7:
    SETB IN
    RET

GetTemperature:  
DS1820PRO:
    ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
    SETB IN
    LCALL INIT_1820;先复位DS18B20
    JB FLAG1,TSS2
    jmp BCD33 ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
    MOV A,#0CCH         ; 跳过ROM匹配
    LCALL WRITE_1820
    MOV A,#44H                 ; 发出温度转换命令
    LCALL WRITE_1820
    CALL  DL1MS
    SETB IN
    LCALL INIT_1820        ;准备读温度前先复位
    MOV A,#0CCH         ; 跳过ROM匹配
    LCALL WRITE_1820
    MOV A,#0BEH         ; 发出读温度命令
    LCALL WRITE_1820
    LCALL READ_18200; 将读出的温度数据保存到35H/36H
      

BCD33:
    JB FLAG1,BCD44
        mov R6, #080H
    mov R7,#00H
    JMP TORET
      
BCD44:

          ;温度转换程序:精确到:0.06 ;
          ; 小数温度查表获取。
          MOV        DPTR,#TABB
    MOV A, TTL
          ANL A,#0FH
          MOVC A,@A+DPTR
          MOV R3, A;
          ; 整数温度转换
          MOV A,TTL
    MOV B,TTL-1
    MOV C,B.0
    RRC A
    MOV C,B.1
    RRC A
    MOV C,B.2
    RRC A
    MOV C,B.3
    RRC A
          ; 拼接整数位和小数位温度  整数*100 + 小数位值
          MOV B, #100
          MUL AB
    MOV        R4,B         ;保存积的高8位
    ADD        A,R3         ;
    MOV        R7,A
    CLR        A
    ADDC A,R4         ;加上进位,
    MOV        R6,A      


TORET:
    RET
      
      
;--------------------------------写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
    MOV R2,#8;一共8位数据
    CLR C
WR1:
    CLR IN
    MOV R3,#36;#6
    DJNZ R3,$
    RRC A
    MOV IN,C
    MOV R3,#192;#23
    DJNZ R3,$
    SETB IN
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    DJNZ R2,WR1
    SETB IN
    RET

;-----------------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
    MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
    MOV R1,#TTL ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
    MOV R2,#8;数据一共有8位
RE01:
    CLR C
    SETB IN
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    CLR IN
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    SETB IN
    MOV R3,#54;#9
RE10:
    DJNZ R3,RE10
    MOV C,IN
    MOV R3,#138;#23
RE20:
    DJNZ R3,RE20
    RRC A
    DJNZ R2,RE01
    MOV @R1,A
    DEC R1
    DJNZ R4,RE00
    RET

DL1MS:
        MOV R7,#6
DL1MS2:
    MOV R6,#255
         DJNZ R6,$
         DJNZ R7,DL1MS2
    RET
      
TABB:   
        ; 小数位温度0~F的查表值,18B20的最小温控精度 0.0625, 只保留两位小数
        DB        00H, 06H, 0CH, 12H, 19H, 1FH, 25H, 2BH, 32H  
        DB  56H, 3EH, 44H, 4BH, 51H, 57H, 5DH
      

END
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-10 01:35:36 | 显示全部楼层 来自: 中国上海
  贴多了
回复 支持 反对

使用道具 举报

发表于 2012-8-10 08:10:29 | 显示全部楼层 来自: 中国辽宁营口
弄点通俗易懂的行吗   看了半天一点没看明白
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|CMF海水观赏鱼网 ( 琼ICP备12003277号 )

GMT+8, 2025-4-13 12:38 , Processed in 0.144068 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表