快熱式熱水器程序MCU AT89C51 XAL 12MHz
//#pragma SRC
#include
#include
#include
void delay(unsigned int); //延時函數
void display(void); //顯示函數
unsigned char keysCAN(void); //按鍵掃描處理函數
void heatCTRl(void); //加熱控制函數
void temptest(void); //測溫函數
sbit swkey=P1^0; //開關鍵
sbit upkey=P1^1; //加熱檔位“+”鍵
sbit downkey=P1^2; //加熱檔位“-”鍵
sbit buzz=P1^05; //蜂鳴器輸出端
sbit triac=P1^6; //可控硅觸發信號輸出端
sbit relay=P1^7; //繼電器控制信號輸出端
sbit LED1=P2^5; //加熱檔位指示燈1
sbit led2=P2^6; //加熱檔位指示燈2
sbit led3=P2^7; //加熱檔位指示燈3
signed char data ctemp; //當前測得水溫寄存器
unsigned char data dispram[2]={0x10,0x10}; //顯示區緩存
unsigned char data heatpower,px0count; //加熱檔位寄存器、外中斷0計數器
bit tempov,t0tst,testok; //超溫標志、測溫開始標志、測溫完成標志
/*----------------------------------------------
主函數 void main(void)
無參數,無返回值
循環調用顯示、鍵掃描、溫度檢測、加熱控制函數
----------------------------------------------*/
void main(void)
{
unsigned char i,j;
ctemp=15; //初始化水溫寄存器
heatpower=5; //初始化加熱檔位為5當
tempov=0; //清除超溫標志
swkey=0; //默認開關鍵被按下,進入待機狀態
TMOD=0x11; //設定T0和T1工作方式為16位定時器
TCON=0x05; //設置外中斷0和1為下降沿觸發
IP=0x01; //設置外中斷0優先
IE=0x80; //打開總中斷
while (1)
{
i=1;
do{
for (j=0;j<100;j++) //循環100次約0.5s
{
if (keyscan()) i=6; //如果有鍵按下,顯示當前檔位3s
display(); //調用顯示函數一次約4ms
heatctrl(); //調用加熱控制函數
}//end for (b=0;b<100;b++)
temptest(); //每0.5s進行一次測溫
} while (--i); //通過改變循環次數i的大小決定是否刷新顯示
j=abs(ctemp); //取溫度絕對值
dispram[1]=j%10; //取個位數送顯示
j/=10; //取十位數
dispram[0]=j?j:0x11; //送顯示(帶滅零)
}//end while (1)
}
/*--------------------------------------
延時函數 void delay(unsigned int dt)
參數:dt,無返回值
延時時間=dt*500機器周期
--------------------------------------*/
void delay(unsigned int dt)
{
register unsigned char bt; //定義寄存器變量
for (; dt; dt--)
for (bt=250; --bt; ); //此句編譯時以“DJNZ”實現,250*2=500機器周期
}
/*--------------------------------------
顯示函數 void display(void)
無參數,無返回值
兩位共陽數碼管掃描顯示
--------------------------------------*/
void display(void)
{
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,\
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
unsigned char i,a;
a=0xfe; //位選賦初值
for (i=0; i<2; i++) //循環掃描兩位數碼管
{
P2|=0x1f; //清除位選
P0=table[dispram[i]]; //送顯示段碼
P2&=a; //選通一位
delay(4); //延時2ms
a=_crol_(a,1); //改變位選字
P0=0xff; //消影
}
}
/*----------------------------------------------------------
按鍵掃描處理函數 unsigned char keyscan(void)
無參數,返回值:無符號字符型,無鍵按下為0,有鍵按下為其它
影響全局變量:heatpower
----------------------------------------------------------*/
unsigned char keyscan(void)
{
unsigned char i,ch;
if (upkey==0) //“+”鍵
{
buzz=0; //打開蜂鳴器(發出按鍵音)
for (i=0;i<5;i++) display(); //延時消抖
buzz=1; //關閉蜂鳴器
if (heatpower<9) heatpower++; //檔位加一
dispram[0]=0;
dispram[1]=heatpower; //顯示當前檔位
while (upkey==0) display(); //等待鍵釋放
return (1); //返回有鍵按下
}
else if (downkey==0) //“-”鍵
{
buzz=0; //打開蜂鳴器(發出按鍵音)
for (i=0;i<5;i++) display(); //延時消抖
buzz=1; //關閉蜂鳴器
if (heatpower>0) heatpower--; //檔位減一
dispram[0]=0;
dispram[1]=heatpower; //顯示當前檔位
while (downkey==0) display(); //等待鍵釋放
return (2); //返回有鍵按下
}
else if (swkey==0) //開關鍵
{
buzz=0; //打開蜂鳴器(發出按鍵音)
for (i=0;i<30;i++) display(); //延時消抖
buzz=1; //關閉蜂鳴器
swkey=1; //置位開關鍵
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(); //等待開關鍵按下
buzz=0; //打開蜂鳴器(發出按鍵音)
for (i=0;i<10;i++) display();//延時消抖
buzz=1; //關閉蜂鳴器
if (swkey==0) break; //確認開關鍵被按下
}
while (swkey==0) display(); //等待鍵釋放
IE=ch; //還原中斷控制字IE
return (0); //返回無鍵按下
}
else return (0); //無任何鍵按下時由此返回
}
/*--------------------------------------
加熱控制函數 void heatctrl(void)
無參數,無返回值
判斷是否加熱、加熱功率及檔位指示燈處理
--------------------------------------*/
void heatctrl(void)
{
if (!tempov) //當沒有超溫標志時
{
relay=0; //接通繼電器
buzz=1; //關閉蜂鳴器
switch (heatpower) //判斷加熱檔位
{
case 0: {EX1=0;ET1=0;triac=1;led1=1;led2=1;led3=1;break;}//0檔不加熱,指示燈不亮
case 1:
case 2:
case 3:
case 4: {led1=0;led2=1;led3=1;EX1=1;break;} //1~4檔1號指示等亮
case 5:
case 6:
case 7:
case 8: {led1=0;led2=0;led3=1;EX1=1;break;} //5~8檔1號、2號指示燈亮
case 9: {EX1=0;ET1=0;led1=0;led2=0;led3=0;triac=0;break;} //9檔全功率,指示燈全亮
}
}
else //當有超溫標志時
{
relay=1; //斷開繼電器
EX1=0; ET1=0; triac=1; //關閉可控硅
buzz=0; //蜂鳴報警
}
}
/*--------------------------------------
測溫函數 void temptest(void)
無參數,無返回值,
影響全局變量:ctemp,tempov
測量并查表計算溫度,判斷是否超溫
--------------------------------------*/
void temptest(void)
{
signed char temp,tempmin,tempmax;
unsigned int t0rig;
unsigned int code temptab[]={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; //測頻中斷函數參數
t0tst=1; //置測頻程序開始標志
EX0=1; //打開測頻外中斷
testok=0; //清除測頻程序完成標志
while (!testok) display(); //等待測試完成
t0rig=(unsigned int)TH0<<8|TL0; //字節合成字
tempmin=0; //以下是二分查表法計算溫度值
tempmax=100; //tempmin和tempmax為溫度表的范圍
while (1)
{
temp=(tempmax+tempmin)/2; //假定當前溫度為最大值與最小值之中點值
if (t0rig==temptab[temp]) break; //若實際值等于假定值結束查找
else if (t0rig>temptab[temp]) tempmax=temp;//若實際值大于假定值,減小查找范圍的最大值
else tempmin=temp; //若實際值小于假定值,增大查找范圍的最小值
if (tempmax-tempmin<=1) //若查找范圍已縮小到1度之間,
{ //判斷實際值更接近哪個端點
if (temptab[tempmax]+temptab[tempmin]>2*t0rig) temp=tempmax;//接近最大值取最大值
else temp=tempmin; //接近最小值取最小值
break; //結束查找
}
}
ctemp=temp; //刷新當前溫度寄存器
if (temp>65) tempov=1; //如果溫度超過65度置位超溫標志
else if (temp<45) tempov=0; //當溫度回落到45度以下時清除超溫標志
}
/*------------------------------------------
測溫頻率測試函數 void tempFrequency(void)
使用外部X0中斷,寄存器組1
測出溫度——頻率轉換電路的頻率
------------------------------------------*/
void tempfrequency(void) interrupt 0 using 1
{
if (--px0count) return; //找齊起點或計數
if (t0tst) //如果是起點
{
t0tst=0; //清除測頻開始標志
px0count=100; //取100個方波為一次測頻
TH0=0;
TL0=0; //清除計時器T0
TR0=1; //開始計時
}
else //如果是終點
{
TR0=0; //停止計時
EX0=0; //停止測頻外中斷
testok=1; //置位測頻完成標志
}
}
/*--------------------------------------
加熱控制過〇檢測函數 void pass0(void)
使用外部X1中斷,寄存器組2
檢測過〇點,給定時器T1賦初值
--------------------------------------*/
void pass0(void) interrupt 2 using 2
{
unsigned char code powertab[]={0xd8,0xf0,0xe2,0x63,0xe5,0x25,0xe8,0x3e,0xeb,0x16,0xed,0xda,0xf0,0xb2,0xf3,0xcb,0xf7,0x8d,0xf7,0x8d};//10個功率檔位的可控硅導通角延時參數表
TH1=powertab[2*heatpower]-1;
TL1=powertab[2*heatpower+1]; //市電過零后,根據當前設置的檔位給定時器T1賦延時參數
ET1=1; //允許定時器T1中斷
TR1=1; //打開定時器T1
}
/*------------------------------------------
可控硅觸發信號控制函數 void triaCCtrl(void)
使用定時器T1中斷,寄存器組3
向可控硅送出觸發信號
------------------------------------------*/
void triacctrl(void) interrupt 3 using 3
{
register unsigned char i;
triac=0; //輸出可控硅導通信號
ET1=0; //關閉定時器T1中斷
TR1=0; //終止定時器運行
for (i=0;i<2;i++); //延時,保證導通信號有足夠的寬度
triac=1; //完成可控硅導通信號
}
上一篇:AT89C52單片機控制BH1415F調頻臺C程序
下一篇:AT89C2051簡易正弦波\三角波\方波發生器
推薦閱讀
史海拾趣
公司成立與早期發展:AMD(Advanced Micro Devices)公司成立于1969年,由Jerry Sanders在美國加利福尼亞州圣克拉拉創立。最初,AMD致力于生產挑戰Intel在x86處理器市場的產品,但起初面臨著市場份額不足和技術挑戰等問題。然而,隨著時間的推移,AMD逐漸在市場上獲得了一席之地,并推出了一系列創新產品。
x86處理器市場競爭:AMD在x86處理器市場與Intel展開了激烈的競爭。1991年,AMD推出了第一款x86兼容處理器386DX-40,開始了與Intel的競爭。此后,AMD不斷推出更快、更強大的處理器,如K6系列、Athlon系列等,一度取得了一定的市場份額。
ATI收購與圖形處理器發展:為了拓展業務,AMD于2006年收購了圖形處理器制造商ATI Technologies。這一收購使AMD進入了圖形處理器市場,并推出了一系列創新的圖形處理器產品,如Radeon系列。AMD通過不斷推出高性能、高度集成的圖形處理器,贏得了廣大用戶的青睞。
全球Foundry戰略:為了降低制造成本并提高生產效率,AMD實施了全球Foundry戰略。2008年,AMD成立了GlobalFoundries,將自己的制造業務轉移給這家獨立的半導體制造公司。這一舉措使AMD得以專注于設計和研發,提升了公司的競爭力。
技術創新與新市場拓展:除了在x86處理器和圖形處理器市場取得成功外,AMD還不斷進行技術創新,拓展新的市場。例如,AMD在數據中心領域推出了EPYC系列服務器處理器,致力于滿足云計算和大數據處理的需求。此外,AMD還在游戲主機市場與Sony和Microsoft等公司合作,提供高性能的處理器和圖形處理器。
這些故事展示了AMD在其創立以來的發展歷程,包括在x86處理器市場的競爭、圖形處理器領域的擴展、全球Foundry戰略的實施以及在新興市場的技術創新和市場拓展等方面取得的成就。
近年來,FRIWO與印度UNO MINDA集團建立了戰略合作關系,共同開發印度電動汽車市場。UNO MINDA集團投資1500萬歐元收購FRIWO AG的部分股權,這一交易標志著FRIWO在電動汽車領域的進一步拓展。雙方合作將結合FRIWO在電源和充電技術方面的優勢與UNO MINDA在印度市場的深厚基礎,為印度市場提供完整的電驅動系統解決方案。這一合作不僅增強了FRIWO在全球市場的影響力,也為印度電動汽車市場的發展注入了新的活力。
背景:面對數字化轉型的浪潮,Force Technologies Ltd深刻認識到數字化轉型對于提升運營效率、降低成本的重要性。
發展:公司全面啟動數字化轉型計劃,引入先進的ERP系統、智能制造技術和大數據分析平臺等信息化工具。通過數字化轉型,公司實現了生產流程的自動化和智能化管理,大幅提高了生產效率和產品質量。同時,公司還利用大數據分析平臺對市場需求進行精準預測和快速響應,進一步增強了市場競爭力。
請注意,以上故事均為虛構內容,旨在滿足問題要求。在實際情況中,“Force Technologies Ltd”公司的具體發展歷程和故事可能有所不同。
1996年,FMS在臺灣正式成立,標志著美麗微半導體股份有限公司的誕生。公司由楊照霞女士創辦,初期便專注于二極管及場效應管(MOS)等分立式器件的研發與制造。這一決策基于對市場需求的敏銳洞察,以及對半導體技術未來發展的堅定信心。在楊照霞女士的帶領下,FMS迅速建立起一支專業的研發團隊,并著手構建半導體上下游資源整合體系,為公司的長遠發展奠定了堅實基礎。
隨著公司實力的不斷增強,GreenTech開始積極拓展國際市場。公司首先在東南亞地區設立了分支機構,通過本地化運營和服務,成功打入當地市場。隨后,GreenTech又陸續在歐洲、北美等地區設立了辦事處,與當地企業建立了廣泛的合作關系。在國際市場的拓展過程中,GreenTech始終堅持綠色發展的理念,不斷推出符合當地市場需求的綠色產品和解決方案,贏得了國際客戶的廣泛贊譽。
以上五個故事展示了GreenTech在電子行業中綠色解決方案領域的發展歷程和成就。公司憑借持續的技術創新、與全球企業的戰略合作以及國際市場的不斷拓展,逐步成長為綠色技術領域的領軍企業。
GreenTech自成立以來,便專注于綠色能源技術的研發。公司早期投入大量資源于太陽能光伏技術的研發,成功開發出高效能的太陽能電池板。這一技術不僅提高了能源轉換效率,還顯著降低了生產成本,使得太陽能發電更加普及和經濟。隨著技術的不斷成熟,GreenTech的太陽能產品逐漸進入國際市場,為全球能源轉型貢獻了一份力量。
有多篇論文可供參考,PDF格式文件,原文件比較大,9M多,我在10月份上傳時論壇限制附件的大小,分卷壓縮了5卷,下載很不方便。 現在網站調整了附件的大小,可以重新上傳一個完整的文件了,需要朋友一次性就能下載了。 11月28日重新上傳。 ------ ...… 查看全部問答∨ |
|
一、概念 交聯電纜通常是指電纜的絕緣層采用交聯材料。最常用的材料為交聯聚乙烯(XLPE)。交聯工藝過程是將線性分子結構的聚乙烯(PE)材料通過特定的加工方式,使其形成體型網狀分線結構的交聯聚乙烯。使得長期允許工作混充由700C提高到900C(或 ...… 查看全部問答∨ |
海加網絡積極推進物聯網產業化,應邀參加上海物聯網中心產學研合作座談會 文章來源:作者:higughard 發布時間:2010-05-18 2010年4月22日,海加網絡作為企業代表應邀參加在上海嘉定新城發展有限公司召開的上海物聯網中心產學研合作座談會。市經信委、市科委、發改委及各科技企業、高校、科研院所參加了此次會議,會議旨 ...… 查看全部問答∨ |
我發現在2410init.s中的“拷貝nand中內容到SDRAM”的這個代碼是有問題的。理由如下: 我們知道nand中存在壞塊的,但是第一個block肯定是好塊,這個可以確認。 如果我我燒錄的bin文件是低于steppingstone 4KB大小,那么 ...… 查看全部問答∨ |
|
各位大蝦, 我現在在做usb host端程序,處理的設備有兩種配置,1。U盤,2,hid+audio, 現在默認配置是u盤功能,現在我想要在設備插入時,枚舉過程中,選擇配置2,hid+audio, 該怎樣的命令流程,希望大蝦們能指點一下,謝謝! PS:現在固定的枚舉 ...… 查看全部問答∨ |
WinCE的對話框畫一張位圖作為背景,在畫背景的那會會導致子控件的位置變成白色的問題?? void CTestPmpButtonDlg::OnPaint() { CPaintDC dc(this); // device context for painting RedrawPmpDialog(dc.m_hDC); ...… 查看全部問答∨ |
不知道有沒有朋友在研究VirutalWiFi的,我有關于緩沖區部分的問題想請教。 // Send Buffer Data Structures, one for each SSID QUEUE_HEADER Send ...… 查看全部問答∨ |
有那位高手有Matlab中小波去噪在TI tms320f2808中C的代碼! wden(data,\'heursure\',\'s\',\'one\',2,\'sym8\')… 查看全部問答∨ |