找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7982|回复: 8
收起左侧

求助大神这个程序怎样写入STC15F104W里面才能正常工作

[复制链接]
ID:202586 发表于 2017-7-9 23:22 | 显示全部楼层 |阅读模式
因水平有限求大神师傅们帮帮忙怎样修改才能在15F104W中正常运行,小女子先谢谢各位师傅了。
程序要求      
一键控制个LED灯   分三段
一段:按第一次按键开机 LED1.LED4灯点亮,1小时后,关闭LED1,延时5秒后,并点亮LED2,1分20秒后关闭LED2,停5秒后,再点亮LED3,5秒并关闭,同时关闭LED1灯,进入待机;大概1小时后,再循环一段,如没有断电一直循环,直到按第二次按键。
二段:按第二次按键 LED1,LED5灯点亮,,一直点亮,直到按第三次按键。
三段:按第三次按键 LED5灯还亮着 并点亮LED2,1分20秒后关闭LED2,停5秒后,再点亮LED3,5秒并关闭,同时关闭LED5灯,进入关机状态,等待下次开机。        如果连续按按键也要安这3段进行
下面是80C52调试程序
  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延时程序
  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定时程序
  23.   {
  24.     TMOD &= 0xF0;        //设置定时器模式
  25.     TMOD |= 0x01;        //设置定时器模式
  26.     TL0 = 0xB0;        //设置定时初值
  27.     TH0 = 0x3C;        //设置定时初值
  28.     EA=1;           // 开总中断
  29.     ET0=1;           //允许T0中断
  30.     TF0 = 0;        //清除TF0标志
  31.     TR0 = 0;         //开启定时T0
  32.        PT0=1;
  33.   }   
  34. //====================================================================
  35. void Timer0_int(void)interrupt 1
  36. {
  37.        TL0 = 0xB0;        //设置定时初值
  38.     TH0 = 0x3C;        //设置定时初值
  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小时到   
  51.        {   
  52.            minute=0;   
  53.            hour++;   
  54.        }
  55.        if(hour==24)//24小时到   
  56.        {   
  57.            hour=0;   
  58.        }
  59. }
  60. //==============================================================================
  61. void IrInit()
  62. {
  63.     IT0=1;//下降沿触发    IT0=0;时为低电有效
  64.     EX0=1;//打开中断0允许
  65.     EA=1;    //打开总中断


  66.     K1=1;//初始化端口
  67. }
  68. //===============================================================================
  69. void Timer1_init(void)//12M 0.1ms定时程序
  70.   {
  71.     TMOD &= 0x0F;        //设置定时器模式
  72.     TMOD |= 0x10;        //设置定时器模式
  73.     TL1 = 0x58;        //设置定时初值
  74.     TH1 = 0x9E;        //设置定时初值
  75.     EA=1;           // 开总中断
  76.     ET1=1;           //允许T0中断
  77.     TF1 = 0;        //清除TF0标志
  78.     TR1 = 0;         //开启定时T0
  79.        PT1=1;
  80.   }   
  81. //=================================================================
  82. void Timer1_int(void)interrupt 3
  83. {
  84.        TL1 = 0x58;        //设置定时初值
  85.     TH1 = 0x9E;        //设置定时初值
  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小时后关LED1开LED2.
  160.          if(hour==6){led1=1;led2=0;}        //1分50秒后    关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;}     //进入关LED3代机
  163.             
  164.     }
  165.          if( minute==1){m_flag=0;flash_flag=0; second=0;minute=0;hour=0;}    //1小时后 复来


  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;       //点亮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秒关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. }
复制代码


回复

使用道具 举报

ID:82765 发表于 2017-7-10 08:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:213173 发表于 2017-7-10 08:12 | 显示全部楼层
如果这个程序在80C52调试正常只要做少许调整就可以直接用于15F104W。两者区别如下:
15F104W的I/O口只有6个,P3.0~P3.5,除了保留K1=P3^2外,其他5个LED任意定义。
15F104W只有定时器0和定时器2,没有定时器1,只要重新设置定时器即可。
15F104W是1T单片机,软件延时Delay要修改。经验程序如下
/*--------------------------------------------
  1ms延时子程序(12MHz 1T)
---------------------------------------------*/
void delay1ms(uint k)       
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=892;j>0;j--);
}
回复

使用道具 举报

ID:213173 发表于 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;//在这里加上,否则连续按键4次LED不能清0
}
回复

使用道具 举报

ID:96072 发表于 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;//在这里加上,否则连续按键4次LED不能清0 }
回复

使用道具 举报

ID:202586 发表于 2017-7-12 09:15 | 显示全部楼层
wulin 发表于 2017-7-10 08:55
建议这里修改一下:
if(a==0)
{       

不好意思这几天不在家,没有及时回复你们,抱歉  谢谢你们的指点,我刚试了一下,可以写进去了,按键能点亮相应的LED  但不能定时,15F104W的不会设计定时,请大家多多关照
回复

使用道具 举报

ID:213173 发表于 2017-7-12 14:20 | 显示全部楼层
学徒工--静 发表于 2017-7-12 09:15
不好意思这几天不在家,没有及时回复你们,抱歉  谢谢你们的指点,我刚试了一下,可以写进去了,按键能点 ...

建议按键程序放在main()里,不要放在外部中断,定时器也就不必设置中断优先级,如果程序再优化一下,只用定时器0就行。
//定时器0初始化 12T自动重载(中断中不需重置T0H和T0L)
void Timer0_Init(void)                //50毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xB0;                        //设置定时初值
        TH0 = 0x3C;                        //设置定时初值
        TF0 = 0;                        //清除TF0标志
//        TR0 = 1;                        //定时器0开始计时
        EA=1;                   //开总中断
        ET0=1;                  //允许T0中断
}
//定时器2初始化 12T自动重载(中断中不需重置T2H和T2L)
void Timer2_Init(void)                //25毫秒@12.000MHz
{
        AUXR &= 0xFB;                        //定时器时钟12T模式
        T2L = 0x58;                                //设置定时初值
        T2H = 0x9E;                                //设置定时初值
//        T2R = 1;                                //定时器2开始计时
        ET2 = 1;                                //定时器2中断允许
}
//定时器2中断服务程序
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;
                }
        }
}
回复

使用道具 举报

ID:213173 发表于 2017-7-12 14:58 | 显示全部楼层
本帖最后由 wulin 于 2017-7-12 16:00 编辑
学徒工--静 发表于 2017-7-12 09:15
不好意思这几天不在家,没有及时回复你们,抱歉  谢谢你们的指点,我刚试了一下,可以写进去了,按键能点 ...

用1个定时器处理的方法
//按键扫描程序,删除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;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器16位自动重载模式
        TL0 = 0x58;                        //设置定时重载值
        TH0 = 0x9E;                        //设置定时重载值
        TF0 = 0;                        //清除TF0标志
//        TR0 = 1;                        //定时器0开始计时
        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小时到   
                        {   
                                minute=0;   
                                hour++;   
                        }
                        if(hour>=24)//24小时到   
                        {   
                                hour=0;   
                        }
                break;

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

                default: break;
        }
}
回复

使用道具 举报

ID:202586 发表于 2017-7-13 20:14 | 显示全部楼层
wulin 发表于 2017-7-12 14:20
建议按键程序放在main()里,不要放在外部中断,定时器也就不必设置中断优先级,如果程序再优化一下,只用 ...

谢谢大师了    有空我试试  谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表