www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] /*--------------------------------------快熱式熱水器程序MCUAT89C51XAL12MHz--------------------------------------*///#pragmaSRC#include#include#includevoiddelay(unsignedint);//延時(shí)函數(shù)void

/*--------------------------------------
快熱式熱水器程序
MCUAT89C51XAL12MHz
--------------------------------------*/
//#pragmaSRC
#include

#include
#include
voiddelay(unsignedint);//延時(shí)函數(shù)
voiddisplay(void);//顯示函數(shù)
unsignedcharkeysCAN(void);//按鍵掃描處理函數(shù)
voidheatCTRl(void);//加熱控制函數(shù)
voidtemptest(void);//測(cè)溫函數(shù)
sbitswkey=P1^0;//開(kāi)關(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)前測(cè)得水溫寄存器
unsignedchardatadispram[2]={0x10,0x10};//顯示區(qū)緩存
unsignedchardataheatpower,px0count;//加熱檔位寄存器、外中斷0計(jì)數(shù)器
bittempov,t0tst,testok;//超溫標(biāo)志、測(cè)溫開(kāi)始標(biāo)志、測(cè)溫完成標(biāo)志
/*----------------------------------------------
主函數(shù)voidmain(void)
無(wú)參數(shù),無(wú)返回值
循環(huán)調(diào)用顯示、鍵掃描、溫度檢測(cè)、加熱控制函數(shù)
----------------------------------------------*/
voidmain(void)
{
unsignedchari,j;
ctemp=15;//初始化水溫寄存器
heatpower=5;//初始化加熱檔位為5當(dāng)
tempov=0;//清除超溫標(biāo)志
swkey=0;//默認(rèn)開(kāi)關(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;//打開(kāi)總中斷
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)行一次測(cè)溫
}while(--i);//通過(guò)改變循環(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,無(wú)返回值
延時(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)
無(wú)參數(shù),無(wú)返回值
兩位共陽(yáng)數(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)
無(wú)參數(shù),返回值:無(wú)符號(hào)字符型,無(wú)鍵按下為0,有鍵按下為其它
影響全局變量:heatpower
----------------------------------------------------------*/
unsignedcharkeyscan(void)
{
unsignedchari,ch;
if(upkey==0)//“+”鍵
{
buzz=0;//打開(kāi)蜂鳴器(發(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;//打開(kāi)蜂鳴器(發(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)//開(kāi)關(guān)鍵
{
buzz=0;//打開(kāi)蜂鳴器(發(fā)出按鍵音)
for(i=0;i<30;i++)display();//延時(shí)消抖
buzz=1;//關(guān)閉蜂鳴器
swkey=1;//置位開(kāi)關(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();//等待開(kāi)關(guān)鍵按下
buzz=0;//打開(kāi)蜂鳴器(發(fā)出按鍵音)
for(i=0;i<10;i++)display();//延時(shí)消抖
buzz=1;//關(guān)閉蜂鳴器
if(swkey==0)break;//確認(rèn)開(kāi)關(guān)鍵被按下
}
while(swkey==0)display();//等待鍵釋放
IE=ch;//還原中斷控制字IE
return(0);//返回?zé)o鍵按下
}
elsereturn(0);//無(wú)任何鍵按下時(shí)由此返回
}

/*--------------------------------------
加熱控制函數(shù)voidheatctrl(void)
無(wú)參數(shù),無(wú)返回值
判斷是否加熱、加熱功率及檔位指示燈處理
--------------------------------------*/
voidheatctrl(void)
{
if(!tempov)//當(dāng)沒(méi)有超溫標(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;//斷開(kāi)繼電器
EX1=0;ET1=0;triac=1;//關(guān)閉可控硅
buzz=0;//蜂鳴報(bào)警
}
}

/*--------------------------------------
測(cè)溫函數(shù)voidtemptest(void)
無(wú)參數(shù),無(wú)返回值,
影響全局變量:ctemp,tempov
測(cè)量并查表計(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;//測(cè)頻中斷函數(shù)參數(shù)
t0tst=1;//置測(cè)頻程序開(kāi)始標(biāo)志
EX0=1;//打開(kāi)測(cè)頻外中斷
testok=0;//清除測(cè)頻程序完成標(biāo)志
while(!testok)display();//等待測(cè)試完成
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;//如果溫度超過(guò)65度置位超溫標(biāo)志
elseif(temp<45)tempov=0;//當(dāng)溫度回落到45度以下時(shí)清除超溫標(biāo)志
}

/*------------------------------------------
測(cè)溫頻率測(cè)試函數(shù)voidtempFrequency(void)
使用外部X0中斷,寄存器組1
測(cè)出溫度——頻率轉(zhuǎn)換電路的頻率
------------------------------------------*/
voidtempfrequency(void)interrupt0using1
{
if(--px0count)return;//找齊起點(diǎn)或計(jì)數(shù)
if(t0tst)//如果是起點(diǎn)
{
t0tst=0;//清除測(cè)頻開(kāi)始標(biāo)志
px0count=100;//取100個(gè)方波為一次測(cè)頻
TH0=0;
TL0=0;//清除計(jì)時(shí)器T0
TR0=1;//開(kāi)始計(jì)時(shí)
}
else//如果是終點(diǎn)
{
TR0=0;//停止計(jì)時(shí)
EX0=0;//停止測(cè)頻外中斷
testok=1;//置位測(cè)頻完成標(biāo)志
}
}

/*--------------------------------------
加熱控制過(guò)〇檢測(cè)函數(shù)voidpass0(void)
使用外部X1中斷,寄存器組2
檢測(cè)過(guò)〇點(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];//市電過(guò)零后,根據(jù)當(dāng)前設(shè)置的檔位給定時(shí)器T1賦延時(shí)參數(shù)
ET1=1;//允許定時(shí)器T1中斷
TR1=1;//打開(kāi)定時(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)
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉