久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1065|回復: 1
打印 上一主題 下一主題
收起左側

基于單片機簡單IO口的8LED顯示溫度控制器,有大神可以幫忙看看嗎?

[復制鏈接]
跳轉到指定樓層
樓主
ID:1076991 發表于 2023-5-12 09:58 來自觸屏版 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<AT89X51.H>
#include<ABSACC.H>
#include<STDIO.H>
#include<MATH.H>
#include<FLOAT.H>
//#includ<Delay.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef signed char schar;
typedef signed int sint;
#define DQ P3_7//溫度檢測P3.7
#define KEY_SET 14
#define KEY_COMFIRM 15
extern void DelayXms(uint xms);
extern uchar KeyScan();
uchar  code dis_code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uint timecnt=0,step=1,stepcnt=0;
uchar temptable[11],position=0;
schar temp=0;//延時函數

void DelayXus(uint i)
{
        while(i--);
}

//初始化函數?
  void InitlalDS18B20()
{ uchar x=0;
        DQ=1;//DQ復位
        DelayXus(8);//稍做延時
        DQ=0;//單片機將DQ拉低
        DelayXus(80);// 精確延時大于480us
        DQ=1;//拉高總線
        DelayXus(14);
        x=DQ;//稍做延時后如果x=0則初始化成功x=1則初始化失?
        DelayXus(20);
}//讀一個字節
uchar ReadByte()
{
        uchar i=0,dat=0;
        
        for(i=8;i>0;i--)
        {
                DQ=0;//給脈沖信號
                dat>>=1;
                DQ=1;//給脈沖信號
                if(DQ)
                        dat|=0x80;
                DelayXus(4);
        }
        return dat;
}//寫一個字?
void WriteByte(uchar dat)
{uchar i=0;
        for(i=8;i>0;i--)
        {
                DQ=0;
                DQ=dat&0x01;
                DelayXus(5);
                DQ=1;
                dat>>=1;
        }//Delayxus(4)
}
//讀取溫度
uint ReadTemperature()
{ uchar a=0;
        uchar b=0;
        uint t=0;
        float tt=0;
        InitialDS18B20();
        WriteByte(0xcc);//跳過度序號列的操作
        WriteByte(0x44);//啟動溫度轉換
        InitialDS18B20();
        WriteByte(0xcc);//跳過度序號列的操作
        WriteByte(0xbe);//讀取溫度寄存器等,共可讀9個寄存器,前兩個就是溫度
        a=ReadByte();
        b=ReadByte();
        t=b;
        t<<=8;
        t=t|a;
        tt=t*0.0625;//5/8
        //t=tt*10+0.5;//放大10倍輸出并四舍五入
        return t;
}
//ledplay 數碼管顯示,chan0-8,num數值0-9、符號*/
        void ledplay(uchar chan,uchar num)
        {if(chan<8&&num<=10)
                {
                        P2=0xff;
                        P2=(~(0x01<<chan));//選取第N位
                        P0=dis_code[num];//顯示
                        DelayXms(100);//delay();
                }
        }
        void InitTimer1(void)
        {
                TMOD=0x10;
                TH1=0xfc;
                TL1=0x18;
                EA=1;
                ET1=1;
                TR1=1;
        }
        /*
        /*tempdisplay溫度顯示*/

void tempdisplay(schar tem)
        {schar tempbit1=0;
                schar tempbit2=0;
                //if((tem<=-40||(tem>=125))return;
                if(tem<0)
                {ledplay(5,10);tem=256-tem;
                }
                if(tem>99)
                {
                {ledplay(5,1);tem=tem-100;
                }
                tempbit1=tem%10;//各位HexToBcd
                tempbit2=tem/10;//十位
                ledplay(6,tempbit2);
          ledplay(7,tempbit1);
        }}
        //Timer1Interrupt定時器1000us*1000=1s
//        void Timer1 Interrupt(void)interrupt3
void timer1() interrupt 3
        {TH1=0xfc;
                TL1=0x18;
                timecnt++;
                if(timecnt>=1000)//1s溫度值存放
                {timecnt=0;
                        stepcnt++;
                        if(stepcnt>=step)
                        {stepcnt=0;
                                if(position<10)temptable[position++]=temp;
                        else
                        {temptable[position]=temp;
                                position=0;
                        }
                }
        }
}
        uint setStep()
{uchar key,i=0;
        uint step=0;
        P2=0xff;//清屏
        for(;;)
        {key=KeyScan();
                if(key==KEY_COMFIRM)return step;
                if(key<10)
                {step=key;
                        for(;;)
                {        key=KeyScan();
                        ledplay(7,step);
                        if(key==KEY_COMFIRM)return step;
                        if(key<10)
                        {step=step*10+key;
                                for(;;)
                                {key=keyScan();
                                        if(key++KEY_COMFIRM)return step;
                                        ledplay(6,step/10);
                                        ledplay(7,step%10);
                                        if(key<10)
                                        {step=step*10+key;
                                                for(;;)
                                                {key=KeyScan();
                                                        if(key==KEY_COMFIRM)return step;
                                                        ledplay(5,step/100);
                                                        ledplay(6,(step%100)/10);
                                                        ledplay(7,step%10);
                                                        if(key<10)
                                                        {step=step*10+key;
                                                                for(;;)
                                                                {key=KeyScan();
                                                                if(key++KEY_COMFIRM)return step;
                                                                ledplay(4,step/1000);
                                                                ledplay(5,(step%1000)/100);
                                                                ledplay(6,(step%100)/10);
                                                                ledplay(7,step%10);
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
}
}
}


void main()
{uint i=0,j;
        InitTimer 1();
        for(;;)
        {uchar ker=0xff,dis;
                i=ReadTemperature();//讀溫度
                if(i!=0xffff)temp=i>>4;
                tempdisplay(temp);//主循環顯示溫度
                key=KeYscan();//檢查按鍵
                ledplay(0,key);
                if(key==KEY_SET)//進入設置狀態
                {if(0!=(j=setStep()))
                        step=j;
                }
                if(key<10)//如果有0-9按鍵按下,
                {if(key==0)key=10;//按下0,顯示10秒?
                        dis=((position>=key)?(position-key):(11+position-key));//找到前N秒的溫度值存放占位置
                        for(j=0;j<20;j++)//顯示之前的溫度,并多次刷新、使之前顯示一段時間
                        {if(key==10)
                                {ledplay(0,1);ledplay(1,0);}//顯示10s
                                else ledplay(0,key);//顯示XS
                                tempdisplay(temptable[dis]);//顯示存儲溫度
                        }
                }
        }
}
void DelayXms(uint xms)
{uint i;
        uchar j;
        for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}uchar KeyScan()
{uchar cord,keyValue;
        cord=0xff;
        P1=0xfe;
        if((P1&0xf0)!=0xf0)
        {DelayXms(5);
                if((P1&0xf0)!=0xf0)//消除鍵盤抖動延時10ms
                {cord=P1;
                }
        }
        P1=0xff;
        P1_2=0;
        if((P1&0xf0)!=0xf0)
        {DelayXms(5);if(P1&0xf0)!=0xf0//消除鍵盤抖動延時10ms
                {cord=P1;
                }
        }
        P1=0xf0;
        while(P1!=0xf0);//等待按鍵釋?
        ?/com=com1+com2;
        switch(cord)
                {case 0xee:keyValue=7;break;//7P1.0-P1.3為列,P1.4-1.7為行
                case 0xed:keyValue=8;break;//8
                        case 0xeb:keyValue=9;break;//9
                        case 0xe7:keyValue=11;break;//%
                        case 0xde:keyValue=4;break;//4
        case 0xdd:keyValue=5;break;//5
                        case 0xdb:keyValue=6;break;//6
                        case 0xd7:keyValue=12;break;//X
                        case 0xbe:keyValue=1;break;//1
                                case 0xbd:keyValue=2;break;//2
                                case 0xbb:keyValue=3;break;//3
                                case 0xb7:keyValue=13;break;//-
                                case 0x7e:keyValue=14;break;//ON/C
                                case 0x7d:keyValue=0;break;//0
                                case 0x7b:keyValue=15;break;//=
                                case 0x77:keyValue=16;break;//+
                default:keyValue=0xff;
        }
        return keyValue;
        }
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2023-5-13 06:03 | 只看該作者
你這東拼西湊的代碼,錯誤一大堆,神仙也幫不了你。看看這個示例可能有所啟發。 4位數碼管時鐘溫度表仿真.rar (332.04 KB, 下載次數: 4)

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久国产精品 | 国产成人免费在线 | 国产精品高潮呻吟久久久久 | 国产激情视频在线观看 | 欧美不卡一区 | 久久99精品久久久久久噜噜 | 亚洲一区二区 | 中文字幕电影在线观看 | 97精品一区二区 | 亚洲热在线视频 | 亚洲人a| 亚洲精品黄色 | 日本一区精品 | 日韩中文字幕一区 | 国内自拍偷拍一区 | 国产高清美女一级a毛片久久w | cao在线 | 国产一区二区在线免费观看 | 成人av观看 | 四季久久免费一区二区三区四区 | 一区二区三区免费在线观看 | 免费精品久久久久久中文字幕 | 久草免费在线视频 | 欧美日韩一区二区在线 | 美女激情av | 在线国产精品一区 | 午夜视频在线观看网站 | 成人在线视频免费观看 | 性做久久久久久免费观看欧美 | 国产精品日韩在线观看 | 亚洲免费影院 | 91直接看| 欧美成人手机视频 | 久草网在线视频 | 欧美成人久久 | 国产日韩欧美在线观看 | www成年人视频 | 亚洲毛片在线 | 天堂久久久久久久 | 99免费精品 | 视频一区二区三区在线观看 |