找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1938|回復(fù): 4
收起左側(cè)

89C52RC+18B20溫控,數(shù)碼管腳位換了,程序求修改

[復(fù)制鏈接]
ID:471297 發(fā)表于 2021-11-8 17:00 | 顯示全部樓層 |閱讀模式
為了便于布線把這個(gè)溫控器做小點(diǎn),數(shù)碼管到單片機(jī)的連接線更換了腳位,請(qǐng)教程序要怎么修改呢?

數(shù)碼管 A-- P00   改為:P02
           B--P01              P00
           C--P02              P06
           D--P03             P04
           E--P04              P03
           F--P05              P01
           G--P06              P07
          DP--P07             P05

          C1--P20             P23
          C2--P21             P 22
          C3--P22             P21
          C4--P23             P20

程序如下:
#include<reg52.h>                                 //頭文件
#include<intrins.h>
#include "DS18b20.H"
#include "eeprom52.h"
#include "Nixie tube.h"
#define uchar unsigned char                 //宏定義
#define uint unsigned int
uchar code ss[]=
{
  0xc0,0xf9,0xa4,0xb0,0x99,
  0x92,0x82,0xf8,0x80,0x90
};                           //數(shù)碼管
uchar code ss1[]=
{
  0x40,0x79,0x24,0x30,0x19,
  0x12,0x02,0x78,0x00,0x10,
  0xc7,0x89,0xbf               //0xc7=L   0x89=H   0xbf=- 負(fù)號(hào)
};                            //0-9為帶小數(shù)點(diǎn)的
uchar ms;                           //定時(shí)器0計(jì)數(shù)
sbit key1=P1^2;
sbit key2=P1^3;
sbit key3=P1^4;
sbit led_0=P3^3;                //上限溫度報(bào)警燈
sbit led_2=P3^4;                //下限溫度報(bào)警燈
char H,L;                       //用于設(shè)置上下限度  上下限度與要比較的數(shù)據(jù)類型最好相同
uchar flag;
sbit beep=P2^5;                 //蜂鳴器
bit s0,beep_1=1;                                         //s0用于閃爍標(biāo)志  beep_1用于在中斷里改變蜂鳴器工作狀態(tài)
int temp,i;                      //存儲(chǔ)讀出來的溫度,與H,L上下限度數(shù)據(jù)類型相同
void delay(uint T)
{
  while(T--);
}

void display()
{           
  if(flag==0&&temp>=0)          //溫度為正數(shù)時(shí)執(zhí)行
        {
     if(temp>999) Nixietube(ss[temp/1000%10],ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
         if(temp>99)  Nixietube(0xff,ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
         if(temp<99&&temp/100%10<=0)  Nixietube(0xff,0xff,ss1[temp/10%10],ss[temp%10]);

    }
  if(flag==0&&temp<0)          //溫度為負(fù)數(shù)時(shí)
        {
     if(temp*-1/100%10<=0) Nixietube(0xff,ss1[12],ss1[temp*-1/10%10],ss[temp*-1%10]);
         if(temp*-1/100%10>0)  Nixietube(ss1[12],ss[temp*-1/100%10],ss1[temp*-1/10%10],ss[temp*-1%10]);
        }
  if(flag==1)                 //flag==0顯示溫度  =1 顯示上限   =2 顯示下限
        {
     if(H>99)          Nixietube(ss1[11],ss[H/100],ss[H%100/10],ss[H%10]);   //溫度范圍是125~-55 ,當(dāng)上限值大于99時(shí)執(zhí)行  
         if(H>=10&&H<=99)  Nixietube(ss1[11],0xff,ss[H/10],ss[H%10]);            //當(dāng)上限值大于12小于99時(shí)執(zhí)行  不顯示最高位
         if(H<10&&H>=0)    Nixietube(ss1[11],0xff,0xff,ss[H%10]);                //不顯示百位 十位
         if(H<0&&H>=-9)    Nixietube(ss1[11],0xff,ss1[12],ss[H*-1%10]);          //設(shè)置的為負(fù)數(shù)且介于0~-9之間時(shí)執(zhí)行  不顯示十位
     if(H<0&&H<-9)     Nixietube(ss1[11],ss1[12],ss[H*-1%100/10],ss[H*-1%10]);         //最低可以到55                   
    }               
if(flag==2)            //同上                                                
        {
     if(L>99)          Nixietube(ss1[10],ss[L/100],ss[L%100/10],ss[L%10]);
         if(L>=10&&L<=99)  Nixietube(ss1[10],0xff,ss[L/10],ss[L%10]);
         if(L<10&&L>=0)    Nixietube(ss1[10],0xff,0xff,ss[L%10]);
         if(L<0&&L>=-9)  Nixietube(ss1[10],0xff,ss1[12],ss[L*-1%10]);
     if(L<0&&L<-9)  Nixietube(ss1[10],ss1[12],ss[L*-1%100/10],ss[L*-1%10]);                          
    }
                                       
  }
void key()                              //按鍵處理
{
       
if(!key1)                               //設(shè)置上限
{
   delay(500);
   if(!key1)
        {
      while(!key1);
          if(flag==1)
                  {
         if(H<125)H++;
                 SectorErase(0x2000);          //每修改一次上下限數(shù)據(jù)就寫進(jìn)EEROM
                 byte_write(0x2000,H);
        }
          else if        (flag==2)
                {
          if(L<H-1) L++;                //原則是下限不超過上限
                  SectorErase(0x2200);
                  byte_write(0x2200,L);
        }       
    }       
}

if(!key2)                            //設(shè)置下限
{
    delay(500);
        if(!key2)
         {
       while(!key2);
           if(flag==1)
                  {
                  if(H>L+1)  H--;             //原則上限不低于下限
                  SectorErase(0x2000);        //每修改一次上下限數(shù)據(jù)就寫進(jìn)EEROM
                  byte_write(0x2000,H);
        }
           else if        (flag==2)
                {
                  if(L>-55)L--;
                  SectorErase(0x2200);
              byte_write(0x2200,L);
        }       
     }
}
if(!key3)                         //設(shè)置上限下限切換按鍵
        {
         delay(1000);
         if(!key3)
       {
                while(!key3);
        flag=(flag+1)%3;                       
       }
  }
}
void alarm()                          //報(bào)警
{
if(temp/10>=H||temp/10<=L)               //超過上下限蜂鳴器報(bào)警 ,正常的LED燈關(guān)閉
   {
    beep_1=0;
   }       
else
        {
          beep_1=1;
    }                             //正常情況下,蜂鳴器關(guān)閉  
if(temp/10>=H)                    //上限,當(dāng)測(cè)得的值,大于等于設(shè)定值得時(shí)候,
        {
          led_0=0;     
        }
else
   {
    led_0=1;
   }
               
if(temp/10<=L)                        //下限 當(dāng)實(shí)際值小于等于下限值時(shí)
   {
         led_2=0;     
   }
else
   {
     led_2=1;
   }       
}
void main()                        //主函數(shù)         
{  
    do
     {
          temp=Temper();
     }
    while(temp==850);                  //因?yàn)镈S18B20上電之后會(huì)讀出來850,但不是溫度值,所以等待讀出溫度值   
        delay(1000);
        H=byte_read(0x2000);
        L=byte_read(0x2200);
        if((H>99)||(L>99)||(L>=H))     //讀EEROM里面的數(shù)據(jù)
      {
                H=35;
                L=16;                      //如果數(shù)據(jù)不對(duì),賦予初始值
          }  
        TMOD=0x01;
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        EA=1;
        ET0=1;
    TR0=1;                         //設(shè)置定時(shí)器與中斷
         
while(1)   
        {  

          key();
          alarm();
                   
         
        }
}



void UART_1() interrupt 1
{
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;             //一次定時(shí)10MS   十進(jìn)制65536-50000=15536   折合十六進(jìn)制3cb0  高位3c低位b0   
        ms++;
        display();                                                    // 完全消影可以開啟這個(gè),屏蔽主函數(shù)大循環(huán)里的顯示函數(shù)
if(ms>100)                            //數(shù)據(jù)一秒刷新一次
        {
          ms=0;
          temp=Temper();                   //讀溫度
        }         
if(ms%5==0)                  
        {
         if(beep_1==0)                      //蜂鳴器設(shè)置
          {
                beep=!beep;
          }
         else
      {
                beep=1;
          }
    }  
}







原數(shù)碼管接線圖

原數(shù)碼管接線圖

PCB

PCB

程序.rar

64.55 KB, 下載次數(shù): 11

回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2021-11-8 19:55 | 顯示全部樓層
把你的代碼這部分:
  1. uchar code ss[]=
  2. {
  3.   0xc0,0xf9,0xa4,0xb0,0x99,
  4.   0x92,0x82,0xf8,0x80,0x90
  5. };
復(fù)制代碼

換成完全等效的我寫的代碼:
  1. #define SEG_A 1
  2. #define SEG_B 2
  3. #define SEG_C 4
  4. #define SEG_D 8
  5. #define SEG_E 16
  6. #define SEG_F 32
  7. #define SEG_G 64
  8. #define SEG_P 128
  9.         uint8_t tbl[10]={
  10.         ~(SEG_A+SEG_B+SEG_C+SEG_D+SEG_E+SEG_F),
  11.         ~(SEG_B+SEG_C),
  12.         ~(SEG_A+SEG_B+SEG_D+SEG_E+SEG_G),
  13.         ~(SEG_A+SEG_B+SEG_C+SEG_D+SEG_G),
  14.         ~(SEG_B+SEG_C+SEG_F+SEG_G),
  15.         ~(SEG_A+SEG_C+SEG_D+SEG_F+SEG_G),
  16.         ~(SEG_A+SEG_C+SEG_D+SEG_E+SEG_F+SEG_G),
  17.         ~(SEG_A+SEG_B+SEG_C),
  18.         ~(SEG_A+SEG_B+SEG_C+SEG_D+SEG_E+SEG_F+SEG_G),
  19.         ~(SEG_A+SEG_B+SEG_C+SEG_D+SEG_F+SEG_G)
  20.         };
復(fù)制代碼

看々,換引腳以后容易改多了吧???
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-11-8 20:06 | 顯示全部樓層
EXCLE 里面算一下不就好了??

計(jì)算數(shù)碼管.png


好人做到底,這個(gè)你拿去,自己把需要改的字庫(kù)改一下吧,
黃格子輸入原來的數(shù)據(jù),如:0xC0
蘭格子輸出管腳改變后的新的數(shù)據(jù),如:0x44  然后,你替換一下原來的字庫(kù)就好了。

計(jì)算數(shù)碼管.rar (8.02 KB, 下載次數(shù): 17)

回復(fù)

使用道具 舉報(bào)

ID:471297 發(fā)表于 2021-11-8 20:45 | 顯示全部樓層
非常感謝您的回復(fù)
回復(fù)

使用道具 舉報(bào)

ID:245820 發(fā)表于 2022-3-25 22:26 | 顯示全部樓層
188610329 發(fā)表于 2021-11-8 20:06
EXCLE 里面算一下不就好了??

簡(jiǎn)單易懂
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表