#include <STC12C5A.H> #define uchar unsigned char #define uint unsigned int uchar index; uchar a,b,c; //定義三個變量、。 uchar m; // uint teempr; // uint z,i; //*********************************************★下面是PWM調制的數組★******************************************************** //220- zhan0.02 214--0.04 209-0.07 203-0.11 195- 0.15 185-0.25 173-0.31 160-0.38 145-0.45 129-0.48 111-0.48 42OFF //0.74 .81 .91 1.03 1.22 1.45 1.69 2.28 2.62 0.74 0.81 0.90 1.03 右大 // 熱敏電阻受熱以后阻值變小。受涼以后阻值變大。 uchar code pwm[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38, 39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115, 116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146, 147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177, 178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208, 209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254}; //3525 2腳電壓高輸出占空比也大,2腳電壓越低那么占空比也就越小。 6腳電壓拉低的話頻率就升高,6腳電壓高頻率就降低。 //************************************************************************************************************************ //************************************************************************************************************************ //************************************************ 下面的是DISP顯示數組*************************************************** uchar code table100[]={"※※※※※※※※"}; uchar code table101[]={" www.zg4o1577.cn "}; uchar code table1[]={"★當前檔位一★"}; uchar code table2[]={"★當前檔位二★"}; uchar code table3[]={"★當前檔位03★"}; uchar code table4[]={"★當前檔位四★"}; uchar code table5[]={"★當前檔位五★"}; uchar code table6[]={"★當前檔位六★"}; uchar code table7[]={"★當前檔位七★"}; uchar code table8[]={"★當前檔位八★"}; uchar code table9[]={"★當前檔位九★"}; uchar code table10[]={"★當前檔位十★"}; uchar code table11[]={"測試版本:V1.1"}; uchar code table12[]={"zhinengjiqi.com"}; uchar code table13[]={"歡迎使用智能機器"}; uchar code table14[]={"GSM:18663523202"}; uchar code table15[]={"警告電壓過高保護"}; uchar code table16[]={"警告檢測短路故障"}; uchar code table17[]={"警告長時間沒放鍋"}; uchar code table18[]={"警告線盤溫度過高"}; uchar code table19[]={"警告散熱器溫度高"}; uchar code table20[]={"警告風扇發生故障"}; uchar code table21[]={"警告環境濕度過高"}; uchar code table22[]={"機器鎖定咨詢客服"}; uchar code table23[]={"警告電源線未接好"}; uchar code table24[]={"Θ開機軟啟動中Θ"}; uchar code table25[]={"請稍候¨¨"}; //****************************************************************************************************************** //*************************************************按鍵定義*********************************************************** sbit pd = P0^4 ; //占空比升高 sbit px = P0^5 ; //占空比降低 sbit zd = P0^6 ; //頻率增加 sbit zx = P0^7 ; // 頻率減小 //**************************************************按鍵定義到此結束。****************************************************** sbit rs=P0^0; //數據,命令選擇端 sbit rw=P0^1; //讀寫選擇 sbit beiguang=P0^3;//LED背光 sbit e=P0^2; //使能端 sbit baohu=P5^3; //PWM保護關閉。 //*************************************************** 液晶pin定義結束。*************************************************** sbit DQ=P3^4; //溫度探頭數據口。 sbit yurest=P4^4; //語音復位 sbit yushuju=P4^1; //語音數據 sbit yuzhuangtai=P4^5; //語音狀態 //***************************************************語音pin定義到此結束***************************************************** //********************************************************************************************************* //**************************************************** 各種延時子函數******************************************************* void yanshi(uint xms)//延時多久需要計算。 { uint x ,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); } //****************************************************************************************************************** void delay_1ms(uint z) //延時一毫秒的指令。核對過時間很準確 { uint x,y; for(x=z;x>0;x--) for(y=1800;y>0;y--); } //************************************************************** void delay_50us(uint t) //延時50微秒的指令。核對過時間很準確 { uint j; for(;t>0;t--) for(j=91;j>0;j--); } //************************************************************************************************************************ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //************************************************************************************************************************ //************************************************以下是12864顯示的子函數***************** ****************************** //****************************************************************************************************************** void write_12864_com(uchar com) //寫命令子函數 { rs=0; //數據命令選擇端口。=1寫數據,=0寫命令 。 P2=com;//把數據送到P2口傳遞給液晶。 e=1;//使能端高電平。 delay_50us(10); //延時一小會保證使能的高電平寬度達到要求、 e=0;//完成使能信號的脈沖要求給置零。 delay_50us(2); } //******************************************************* void write_12864_dat(uchar dat) //寫數據子函數 { rs=1; //數據命令選擇端口。=1寫數據,=0寫命令 。 rw=0; //讀寫 delay_50us(1); P2=dat;//把數據送到P2口傳遞給液晶。 e=1;//使能端高電平。 delay_50us(10); //延時一小會保證使能的高電平寬度達到要求、 e=0;//完成使能信號的脈沖要求給置零。 delay_50us(2); } //******************************************************************************************************** void init_12864() //液晶初始化子函數。 { delay_1ms(100); write_12864_com(0x30); //基本指令操作); // delay_50us(4); write_12864_com(0x0c); write_12864_com(0x06); delay_50us(10); } //***************************************************以下是各個檔位的畫面*********************************************** void dispdangwei(uint f) //*****************************f是多少就是幾檔畫面************************************************* { init_12864();//初始化液晶。 write_12864_com(0x80);//設定顯示位置是第一行。 for(i=0;i<16;i++) //第一行有多少字,漢字占兩個位置。標點符號一個。 { write_12864_dat(table101[i]); //開始挨個把表中的字一位一位的通過12864的數據發送子程序發送出去。 delay_50us(1); //延時一會保證數據有發送完畢。 } write_12864_com(0x90); //設定第二行。 for(i=0;i<16;i++) {dat(table100[i]);; } write_12864_com(0x88); //設定第三行 for(i=0;i<14;i++) { switch(f) { case 1: write_12864_dat(table1[i]); break; case 2: write_12864_dat(table2[i]); break; case 3: write_12864_dat(table3[i]); break; case 4: write_12864_dat(table4[i]); break; case 5: write_12864_dat(table5[i]); break; break; case 7: write_12864_dat(table7[i]); break; case 8: write_12864_dat(table8[i]); break; case 9: write_12864_dat(table9[i]); break; case 10: write_12864_dat(table10[i]); break; } delay_50us(1);行顯示位置。 for(i=0;i<16;i++) { write_12864_dat(table100[i]); delay_50us(1); } } //************************************************************************************************************************* //*********************************************************************************************************************** //******************************************************************************************************************* //*********************************************************************************************************************** //***********************************************下面是語音參數設定****************************************************** //*********************************************************************************************************************** void yufuwei() //語音復位子程序。 { yurest=0;//這句是防止REST不是低電平。保險起見給他拉低。 yurest=0; //到這里語音就復位結束。 } //********************************************************************************************************************** void yuyin(z) //語音的播放程序。Z等于幾就播放第幾段。(語音參數內部調用,主程序不用。) { yufuwei(); //清除以前的播放數據進行復位。防止和前次的播放數據相加播放錯誤、 while(z>0) { yushuju=0; } //********************************************************************************************** void dangweitouyin() // 語音:檔位。 用來給檔位語音添加頭音。 { yufuwei(); //語音復位子函數。目的是在播放這段之前停止正在播放的。、一小會。 yuyin(11); //指定播放語音IC中的第11段語音。 } //******************************************************************************************************** void jinggao() //報警用的音樂文件。 用來給各種告警添加頭音。只是警告語音的前頭那段音樂。位子函數。目的是在播放這段之前停止正在播放的。、 機速度太快了延一小會。 yuyin(23); //指定播放語音IC中的第11段語音。 } //*********************************************************************************************** void baojing(uint o) // 各種報警的子函數里面的O等于幾就是對應的報警。 { jinggao(); //這里是警告的頭音音樂文件。 delay_1ms(2000);//延時2秒想起來警告頭音。 yuyin(o); //警告的內容。 } //***************************************************************************************** void jinggaoduanlu() //短路保護警告音。 { baojing(18);//播放第18條報警語音。內容是:短路保護. } //***************************************************************************************** void jinggaofengshanguzhang() { baojing(19);//播放第19條報警語音。內容是:警告風扇故障。 } //***************************************************************************************** void jinggaoguoyabaohu() { baojing(21);//播放第12條報警語音。內容是:電源線未接好,請檢查。 } //***************************************************************************************** void jinggaoguowenbaohu() { baojing(20);//播放第20條報警語音。內容是:警告過壓保護。 } //***************************************************************************************** void dianyuanxianweijiehao() { baojing(12);//播放第12條報警語音。內容是:電源線未接好,請檢查。 } //***************************************************************************************** void jinggaomima() { baojing(22);//播放第22條報警語音。內容是:請咨詢客服輸入密碼。 } //***************************************************************************************** void jinggao1() //報警用的音樂文件。 用來給各種告警添加頭音。只是警告語音的前頭那段音樂。 { yufuwei(); //語音復位子函數。目的是在播放這段之前停止正在播放的。、 delay_50us(1);//單片機速度太快了延一小會。 yuyin(26); //指定播放語音IC中的第11段語音。 } //******************************************************************************************************************** void music(uint j) //帶參數的子函數,里面的J等于幾就是播放 第幾段語音。 { dangweitouyin();//檔位頭音。 if(yuzhuangtai==0) //檢測是不是語音頭文件在播放。如果播放就讓程序進入里面等一會讓頭文件播放結束。 { while(!yzhuangtai);//如果檢測到語音狀態發生了改變那么就跳出來這個死循環。否則就在這原地打轉等待。 } if(yuzhuagtai==1) //檢測是不是語音頭文件播放結束了。如果結束了那么開始播放本段語音。 { if(j==10) //因為語音的十不是在語音的第十段,那就利用這么兩個if語句進行判斷是不是檔位數據送來10. { yuyin(28); //如果來的數據是10,那么就進入把語音的子函數參數修改成 28執行檔位十的語音。 } if(j!=10) //又為了避免在檔位十的時候送完28的語音參數再過來送10的錯誤數據,所以在送來不是10的時候才執行1-9數據 { yuyin(j); //播放語音的第K段。~~~~~~~~~~~~~~~內容是:j ~~~~~~~~~~~~~~~~~ } } } //********************************************************************************************************************* //********************************************************************************************************************* //********************************************************************************************************************* //********************************************************************************************************************* //********************************************************************************************************************* //***********************************下面是1-10檔位的子函數調用了顯示畫面和語音***************************************** //********************************************************************************************************************** void dangwei(uint k) // 檔位1-10的子函數。 { switch(k) { case 1: //檔位1. a=25;//火力的占空比是25. break; case 2: //檔位2. a=50;//火力的占空比是50. break; case 3: //檔位3 a=75;//火力的占空比是75. break; case 4: //檔位4 a=100;//火力的占空比是25. break; case 5: //檔位5 a=125;//火力的占空比是25. break; case 6: //檔位6 a=25;//火力的占空比是25. break; case 7: //檔位7 a=25;//火力的占空比是25. break; case 8: //檔位8 a=25;//火力的占空比是25. break; case 9: a=25;//火力的占空比是25. break; case 10: a=25;//火力的占空比是25. break; } dispdangwei(k);//檔位K的畫面 music(k);//檔位K的語音。 } //********************************************************************************************************************** //************************************************************************************************************************* //******************************************到這里檔位定義信息完畢!!***************************************************** //********************************************************************************************************************** //****************************************************下面是PCA計數器初始化************************************************ void init_pca(void)//pca計數器初始化函數 { CMOD=0x00; CCON=0x00; CCAP0=0X2; //8位PWM輸出,無中斷。PWM0 CCAP1=0x2;//8位PWM輸出,無中斷 。PWM1 CL=0x00;//清零pca計數器 CH=0x00; CCA1L=pm[0]; //初始化PWM1輸出的占空比 CCA1H=pw[0]; CCA0L=pm[0]; //初始化PWM0輸出的占空比 CCA0H=pm[0]; CR=1;//運行pca計數器 } //************************************************************************************************************************* //***************************************************************************************************************** //*********************************************************************************************************************** void huanying() { yuyin(30);//語音的歡迎語。 init_12864();//初始化液晶。 write_12864_com(0x80);//設定顯示位置是第一行。 for(i=0;i<16;i++) //第一行有多少字,漢字占兩個位置。標點符號一個。 { write_12864_at(table100[i]); //開始挨個把表中的字一位一位的通過12864的數據發送子程序發送出去。 delay_50us(1); //延時一會保證數據有發送完畢。 } write_12864_com(0x90); //設定第二行。 for(i=0;i<16;i++) { write_1284_dat(table24[i]); delay_50us(1; } write_12864_com(0x88); //設定第三行 for(i=0;i<10i++) { write_12864_dat(table25[i]); delay_50us(1); } write_12864_com(0x98);//設定第四行顯示位置。 for(i=0;i<16;i++) { write_12864dat(table100[i]); delay_50us(1); } //##################################第二幅畫面。 delay_1s(2000);//延時保持2秒鐘的第一幅畫面。 init_12864();//初始化液晶。 write_12864_com(0x80);//設定顯示位置是第一行。 for(i=0;i<14;i++) //第一行有多少字,漢字占兩個位置。標點符號一個。 { write_12864_dat(table11[i]); //開始挨個把表中的字一位一位的通過12864的數據發送子程序發送出去。 delay_50us(1); //延時一會保證數據有發送完畢。 } write_12864_com(0x90); //設定第二行。 for(i=0;i<16;i++) { write_12864_dat(table13[i]); delay_50us(1); write12864_com(0x88); //設定第三行 for(i=0;i<16;i++) { write_12864_dat(table12[i]); delay_50us(1); } write_12864_com(0x98);//設定第四行顯示位置。 for(i=0;i<16;i++) { write_12864_dat(table14[i]); delay_50us(1); } } //*********************************************************************************************************************** //********************************************************************************************************************* void main() { P4SW=0x7F; //設置P4為雙向IO口。 c=0;//寫入未執行過按鍵操作的標志位 baohu=1;//先強制打開保護功能,促使PWN徹底關閉,防止上機的那種不可控的頻率。讓PWM有規律可循。 beiguang=1;//打開背光 yanshi(30);//延時一小會保證已經徹底關閉。 init_pa();//初始化PWM控制器。 m=0; temp=0; init_1864();//初始化液晶。 huanying();//開機歡迎語和歡迎畫面。 while(1) { if(pd==0) //檔位加 { yanshi(50); if(pd==0) { m++ //檢測火力+按鍵按了幾次。是幾次就是幾檔位、 if(m==11) //當檔位增加到11次以后,就給復位到檔位1.防止出現錯誤。 { m=1; } dangwei(m); //檔位的各種信息。 while(!pd); } } if(px==0) //檔位減 { yanshi(50); if(px==0) { if(m==0) { m=2; } m--; //檢測火力-按鍵按了幾次。是幾次就是幾檔位、 if(m<=0)//當檔位增加到0次以后,就關閉所有檔位的輸出。 { m=1; } dangwei(m); //檔位的各種信息。 while(!p); } } if(zd==0) { yanshi(10); if(zd==0) { b--; if(b<=0) { b=56; }; c=1; while(!zd); } } if(zx==0) { yanshi(10); if(zx==0) { b++; if(b>=56) { b=0; }; while(!zx); } } CCAP1L=pwm[a]; //初始化PWM1輸出的占空比 CCAP1H=pwm[a]; CCAP0L=pw[b]; //初始化PWM0輸出的占空比 CCAP0H=pm[b]; if(c>=1)//檢測是不是已經穩定好了PWM。 { baohu=0;//開啟PWM輸出。 } } }