<strong id="0toem"><dl id="0toem"></dl></strong><b id="0toem"><menuitem id="0toem"></menuitem></b>

      <b id="0toem"><menuitem id="0toem"></menuitem></b>
    1. <code id="0toem"><abbr id="0toem"></abbr></code>
      <strong id="0toem"><dl id="0toem"></dl></strong>
      <kbd id="0toem"></kbd>
              1. <code id="0toem"></code>
                <th id="0toem"><progress id="0toem"></progress></th><strong id="0toem"><form id="0toem"></form></strong>

                <th id="0toem"></th>
              2. 131 1300 0010
                其他
                當(dāng)前位置: 首頁>> 元件技術(shù)>>其他>>
              3. 導(dǎo)航欄目
              4. 二極管
              5. 整流橋
              6. MOS管
              7. 其他
              8. AT89C51單片機(jī)快熱式熱水器程序設(shè)計(jì)
                AT89C51單片機(jī)快熱式熱水器程序設(shè)計(jì)
              9. AT89C51單片機(jī)快熱式熱水器程序設(shè)計(jì)
              10.   發(fā)布日期: 2019-05-27  瀏覽次數(shù): 1,621

                快熱式熱水器程序MCU AT89C51 XAL 12MHz

                //#pragmaSRC

                 

                #include

                #include

                #include

                voiddelay(unsignedint);//延時(shí)函數(shù)

                voiddisplay(void);//顯示函數(shù)

                unsignedcharkeysCAN(void);//按鍵掃描處理函數(shù)

                voidheatCTRl(void);//加熱控制函數(shù)

                voidtemptest(void);//測溫函數(shù)

                sbitswkey=P1^0;//開關(guān)鍵

                sbitupkey=P1^1;//加熱檔位“+”鍵

                sbitdownkey=P1^2;//加熱檔位“-”鍵

                sbitbuzz=P1^05;//蜂鳴器輸出端

                sbittriac=P1^6;//可控硅觸發(fā)信號(hào)輸出端

                sbitrelay=P1^7;//繼電器控制信號(hào)輸出端

                sbitLED1=P2^5;//加熱檔位指示燈1

                sbitled2=P2^6;//加熱檔位指示燈2

                sbitled3=P2^7;//加熱檔位指示燈3

                signedchardatactemp;//當(dāng)前測得水溫寄存器

                unsignedchardatadispram[2]={0x10,0x10};//顯示區(qū)緩存

                unsignedchardataheatpower,px0count;//加熱檔位寄存器、外中斷0計(jì)數(shù)器

                bittempov,t0tst,testok;//超溫標(biāo)志、測溫開始標(biāo)志、測溫完成標(biāo)志

                AT89C51單片機(jī)快熱式熱水器程序設(shè)計(jì)

                /*----------------------------------------------

                主函數(shù)voidmain(void)

                無參數(shù),無返回值

                循環(huán)調(diào)用顯示、鍵掃描、溫度檢測、加熱控制函數(shù)

                ----------------------------------------------*/

                voidmain(void)

                {

                unsignedchari,j;

                ctemp=15;//初始化水溫寄存器

                heatpower=5;//初始化加熱檔位為5當(dāng)

                tempov=0;//清除超溫標(biāo)志

                swkey=0;//默認(rèn)開關(guān)鍵被按下,進(jìn)入待機(jī)狀態(tài)

                TMOD=0x11;//設(shè)定T0和T1工作方式為16位定時(shí)器

                TCON=0x05;//設(shè)置外中斷0和1為下降沿觸發(fā)

                IP=0x01;//設(shè)置外中斷0優(yōu)先

                IE=0x80;//打開總中斷

                while(1)

                {

                i=1;

                do{

                for(j=0;j《100;j++)//循環(huán)100次約0.5s

                {

                if(keyscan())i=6;//如果有鍵按下,顯示當(dāng)前檔位3s

                display();//調(diào)用顯示函數(shù)一次約4ms

                heatctrl();//調(diào)用加熱控制函數(shù)

                }//endfor(b=0;b《100;b++)

                temptest();//每0.5s進(jìn)行一次測溫

                }while(--i);//通過改變循環(huán)次數(shù)i的大小決定是否刷新顯示

                j=abs(ctemp);//取溫度絕對(duì)值

                dispram[1]=j%10;//取個(gè)位數(shù)送顯示

                j/=10;//取十位數(shù)

                dispram[0]=j?j:0x11;//送顯示(帶滅零)

                }//endwhile(1)

                }

                /*--------------------------------------

                延時(shí)函數(shù)voiddelay(unsignedintdt)

                參數(shù):dt,無返回值

                延時(shí)時(shí)間=dt*500機(jī)器周期

                --------------------------------------*/

                voiddelay(unsignedintdt)

                {

                registerunsignedcharbt;//定義寄存器變量

                for(;dt;dt--)

                for(bt=250;--bt;);//此句編譯時(shí)以“DJNZ”實(shí)現(xiàn),250*2=500機(jī)器周期

                }

                /*--------------------------------------

                顯示函數(shù)voiddisplay(void)

                無參數(shù),無返回值

                兩位共陽數(shù)碼管掃描顯示

                --------------------------------------*/

                voiddisplay(void)

                {

                unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,

                0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};

                unsignedchari,a;

                a=0xfe;//位選賦初值

                for(i=0;i《2;i++)//循環(huán)掃描兩位數(shù)碼管

                {

                P2|=0x1f;//清除位選

                P0=table[dispram[i]];//送顯示段碼

                P2&=a;//選通一位

                delay(4);//延時(shí)2ms

                a=_crol_(a,1);//改變位選字

                P0=0xff;//消影

                }

                }

                /*----------------------------------------------------------

                按鍵掃描處理函數(shù)unsignedcharkeyscan(void)

                無參數(shù),返回值:無符號(hào)字符型,無鍵按下為0,有鍵按下為其它

                影響全局變量:heatpower

                ----------------------------------------------------------*/

                unsignedcharkeyscan(void)

                {

                unsignedchari,ch;

                if(upkey==0)//“+”鍵

                {

                buzz=0;//打開蜂鳴器(發(fā)出按鍵音)

                for(i=0;i《5;i++)display();//延時(shí)消抖

                buzz=1;//關(guān)閉蜂鳴器

                if(heatpower《9)heatpower++;//檔位加一

                dispram[0]=0;

                dispram[1]=heatpower;//顯示當(dāng)前檔位

                while(upkey==0)display();//等待鍵釋放

                return(1);//返回有鍵按下

                }

                elseif(downkey==0)//“-”鍵

                {

                buzz=0;//打開蜂鳴器(發(fā)出按鍵音)

                for(i=0;i《5;i++)display();//延時(shí)消抖

                buzz=1;//關(guān)閉蜂鳴器

                if(heatpower》0)heatpower--;//檔位減一

                dispram[0]=0;

                dispram[1]=heatpower;//顯示當(dāng)前檔位

                while(downkey==0)display();//等待鍵釋放

                return(2);//返回有鍵按下

                }

                elseif(swkey==0)//開關(guān)鍵

                {

                buzz=0;//打開蜂鳴器(發(fā)出按鍵音)

                for(i=0;i《30;i++)display();//延時(shí)消抖

                buzz=1;//關(guān)閉蜂鳴器

                swkey=1;//置位開關(guān)鍵

                while(swkey==0)display();//等待鍵釋放

                ch=IE;//暫存中斷控制字IE

                IE=0x00;//禁止中斷

                P0=0xff;

                P1=0xff;

                P2=0xff;//清除端口輸出

                dispram[0]=0x10;

                dispram[1]=0x10;//顯示“--”

                display();

                while(1)

                {

                while(swkey)display();//等待開關(guān)鍵按下

                buzz=0;//打開蜂鳴器(發(fā)出按鍵音)

                for(i=0;i《10;i++)display();//延時(shí)消抖

                buzz=1;//關(guān)閉蜂鳴器

                if(swkey==0)break;//確認(rèn)開關(guān)鍵被按下

                }

                while(swkey==0)display();//等待鍵釋放

                IE=ch;//還原中斷控制字IE

                return(0);//返回?zé)o鍵按下

                }

                elsereturn(0);//無任何鍵按下時(shí)由此返回

                }

                /*--------------------------------------

                加熱控制函數(shù)voidheatctrl(void)

                無參數(shù),無返回值

                判斷是否加熱、加熱功率及檔位指示燈處理

                --------------------------------------*/

                voidheatctrl(void)

                {

                if(!tempov)//當(dāng)沒有超溫標(biāo)志時(shí)

                {

                relay=0;//接通繼電器

                buzz=1;//關(guān)閉蜂鳴器

                switch(heatpower)//判斷加熱檔位

                {

                case0:{EX1=0;ET1=0;triac=1;led1=1;led2=1;led3=1;break;}//0檔不加熱,指示燈不亮

                case1:

                case2:

                case3:

                case4:{led1=0;led2=1;led3=1;EX1=1;break;}//1~4檔1號(hào)指示等亮

                case5:

                case6:

                case7:

                case8:{led1=0;led2=0;led3=1;EX1=1;break;}//5~8檔1號(hào)、2號(hào)指示燈亮

                case9:{EX1=0;ET1=0;led1=0;led2=0;led3=0;triac=0;break;}//9檔全功率,指示燈全亮

                }

                }

                else//當(dāng)有超溫標(biāo)志時(shí)

                {

                relay=1;//斷開繼電器

                EX1=0;ET1=0;triac=1;//關(guān)閉可控硅

                buzz=0;//蜂鳴報(bào)警

                }

                }

                /*--------------------------------------

                測溫函數(shù)voidtemptest(void)

                無參數(shù),無返回值,

                影響全局變量:ctemp,tempov

                測量并查表計(jì)算溫度,判斷是否超溫

                --------------------------------------*/

                voidtemptest(void)

                {

                signedchartemp,tempmin,tempmax;

                unsignedintt0rig;

                unsignedintcodetemptab[]={0x6262,0x61eb,0x6171,0x60f7,0x6047,0x5ff7,0x5f6e,0x5eef,0x5e53,0x5dbe,0x5d4b,0x5ca5,0x5c17,

                0x5b6b,0x5ada,0x5a5c,0x599b,0x58ff,0x5869,0x57b0,0x570d,0x5663,0x55c6,0x550e,0x5444,0x5396,

                0x52dd,0x5240,0x5189,0x50b0,0x5005,0x4f20,0x4e69,0x4db1,0x4cef,0x4c42,0x4b64,0x4aaa,0x49e1,

                0x48fc,0x4847,0x476c,0x46b1,0x4604,0x4503,0x4449,0x4356,0x4299,0x41c0,0x40ce,0x3ff0,0x3f2b,

                0x3e33,0x3d86,0x3ca6,0x3bd2,0x3b26,0x3a39,0x3973,0x38a6,0x37ef,0x373f,0x3687,0x35c3,0x3507,

                0x3487,0x33bc,0x32ed,0x324f,0x319e,0x3106,0x3053,0x2fa6,0x2f2a,0x2e88,0x2e00,0x2d63,0x2cd6,

                0x2c65,0x2bae,0x2b28,0x2a97,0x2a07,0x298e,0x2914,0x287a,0x280d,0x278a,0x2703,0x2687,0x2626,

                0x25e5,0x256d,0x24ee,0x2489,0x2414,0x23bc,0x2356,0x22d9,0x2278,0x2203};//溫度頻率表

                px0count=2;//測頻中斷函數(shù)參數(shù)

                t0tst=1;//置測頻程序開始標(biāo)志

                EX0=1;//打開測頻外中斷

                testok=0;//清除測頻程序完成標(biāo)志

                while(!testok)display();//等待測試完成

                t0rig=(unsignedint)TH0《《8|TL0;//字節(jié)合成字

                tempmin=0;//以下是二分查表法計(jì)算溫度值

                tempmax=100;//tempmin和tempmax為溫度表的范圍

                while(1)

                {

                temp=(tempmax+tempmin)/2;//假定當(dāng)前溫度為最大值與最小值之中點(diǎn)值

                if(t0rig==temptab[temp])break;//若實(shí)際值等于假定值結(jié)束查找

                elseif(t0rig》temptab[temp])tempmax=temp;//若實(shí)際值大于假定值,減小查找范圍的最大值

                elsetempmin=temp;//若實(shí)際值小于假定值,增大查找范圍的最小值

                if(tempmax-tempmin《=1)//若查找范圍已縮小到1度之間,

                {//判斷實(shí)際值更接近哪個(gè)端點(diǎn)

                if(temptab[tempmax]+temptab[tempmin]》2*t0rig)temp=tempmax;//接近最大值取最大值

                elsetemp=tempmin;//接近最小值取最小值

                break;//結(jié)束查找

                }

                }

                ctemp=temp;//刷新當(dāng)前溫度寄存器

                if(temp》65)tempov=1;//如果溫度超過65度置位超溫標(biāo)志

                elseif(temp《45)tempov=0;//當(dāng)溫度回落到45度以下時(shí)清除超溫標(biāo)志

                }

                /*------------------------------------------

                測溫頻率測試函數(shù)voidtempFrequency(void)

                使用外部X0中斷,寄存器組1

                測出溫度——頻率轉(zhuǎn)換電路的頻率

                ------------------------------------------*/

                voidtempfrequency(void)interrupt0using1

                {

                if(--px0count)return;//找齊起點(diǎn)或計(jì)數(shù)

                if(t0tst)//如果是起點(diǎn)

                {

                t0tst=0;//清除測頻開始標(biāo)志

                px0count=100;//取100個(gè)方波為一次測頻

                TH0=0;

                TL0=0;//清除計(jì)時(shí)器T0

                TR0=1;//開始計(jì)時(shí)

                }

                else//如果是終點(diǎn)

                {

                TR0=0;//停止計(jì)時(shí)

                EX0=0;//停止測頻外中斷

                testok=1;//置位測頻完成標(biāo)志

                }

                }

                /*--------------------------------------

                加熱控制過〇檢測函數(shù)voidpass0(void)

                使用外部X1中斷,寄存器組2

                檢測過〇點(diǎn),給定時(shí)器T1賦初值

                --------------------------------------*/

                voidpass0(void)interrupt2using2

                {

                unsignedcharcodepowertab[]={0xd8,0xf0,0xe2,0x63,0xe5,0x25,0xe8,0x3e,0xeb,0x16,0xed,0xda,0xf0,0xb2,0xf3,0xcb,0xf7,0x8d,0xf7,0x8d};//10個(gè)功率檔位的可控硅導(dǎo)通角延時(shí)參數(shù)表

                TH1=powertab[2*heatpower]-1;

                TL1=powertab[2*heatpower+1];//市電過零后,根據(jù)當(dāng)前設(shè)置的檔位給定時(shí)器T1賦延時(shí)參數(shù)

                ET1=1;//允許定時(shí)器T1中斷

                TR1=1;//打開定時(shí)器T1

                }

                /*------------------------------------------

                可控硅觸發(fā)信號(hào)控制函數(shù)voidtriaCCtrl(void)

                使用定時(shí)器T1中斷,寄存器組3

                向可控硅送出觸發(fā)信號(hào)

                ------------------------------------------*/

                voidtriacctrl(void)interrupt3using3

                {

                registerunsignedchari;

                triac=0;//輸出可控硅導(dǎo)通信號(hào)

                ET1=0;//關(guān)閉定時(shí)器T1中斷

                TR1=0;//終止定時(shí)器運(yùn)行

                for(i=0;i《2;i++);//延時(shí),保證導(dǎo)通信號(hào)有足夠的寬度

                triac=1;//完成可控硅導(dǎo)通信號(hào)

                }


              11. ·上一篇:
                ·下一篇:
              12. 其他關(guān)聯(lián)資訊
                深圳市日月辰科技有限公司
                地址:深圳市寶安區(qū)松崗鎮(zhèn)潭頭第二工業(yè)城A區(qū)27棟3樓
                電話:0755-2955 6626
                傳真:0755-2978 1585
                手機(jī):131 1300 0010
                郵箱:[email protected]

                深圳市日月辰科技有限公司 版權(quán)所有:Copyright?2010-2023 www.xydibang.com 電話:13113000010 粵ICP備2021111333號(hào)
                <strong id="0toem"><dl id="0toem"></dl></strong><b id="0toem"><menuitem id="0toem"></menuitem></b>

                    <b id="0toem"><menuitem id="0toem"></menuitem></b>
                  1. <code id="0toem"><abbr id="0toem"></abbr></code>
                    <strong id="0toem"><dl id="0toem"></dl></strong>
                    <kbd id="0toem"></kbd>
                            1. <code id="0toem"></code>
                              <th id="0toem"><progress id="0toem"></progress></th><strong id="0toem"><form id="0toem"></form></strong>

                              <th id="0toem"></th>
                            2. 91.xxxxx | 国产一级电影 | 成人三级片在线观看 | 亚洲区无码在线播放 | 亚色中文网 |