專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

51單片機(jī)語音+溫度控制的源碼

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年10月13日   【字體:

#include <STC12C5A.H>
#define uchar unsigned char
#define uint unsigned int
uchar index;
uchar a,b,c; //定義三個(gè)變量、。
uchar m;         //
uint teempr;       //
uint  z,i;

//*********************************************★下面是PWM調(diào)制的數(shù)組★********************************************************
//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顯示數(shù)組***************************************************
uchar code table100[]={"※※※※※※※※"};
uchar code table101[]={"  www.torrancerestoration.com "};
uchar code table1[]={"★當(dāng)前檔位一★"};
uchar code table2[]={"★當(dāng)前檔位二★"};
uchar code table3[]={"★當(dāng)前檔位03★"};
uchar code table4[]={"★當(dāng)前檔位四★"};
uchar code table5[]={"★當(dāng)前檔位五★"};
uchar code table6[]={"★當(dāng)前檔位六★"};
uchar code table7[]={"★當(dāng)前檔位七★"};
uchar code table8[]={"★當(dāng)前檔位八★"};
uchar code table9[]={"★當(dāng)前檔位九★"};
uchar code table10[]={"★當(dāng)前檔位十★"};
uchar code table11[]={"測(cè)試版本:V1.1"};
uchar code table12[]={"zhinengjiqi.com"};
uchar code table13[]={"歡迎使用智能機(jī)器"};
uchar code table14[]={"GSM:18663523202"};
uchar code table15[]={"警告電壓過高保護(hù)"};
uchar code table16[]={"警告檢測(cè)短路故障"};
uchar code table17[]={"警告長(zhǎng)時(shí)間沒放鍋"};
uchar code table18[]={"警告線盤溫度過高"};
uchar code table19[]={"警告散熱器溫度高"};
uchar code table20[]={"警告風(fēng)扇發(fā)生故障"};
uchar code table21[]={"警告環(huán)境濕度過高"};
uchar code table22[]={"機(jī)器鎖定咨詢客服"};
uchar code table23[]={"警告電源線未接好"};
uchar code table24[]={"Θ開機(jī)軟啟動(dòng)中Θ"};
uchar code table25[]={"請(qǐng)稍候¨¨"};
//******************************************************************************************************************


//*************************************************按鍵定義***********************************************************
sbit pd =   P0^4    ;  //占空比升高
sbit px =   P0^5    ;  //占空比降低
sbit zd =   P0^6    ;  //頻率增加
sbit zx =   P0^7    ;  // 頻率減小
//**************************************************按鍵定義到此結(jié)束。******************************************************
sbit rs=P0^0; //數(shù)據(jù),命令選擇端
sbit rw=P0^1; //讀寫選擇
sbit beiguang=P0^3;//LED背光
sbit e=P0^2; //使能端
sbit baohu=P5^3; //PWM保護(hù)關(guān)閉。
//***************************************************  液晶pin定義結(jié)束。***************************************************
sbit DQ=P3^4;   //溫度探頭數(shù)據(jù)口。
sbit yurest=P4^4; //語音復(fù)位
sbit yushuju=P4^1; //語音數(shù)據(jù)
sbit yuzhuangtai=P4^5; //語音狀態(tài)
//***************************************************語音pin定義到此結(jié)束*****************************************************
//*********************************************************************************************************

//**************************************************** 各種延時(shí)子函數(shù)*******************************************************
void yanshi(uint xms)//延時(shí)多久需要計(jì)算。
  {
   uint x ,y;
    for(x=xms;x>0;x--)
   for(y=110;y>0;y--);
  }
//******************************************************************************************************************
void delay_1ms(uint z)   //延時(shí)一毫秒的指令。核對(duì)過時(shí)間很準(zhǔn)確
{
uint x,y;
for(x=z;x>0;x--)
for(y=1800;y>0;y--);
}
//**************************************************************
void delay_50us(uint t)  //延時(shí)50微秒的指令。核對(duì)過時(shí)間很準(zhǔn)確
{
uint j;
for(;t>0;t--)
for(j=91;j>0;j--);
}
//************************************************************************************************************************
 


//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//************************************************************************************************************************
//************************************************以下是12864顯示的子函數(shù)*****************   ******************************
//******************************************************************************************************************
void write_12864_com(uchar com) //寫命令子函數(shù)
{
 rs=0; //數(shù)據(jù)命令選擇端口。=1寫數(shù)據(jù),=0寫命令 。
 P2=com;//把數(shù)據(jù)送到P2口傳遞給液晶。
 e=1;//使能端高電平。
 delay_50us(10); //延時(shí)一小會(huì)保證使能的高電平寬度達(dá)到要求、
 e=0;//完成使能信號(hào)的脈沖要求給置零。
 delay_50us(2);
}
 //*******************************************************

void write_12864_dat(uchar dat) //寫數(shù)據(jù)子函數(shù)
{
 rs=1; //數(shù)據(jù)命令選擇端口。=1寫數(shù)據(jù),=0寫命令 。
 rw=0; //讀寫
 delay_50us(1);
 P2=dat;//把數(shù)據(jù)送到P2口傳遞給液晶。
 e=1;//使能端高電平。 delay_50us(10); //延時(shí)一小會(huì)保證使能的高電平寬度達(dá)到要求、
 e=0;//完成使能信號(hào)的脈沖要求給置零。
 delay_50us(2);
}
//********************************************************************************************************           
void init_12864()  //液晶初始化子函數(shù)。
 {
     delay_1ms(100);
  write_12864_com(0x30); //基本指令操作); //
      delay_50us(4);
  write_12864_com(0x0c);
  write_12864_com(0x06);
  delay_50us(10);
 }
//***************************************************以下是各個(gè)檔位的畫面***********************************************

void dispdangwei(uint f)     //*****************************f是多少就是幾檔畫面*************************************************
 {
     init_12864();//初始化液晶。
  write_12864_com(0x80);//設(shè)定顯示位置是第一行。
  for(i=0;i<16;i++)    //第一行有多少字,漢字占兩個(gè)位置。標(biāo)點(diǎn)符號(hào)一個(gè)。
  {
  write_12864_dat(table101[i]); //開始挨個(gè)把表中的字一位一位的通過12864的數(shù)據(jù)發(fā)送子程序發(fā)送出去。
  delay_50us(1);          //延時(shí)一會(huì)保證數(shù)據(jù)有發(fā)送完畢。
   }
  write_12864_com(0x90); //設(shè)定第二行。
  for(i=0;i<16;i++)
  {dat(table100[i]);;
  }
  write_12864_com(0x88); //設(shè)定第三行
  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);
  }
 }
//*************************************************************************************************************************
//***********************************************************************************************************************
//*******************************************************************************************************************

 

//***********************************************************************************************************************
//***********************************************下面是語音參數(shù)設(shè)定******************************************************
//***********************************************************************************************************************
void yufuwei() //語音復(fù)位子程序。
{
 yurest=0;//這句是防止REST不是低電平。保險(xiǎn)起見給他拉低。
 yurest=0; //到這里語音就復(fù)位結(jié)束。
}
//**********************************************************************************************************************
void yuyin(z) //語音的播放程序。Z等于幾就播放第幾段。(語音參數(shù)內(nèi)部調(diào)用,主程序不用。)
{
  yufuwei();  //清除以前的播放數(shù)據(jù)進(jìn)行復(fù)位。防止和前次的播放數(shù)據(jù)相加播放錯(cuò)誤、 
    while(z>0)
    {
     yushuju=0;
  } 
//**********************************************************************************************
void dangweitouyin() // 語音:檔位。 用來給檔位語音添加頭音。
  {
   yufuwei();  //語音復(fù)位子函數(shù)。目的是在播放這段之前停止正在播放的。、一小會(huì)。
   yuyin(11);  //指定播放語音IC中的第11段語音。
  }
//********************************************************************************************************
void jinggao() //報(bào)警用的音樂文件。 用來給各種告警添加頭音。只是警告語音的前頭那段音樂。位子函數(shù)。目的是在播放這段之前停止正在播放的。、
 機(jī)速度太快了延一小會(huì)。
   yuyin(23);  //指定播放語音IC中的第11段語音。
  }
//***********************************************************************************************
void baojing(uint o) // 各種報(bào)警的子函數(shù)里面的O等于幾就是對(duì)應(yīng)的報(bào)警。
  {
   jinggao();   //這里是警告的頭音音樂文件。
   delay_1ms(2000);//延時(shí)2秒想起來警告頭音。
   yuyin(o); //警告的內(nèi)容。 
  }
//*****************************************************************************************
void jinggaoduanlu()  //短路保護(hù)警告音。
  {
   baojing(18);//播放第18條報(bào)警語音。內(nèi)容是:短路保護(hù).
  }
//*****************************************************************************************
void jinggaofengshanguzhang()
  {
   baojing(19);//播放第19條報(bào)警語音。內(nèi)容是:警告風(fēng)扇故障。
  }
//*****************************************************************************************
void jinggaoguoyabaohu()
  {
   baojing(21);//播放第12條報(bào)警語音。內(nèi)容是:電源線未接好,請(qǐng)檢查。
  }
//*****************************************************************************************
void jinggaoguowenbaohu()
  {
   baojing(20);//播放第20條報(bào)警語音。內(nèi)容是:警告過壓保護(hù)。
  }
//*****************************************************************************************
 void dianyuanxianweijiehao()
  {
   baojing(12);//播放第12條報(bào)警語音。內(nèi)容是:電源線未接好,請(qǐng)檢查。
  }
//*****************************************************************************************
 void jinggaomima()
  {
   baojing(22);//播放第22條報(bào)警語音。內(nèi)容是:請(qǐng)咨詢客服輸入密碼。
  }
//*****************************************************************************************
void jinggao1() //報(bào)警用的音樂文件。 用來給各種告警添加頭音。只是警告語音的前頭那段音樂。
  {
   yufuwei();  //語音復(fù)位子函數(shù)。目的是在播放這段之前停止正在播放的。、
   delay_50us(1);//單片機(jī)速度太快了延一小會(huì)。
   yuyin(26);  //指定播放語音IC中的第11段語音。
  }
//********************************************************************************************************************
void music(uint j)   //帶參數(shù)的子函數(shù),里面的J等于幾就是播放 第幾段語音。
{
  dangweitouyin();//檔位頭音。
    if(yuzhuangtai==0) //檢測(cè)是不是語音頭文件在播放。如果播放就讓程序進(jìn)入里面等一會(huì)讓頭文件播放結(jié)束。
       {
  while(!yzhuangtai);//如果檢測(cè)到語音狀態(tài)發(fā)生了改變那么就跳出來這個(gè)死循環(huán)。否則就在這原地打轉(zhuǎn)等待。
      }
    if(yuzhuagtai==1) //檢測(cè)是不是語音頭文件播放結(jié)束了。如果結(jié)束了那么開始播放本段語音。
       {
     if(j==10)   //因?yàn)檎Z音的十不是在語音的第十段,那就利用這么兩個(gè)if語句進(jìn)行判斷是不是檔位數(shù)據(jù)送來10.
       {
      yuyin(28);  //如果來的數(shù)據(jù)是10,那么就進(jìn)入把語音的子函數(shù)參數(shù)修改成 28執(zhí)行檔位十的語音。
    }
     if(j!=10) //又為了避免在檔位十的時(shí)候送完28的語音參數(shù)再過來送10的錯(cuò)誤數(shù)據(jù),所以在送來不是10的時(shí)候才執(zhí)行1-9數(shù)據(jù)
     { 
          yuyin(j); //播放語音的第K段。~~~~~~~~~~~~~~~內(nèi)容是:j ~~~~~~~~~~~~~~~~~
          }
    }


 }
//*********************************************************************************************************************
//*********************************************************************************************************************
//*********************************************************************************************************************

//*********************************************************************************************************************


//*********************************************************************************************************************
//***********************************下面是1-10檔位的子函數(shù)調(diào)用了顯示畫面和語音*****************************************
//**********************************************************************************************************************
void dangwei(uint k) // 檔位1-10的子函數(shù)。
 {
   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計(jì)數(shù)器初始化************************************************  
void init_pca(void)//pca計(jì)數(shù)器初始化函數(shù)
{
CMOD=0x00;
CCON=0x00;
CCAP0=0X2; //8位PWM輸出,無中斷。PWM0
CCAP1=0x2;//8位PWM輸出,無中斷 。PWM1
CL=0x00;//清零pca計(jì)數(shù)器
CH=0x00;
CCA1L=pm[0];    //初始化PWM1輸出的占空比
CCA1H=pw[0];
CCA0L=pm[0];    //初始化PWM0輸出的占空比
CCA0H=pm[0];
CR=1;//運(yùn)行pca計(jì)數(shù)器
}
//*************************************************************************************************************************
//*****************************************************************************************************************
//***********************************************************************************************************************
void huanying()
 {
     yuyin(30);//語音的歡迎語。
     init_12864();//初始化液晶。
  write_12864_com(0x80);//設(shè)定顯示位置是第一行。
  for(i=0;i<16;i++)    //第一行有多少字,漢字占兩個(gè)位置。標(biāo)點(diǎn)符號(hào)一個(gè)。
  {
  write_12864_at(table100[i]); //開始挨個(gè)把表中的字一位一位的通過12864的數(shù)據(jù)發(fā)送子程序發(fā)送出去。
  delay_50us(1);          //延時(shí)一會(huì)保證數(shù)據(jù)有發(fā)送完畢。
   }
  write_12864_com(0x90); //設(shè)定第二行。
  for(i=0;i<16;i++)
  {
   write_1284_dat(table24[i]);
   delay_50us(1;
  }
  write_12864_com(0x88); //設(shè)定第三行
  for(i=0;i<10i++)
  {
   write_12864_dat(table25[i]);
   delay_50us(1);
  }
   write_12864_com(0x98);//設(shè)定第四行顯示位置。
  for(i=0;i<16;i++)
  {
   write_12864dat(table100[i]);
   delay_50us(1);
  }
//##################################第二幅畫面。
     delay_1s(2000);//延時(shí)保持2秒鐘的第一幅畫面。
     init_12864();//初始化液晶。
  write_12864_com(0x80);//設(shè)定顯示位置是第一行。
  for(i=0;i<14;i++)    //第一行有多少字,漢字占兩個(gè)位置。標(biāo)點(diǎn)符號(hào)一個(gè)。
  {
  write_12864_dat(table11[i]); //開始挨個(gè)把表中的字一位一位的通過12864的數(shù)據(jù)發(fā)送子程序發(fā)送出去。
  delay_50us(1);          //延時(shí)一會(huì)保證數(shù)據(jù)有發(fā)送完畢。
   }
  write_12864_com(0x90); //設(shè)定第二行。
  for(i=0;i<16;i++)
  {
   write_12864_dat(table13[i]);
   delay_50us(1);
  
  write12864_com(0x88); //設(shè)定第三行
  for(i=0;i<16;i++)
  {
   write_12864_dat(table12[i]);
   delay_50us(1);
  }
   write_12864_com(0x98);//設(shè)定第四行顯示位置。
  for(i=0;i<16;i++)
  {
   write_12864_dat(table14[i]);
   delay_50us(1);
  }

 }
//***********************************************************************************************************************
//*********************************************************************************************************************


void main()
{
P4SW=0x7F; //設(shè)置P4為雙向IO口。
c=0;//寫入未執(zhí)行過按鍵操作的標(biāo)志位  
baohu=1;//先強(qiáng)制打開保護(hù)功能,促使PWN徹底關(guān)閉,防止上機(jī)的那種不可控的頻率。讓PWM有規(guī)律可循。
beiguang=1;//打開背光
yanshi(30);//延時(shí)一小會(huì)保證已經(jīng)徹底關(guān)閉。
init_pa();//初始化PWM控制器。
m=0;
temp=0;
init_1864();//初始化液晶。
huanying();//開機(jī)歡迎語和歡迎畫面。
while(1)
 {
     if(pd==0)  //檔位加
       {
        yanshi(50);
      if(pd==0)
        {
         m++  //檢測(cè)火力+按鍵按了幾次。是幾次就是幾檔位、
      if(m==11) //當(dāng)檔位增加到11次以后,就給復(fù)位到檔位1.防止出現(xiàn)錯(cuò)誤。
        {
         m=1;
        }
         dangwei(m); //檔位的各種信息。
       while(!pd);
     
      }   
   
      }
                 
   if(px==0) //檔位減
       {
        yanshi(50);
      if(px==0)
        { 
         if(m==0)
       {
         m=2;
       }
          m--;  //檢測(cè)火力-按鍵按了幾次。是幾次就是幾檔位、
      if(m<=0)//當(dāng)檔位增加到0次以后,就關(guān)閉所有檔位的輸出。
        {
         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)//檢測(cè)是不是已經(jīng)穩(wěn)定好了PWM。
     {
   baohu=0;//開啟PWM輸出。
  }
    }
 
}
關(guān)閉窗口

相關(guān)文章