標(biāo)題: 求助大神這個(gè)程序怎樣寫入STC15F104W里面才能正常工作 [打印本頁(yè)]

作者: 學(xué)徒工--靜    時(shí)間: 2017-7-9 23:22
標(biāo)題: 求助大神這個(gè)程序怎樣寫入STC15F104W里面才能正常工作
因水平有限求大神師傅們幫幫忙怎樣修改才能在15F104W中正常運(yùn)行,小女子先謝謝各位師傅了。
程序要求      
一鍵控制個(gè)LED燈   分三段
一段:按第一次按鍵開機(jī) LED1.LED4燈點(diǎn)亮,1小時(shí)后,關(guān)閉LED1,延時(shí)5秒后,并點(diǎn)亮LED2,1分20秒后關(guān)閉LED2,停5秒后,再點(diǎn)亮LED3,5秒并關(guān)閉,同時(shí)關(guān)閉LED1燈,進(jìn)入待機(jī);大概1小時(shí)后,再循環(huán)一段,如沒有斷電一直循環(huán),直到按第二次按鍵。
二段:按第二次按鍵 LED1,LED5燈點(diǎn)亮,,一直點(diǎn)亮,直到按第三次按鍵。
三段:按第三次按鍵 LED5燈還亮著 并點(diǎn)亮LED2,1分20秒后關(guān)閉LED2,停5秒后,再點(diǎn)亮LED3,5秒并關(guān)閉,同時(shí)關(guān)閉LED5燈,進(jìn)入關(guān)機(jī)狀態(tài),等待下次開機(jī)。        如果連續(xù)按按鍵也要安這3段進(jìn)行
下面是80C52調(diào)試程序
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar second,minute,hour,count,timer1,cout,a;
  5. uchar second1,minute1,hour1,count1;
  6. sbit K1 =P3^2;    //按鍵
  7. sbit led1 =P2^0;  
  8. sbit led2 =P2^1;  
  9. sbit led3 =P2^2;  
  10. sbit led4 =P2^3;  
  11. sbit led5 =P2^4;  
  12. bit  m_flag,h_flag,flash_flag,open_flag,close_flag;
  13. //=====================================================================
  14. void Delay(uint k)        //12M 10ms延時(shí)程序
  15.   {
  16.    uint i;
  17.    for(;k>0;k--)
  18.    for(i=0;i<20;i++)
  19.    {;}
  20.   }   
  21. //=====================================================
  22. void Timer0_init(void)//12M 50ms定時(shí)程序
  23.   {
  24.     TMOD &= 0xF0;        //設(shè)置定時(shí)器模式
  25.     TMOD |= 0x01;        //設(shè)置定時(shí)器模式
  26.     TL0 = 0xB0;        //設(shè)置定時(shí)初值
  27.     TH0 = 0x3C;        //設(shè)置定時(shí)初值
  28.     EA=1;           // 開總中斷
  29.     ET0=1;           //允許T0中斷
  30.     TF0 = 0;        //清除TF0標(biāo)志
  31.     TR0 = 0;         //開啟定時(shí)T0
  32.        PT0=1;
  33.   }   
  34. //====================================================================
  35. void Timer0_int(void)interrupt 1
  36. {
  37.        TL0 = 0xB0;        //設(shè)置定時(shí)初值
  38.     TH0 = 0x3C;        //設(shè)置定時(shí)初值
  39.      count++;
  40.      if(count==20)//1s到   
  41.        {   
  42.           count=0;   
  43.           second++;   
  44.        }
  45.        if(second==60)//1分鐘到   
  46.        {   
  47.            second=0;   
  48.            minute++;   
  49.        }
  50.        if(minute==60)//1小時(shí)到   
  51.        {   
  52.            minute=0;   
  53.            hour++;   
  54.        }
  55.        if(hour==24)//24小時(shí)到   
  56.        {   
  57.            hour=0;   
  58.        }
  59. }
  60. //==============================================================================
  61. void IrInit()
  62. {
  63.     IT0=1;//下降沿觸發(fā)    IT0=0;時(shí)為低電有效
  64.     EX0=1;//打開中斷0允許
  65.     EA=1;    //打開總中斷


  66.     K1=1;//初始化端口
  67. }
  68. //===============================================================================
  69. void Timer1_init(void)//12M 0.1ms定時(shí)程序
  70.   {
  71.     TMOD &= 0x0F;        //設(shè)置定時(shí)器模式
  72.     TMOD |= 0x10;        //設(shè)置定時(shí)器模式
  73.     TL1 = 0x58;        //設(shè)置定時(shí)初值
  74.     TH1 = 0x9E;        //設(shè)置定時(shí)初值
  75.     EA=1;           // 開總中斷
  76.     ET1=1;           //允許T0中斷
  77.     TF1 = 0;        //清除TF0標(biāo)志
  78.     TR1 = 0;         //開啟定時(shí)T0
  79.        PT1=1;
  80.   }   
  81. //=================================================================
  82. void Timer1_int(void)interrupt 3
  83. {
  84.        TL1 = 0x58;        //設(shè)置定時(shí)初值
  85.     TH1 = 0x9E;        //設(shè)置定時(shí)初值
  86.      count1++;
  87.      if(count1==40)//1s到   
  88.        {   
  89.           count1=0;   
  90.           second1++;   
  91.        }
  92.   
  93. }
  94. //=====================================================================


  95. void key_scan() interrupt 0
  96. {
  97.    if(K1==0)
  98.    {
  99.    Delay(15);
  100.    if (K1==0)
  101.    {
  102.    while(!K1);
  103.    a++;                     
  104.    if(a==4){a=0;}
  105.    }
  106.    }


  107. }
  108. //===================================================================================
  109. void main()
  110.   {                                                
  111.     Timer0_init();
  112.     Timer1_init();
  113.     IrInit();
  114.     m_flag=0;
  115.     h_flag=0;
  116.     flash_flag=0;
  117.     cout=0;
  118.     a=0;
  119.     led1=1;
  120.     led2=1;
  121.     led3=1;
  122.     led4=1;
  123.     led5=1;
  124.      second1=0;
  125.      minute1=0;
  126.      hour1=0;
  127.      second=0;
  128.      minute=0;
  129.      hour=0;                     
  130.      open_flag=0;
  131.      close_flag=0;
  132.      count=0;
  133.      count1=0;
  134.        K1 =1;


  135.     while(1)  
  136.    {
  137.      if(a==0)
  138.       {
  139.      
  140.        TR0 = 0;
  141.        TR1 = 0;                                                                                                                                                                                                                                                   
  142.       second=0;minute=0;hour=0;
  143.        second1=0;minute1=0;hour1=0;
  144.       }
  145.        if(a==1)
  146.        {
  147.         close_flag=0;
  148.          second1=0;minute1=0;hour1=0;
  149.        TR0 = 1;
  150.        if(flash_flag==0)
  151.     {
  152.        if(m_flag==0)
  153.             {
  154.          led5=1;
  155.          led2=1;         
  156.          led1=0; //開LED1
  157.          led4=0;   //開LED4燈
  158.          }
  159.          if(second==7){    m_flag=1;led1=1;led2=0;} //1小時(shí)后關(guān)LED1開LED2.
  160.          if(hour==6){led1=1;led2=0;}        //1分50秒后    關(guān)LED1開LED2   
  161.          if((minute==1)&&(second==30)&&(hour==6)){led1=1;led2=1;led3=0;} //停5秒開LED3
  162.         if((minute==1)&&(second==37)&&(hour==6)){led1=1;led2=1;led3=1;led4=0;led5=1;h_flag=0;flash_flag=1;}     //進(jìn)入關(guān)LED3代機(jī)
  163.             
  164.     }
  165.          if( minute==1){m_flag=0;flash_flag=0; second=0;minute=0;hour=0;}    //1小時(shí)后 復(fù)來(lái)


  166.        }
  167.       
  168.        if(a==2)
  169.        {
  170.        TR0 = 0;
  171.        TR1 = 0;
  172.        m_flag=0;flash_flag=0;
  173.        second=0;minute=0;hour=0;
  174.        second1=0;minute1=0;hour1=0;
  175.        led2=1;
  176.        led4=1;
  177.        led3=1;
  178.         m_flag=1;flash_flag=1;
  179.         led5=0;        //亮LED5
  180.         led1=0;       //點(diǎn)亮LED1
  181.             
  182.        }
  183.        if(a==3)
  184.        {  // close_flag=0;
  185.            open_flag=0;
  186.            TR1 = 1;
  187.            TR0 = 0;
  188.           second=0;minute=0;hour=0;   
  189.           led1=1;
  190.           led3=1;
  191.           led4=1;
  192.          m_flag=0;flash_flag=0;


  193.         if(open_flag==0)
  194.         {      
  195.         if(close_flag==0)    { led2=0;led5=0; }
  196.         if(second1==90){close_flag=1;led1=1;led4=1; led3=1;led2=1;led5=0;}        
  197.         if(second1==95)    {    led1=1;    led4=1;    led3=0;led5=0;led2=1;} //    1分50秒關(guān)LED2
  198.         if(second1==100){    led1=1; led2=1;    led4=1;led5=0;led3=1;} //    5秒后開LED3
  199.          if(second1==105)     {a=0;    led1=1;led3=1;led4=1;led5=1; TR1 = 0;second1=0;minute1=0;hour1=0;TR0 = 0;second=0;minute=0;hour=0;open_flag=1;    }
  200.         
  201.             }
  202.       
  203.               }
  204.                        
  205.        }
  206.      
  207.                      
  208. }
復(fù)制代碼



作者: cjjcjj1    時(shí)間: 2017-7-10 08:00
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
作者: wulin    時(shí)間: 2017-7-10 08:12
如果這個(gè)程序在80C52調(diào)試正常只要做少許調(diào)整就可以直接用于15F104W。兩者區(qū)別如下:
15F104W的I/O口只有6個(gè),P3.0~P3.5,除了保留K1=P3^2外,其他5個(gè)LED任意定義。
15F104W只有定時(shí)器0和定時(shí)器2,沒有定時(shí)器1,只要重新設(shè)置定時(shí)器即可。
15F104W是1T單片機(jī),軟件延時(shí)Delay要修改。經(jīng)驗(yàn)程序如下
/*--------------------------------------------
  1ms延時(shí)子程序(12MHz 1T)
---------------------------------------------*/
void delay1ms(uint k)       
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=892;j>0;j--);
}

作者: wulin    時(shí)間: 2017-7-10 08:55
建議這里修改一下:
if(a==0)
{       
        TR0 = 0;
        TR1 = 0;
        second=0;minute=0;hour=0;
        second1=0;minute1=0;hour1=0;
        led1=led2=led3=led4=led5=1;//在這里加上,否則連續(xù)按鍵4次LED不能清0
}
作者: HEIZI555    時(shí)間: 2017-7-11 20:19
建議這里修改一下: if(a==0) {                 TR0 = 0;                 second=0;minute=0;hour=0;         second1=0;minute1=0;hour1=0;         led1=led2=led3=led4=led5=1;//在這里加上,否則連續(xù)按鍵4次LED不能清0 }
作者: 學(xué)徒工--靜    時(shí)間: 2017-7-12 09:15
wulin 發(fā)表于 2017-7-10 08:55
建議這里修改一下:
if(a==0)
{       

不好意思這幾天不在家,沒有及時(shí)回復(fù)你們,抱歉  謝謝你們的指點(diǎn),我剛試了一下,可以寫進(jìn)去了,按鍵能點(diǎn)亮相應(yīng)的LED  但不能定時(shí),15F104W的不會(huì)設(shè)計(jì)定時(shí),請(qǐng)大家多多關(guān)照
作者: wulin    時(shí)間: 2017-7-12 14:20
學(xué)徒工--靜 發(fā)表于 2017-7-12 09:15
不好意思這幾天不在家,沒有及時(shí)回復(fù)你們,抱歉  謝謝你們的指點(diǎn),我剛試了一下,可以寫進(jìn)去了,按鍵能點(diǎn) ...

建議按鍵程序放在main()里,不要放在外部中斷,定時(shí)器也就不必設(shè)置中斷優(yōu)先級(jí),如果程序再優(yōu)化一下,只用定時(shí)器0就行。
//定時(shí)器0初始化 12T自動(dòng)重載(中斷中不需重置T0H和T0L)
void Timer0_Init(void)                //50毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0xB0;                        //設(shè)置定時(shí)初值
        TH0 = 0x3C;                        //設(shè)置定時(shí)初值
        TF0 = 0;                        //清除TF0標(biāo)志
//        TR0 = 1;                        //定時(shí)器0開始計(jì)時(shí)
        EA=1;                   //開總中斷
        ET0=1;                  //允許T0中斷
}
//定時(shí)器2初始化 12T自動(dòng)重載(中斷中不需重置T2H和T2L)
void Timer2_Init(void)                //25毫秒@12.000MHz
{
        AUXR &= 0xFB;                        //定時(shí)器時(shí)鐘12T模式
        T2L = 0x58;                                //設(shè)置定時(shí)初值
        T2H = 0x9E;                                //設(shè)置定時(shí)初值
//        T2R = 1;                                //定時(shí)器2開始計(jì)時(shí)
        ET2 = 1;                                //定時(shí)器2中斷允許
}
//定時(shí)器2中斷服務(wù)程序
void Timer2_int(void) interrupt 12
{
        count1++;
        if(count1==40)//1s到   
        {   
                count1=0;   
                second1++;   
        }       
}
//按鍵掃描程序
void key_scan()   //interrupt 0
{
        if(K1==0)
        {
                Delay(15);
                if (K1==0)
                {
                        while(!K1);
                        a++;                     
                        if(a==4)
                                a=0;
                }
        }
}

作者: wulin    時(shí)間: 2017-7-12 14:58
本帖最后由 wulin 于 2017-7-12 16:00 編輯
學(xué)徒工--靜 發(fā)表于 2017-7-12 09:15
不好意思這幾天不在家,沒有及時(shí)回復(fù)你們,抱歉  謝謝你們的指點(diǎn),我剛試了一下,可以寫進(jìn)去了,按鍵能點(diǎn) ...

用1個(gè)定時(shí)器處理的方法
//按鍵掃描程序,刪除void IrInit()
void key_scan()//interrupt 0
{
        if(K1==0)
        {
                Delay(15);
                if (K1==0)
                {
                        count=0;
                        count1=0;
                        a++;                     
                        if(a>=4)
                                a=0;
                        while(!K1);
                }
        }
}
/********************************/
void Timer0_Init(void)                //25毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器16位自動(dòng)重載模式
        TL0 = 0x58;                        //設(shè)置定時(shí)重載值
        TH0 = 0x9E;                        //設(shè)置定時(shí)重載值
        TF0 = 0;                        //清除TF0標(biāo)志
//        TR0 = 1;                        //定時(shí)器0開始計(jì)時(shí)
        EA=1;                   //開總中斷
        ET0=1;                  //允許T0中斷
}
void Timer0_int(void) interrupt 1
{
        switch(a)
        {
                case 1:
                        count++;
                        if(count>=40)//1s到   
                        {   
                                count=0;   
                                second++;   
                        }
                        if(second>=60)//1分鐘到   
                        {   
                                second=0;   
                                minute++;   
                        }
                        if(minute>=60)//1小時(shí)到   
                        {   
                                minute=0;   
                                hour++;   
                        }
                        if(hour>=24)//24小時(shí)到   
                        {   
                                hour=0;   
                        }
                break;

                case 3:
                        count1++;
                        if(count1>=40)//1s到   
                        {   
                                count1=0;   
                                second1++;   
                        }
                break;

                default: break;
        }
}

作者: 學(xué)徒工--靜    時(shí)間: 2017-7-13 20:14
wulin 發(fā)表于 2017-7-12 14:20
建議按鍵程序放在main()里,不要放在外部中斷,定時(shí)器也就不必設(shè)置中斷優(yōu)先級(jí),如果程序再優(yōu)化一下,只用 ...

謝謝大師了    有空我試試  謝謝




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1