找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1847|回复: 5
打印 上一主题 下一主题
收起左侧

新手求助,请高手看看单片机程序问题出在哪里?

[复制链接]
跳转到指定楼层
楼主
ID:217075 发表于 2021-3-18 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机STC15W202S
sout,xout分别控制2路可控硅,实现加热炉的强弱档控制,强档可控硅始终导通,弱档可控硅断续导通,定时器T0确定弱档时的周期t0,T2确定占空比t1/t0,每路两个按钮,开关和强弱选择
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit sqr=P1^3; //输出强弱选择按键1
sbit skg=P1^2; //输出开关键1,打开进入强输出状态
sbit xqr=P1^5; //输出强弱选择按键2
sbit xkg=P1^4; //输出开关键2,同1

sbit sout=P1^1;        //输出1
sbit xout=P3^0;        //输出2
sbit sq=P3^7;  //输出1强发光二极管显示
sbit sr=P3^6;  //输出1弱发光二极管显示
sbit xq=P3^1;  //输出2强发光二极管显示
sbit xr=P3^2;  //输出2弱发光二极管显示


uchar t0=20;
uchar t1=10;
uchar num1;
uchar num2;
uchar led1;
uchar led2;
uchar scan;
uchar xcan;


void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}



void ledcan()
{
         if((skg==0)&&(scan==1))
        {
                delayms(10);
                if((skg==0)&&(scan==1))
                {
                    TR0=0;
                        AUXR&=0x00;
                        while(!skg);
                        TR0=1;
                        AUXR|=0x10;
                        scan=0;
                        sout=0;
                        sq=0;
                        sr=1;
                }
                delayms(10);
        }

        if((skg==0)&&(scan==0))
        {
                delayms(10);
                if((skg==0)&&(scan==0))
                {
                    TR0=0;
                        AUXR&=0x00;
                        while(!skg);
                        TR0=1;
                        AUXR|=0x10;
                        scan=1;
                        sout=1;
                        sq=1;
                        sr=1;
                }
                delayms(10);
        }

        if((xkg==0)&&(xcan==1))
        {
                delayms(10);
                if((xkg==0)&&(xcan==1))
                {
                    TR0=0;
                        AUXR&=0x00;
                        while(!xkg);
                        TR0=1;
                        AUXR|=0x10;
                        xcan=0;
                        xout=0;
                        xq=0;
                        xr=1;
                }
                delayms(10);
        }

        if((xkg==0)&&(xcan==0))
        {
                delayms(10);
                if((xkg==0)&&(xcan==0))
                {
                    TR0=0;
                        AUXR&=0x00;
                        while(!xkg);
                        TR0=1;
                        AUXR|=0x10;
                        xcan=1;
                        xout=1;
                        xq=1;
                        xr=1;
                }
                delayms(10);
        }

/*******************************************/
        if((sqr==0)&&(scan==0)&&(sq==0))
        {
                delayms(10);
                if((sqr==0)&&(scan==0)&&(sq==0))                                
                {
                    TR0=0;
                        AUXR&=0x00;
                        while(!sqr);
                        TR0=1;
                        AUXR|=0x10;
                        sout=led2;                        
                        sq=1;
                        sr=0;
                }
                delayms(10);
        }

        if(sr==0)
        {
         sout=led2;
        }
        
        if((sqr==0)&&(scan==0)&&(sr==0))
        {
                delayms(10);
                if((sqr==0)&&(scan==0)&&(sr==0))                                
                {

                    TR0=0;
                        AUXR&=0x00;
                        while(!sqr);
                        TR0=1;
                        AUXR|=0x10;
                        sout=0;
                        sq=0;
                        sr=1;
                }
                delayms(10);
        }
               
        if((xqr==0)&&(xcan==0)&&(xq==0))
        {
                delayms(10);
                if((xqr==0)&&(xcan==0)&&(xq==0))        
                {
            TR0=0;
                        AUXR&=0x00;
                        while(!xqr);
                        TR0=1;
                        AUXR|=0x10;
                        xout=led2;                        
                        xq=1;
                        xr=0;
                }
                delayms(10);
        }

        if(xr==0)
        {
         xout=led2;
        }

        if((xqr==0)&&(xcan==0)&&(xr==0))
        {
                delayms(10);
                if((xqr==0)&&(xcan==0)&&(xr==0))        
                {
            TR0=0;
                        AUXR&=0x00;
                        while(!xqr);
                        TR0=1;
                        AUXR|=0x10;
                        xout=0;
                        xq=0;
                        xr=1;
                }
                delayms(10);
        }
}


void main()
{
        sqr=1;
        skg=1;
        xqr=1;
        xkg=1;

        sout=1;
        xout=1;
        sq=1;
        sr=1;
        xq=1;
        xr=1;

        num1=0;
        num2=0;
        led1=0;
        led2=0;
        scan=1;
        xcan=1;


        TMOD=0x11;
        TH0=(65535-45872)/256;
        TL0=(65535-45872)%256;
        T2H=(65535-45872)/256;
        T2L=(65535-45872)%256;
        EA=1;
        ET0=1;
        TR0=1;
    IE2|=0x04;
        AUXR|=0x10;
               
        while(1)

        {
            ledcan();
        }
}

void T0time() interrupt 1
{
        TH0=(65535-45872)/256; //50ms初值
        TL0=(65535-45872)%256;
        num1++;
                if(num1==t0)
            {
                        TR0=0;
                        AUXR&=0x00;
                    led1=1;                        
                    delayms(5);
                        TR0=1;
                        AUXR|=0x10;
                    led1=0;
                    num1=0;        
            }
}

void T2time() interrupt 12
{   

        T2H=(65535-45872)/256;
        T2L=(65535-45872)%256;
        num2++;
                if(num2==t1)
            {
                    AUXR&=0x00;
                    led2=1;                                
            }
                if(led1==1)
                {
                    AUXR|=0x10;
                        num2=0;
                        led2=0;
                }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2021-3-18 13:42 | 只看该作者
程序那么长,你要描述你的问题吧!
回复

使用道具 举报

板凳
ID:213173 发表于 2021-3-18 15:36 | 只看该作者
程序没有细看,不知道你想达到什么目的,也不知道你遇到什么问题。有2点明显错误。
1.只为了相同的定时时间干嘛要开两个定时器?只要设置标志,1个定时器可以完成N个定时时间。
2.这个延时函数void delayms(uint xms)只适合12T单片机,11.0592MHz 1T环境要改为:
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=829;j>0;j--);
}
回复

使用道具 举报

地板
ID:217075 发表于 2021-3-18 16:05 | 只看该作者
sout,xout分别控制2路可控硅,实现加热炉的强弱档控制,强档可控硅始终导通,弱档可控硅断续导通,定时器T0确定弱档时的周期t0,T2确定占空比t1/t0,每路两个按钮,开关和强弱选择
回复

使用道具 举报

5#
ID:213173 发表于 2021-3-18 22:02 | 只看该作者
hsujinshan 发表于 2021-3-18 16:05
sout,xout分别控制2路可控硅,实现加热炉的强弱档控制,强档可控硅始终导通,弱档可控硅断续导通,定时器T0 ...

这种简单控制不用写得那么啰嗦。定时器也不必非得50ms,用最大值约71ms不影响占空比,用键控制占空比可以由全开到关断,如不用数码管显示占空比就用LED闪亮时间观察占空比。修改如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sfr AUXR = 0x8E; //STC15W特殊寄存器定义

  5. //sbit sqr=P1^3; //输出强弱选择按键1
  6. //sbit skg=P1^2; //输出开关键1,打开进入强输出状态
  7. //sbit xqr=P1^5; //输出强弱选择按键2
  8. //sbit xkg=P1^4; //输出开关键2,同1

  9. sbit sout=P1^1;        //输出1
  10. sbit xout=P3^0;        //输出2
  11. sbit sled=P3^7;  //输出1强/弱发光二极管显示
  12. //sbit sr=P3^6;  //输出1弱发光二极管显示
  13. sbit xled=P3^1;  //输出2强/弱发光二极管显示
  14. //sbit xr=P3^2;  //输出2弱发光二极管显示

  15. uchar num;        //键值变量
  16. uchar num1; //中断计数1变量
  17. uchar num2; //中断计数2变量
  18. uchar scan; //占空比1变量
  19. uchar xcan; //占空比2变量

  20. void delayms(uint xms)//@11.0592MHz/1T
  21. {
  22.         uint i,j;
  23.         for(i=xms;i>0;i--)
  24.                 for(j=829;j>0;j--);
  25. }

  26. void keyscan()
  27. {
  28.         static uchar count=0;//静态计数变量
  29.         static bit sign=0;        //静态标志位
  30.         num=(P1&0x3c)>>2;                //按键P1.2~1.5
  31.         if(num!=0x0f)        //有键按下
  32.         {
  33.                 if(++count>=10 && sign==0)//10ms消抖
  34.                 {
  35.                         sign=1;                //记忆键态
  36.                         switch(num)
  37.                         {
  38.                                 case 0x0e: if(scan<10)scan++; break;//输出1占空比+
  39.                                 case 0x0d: if(scan>0)scan--; break;//输出1占空比-
  40.                                 case 0x0b: if(xcan<10)xcan++; break;//输出2占空比+
  41.                                 case 0x07: if(xcan>0)xcan--; break;//输出2占空比-
  42.                                 default: break;
  43.                         }
  44.                 }
  45.         }
  46.         else  //松手
  47.         {
  48.                 count=0;//计数清0
  49.                 sign=0; //
  50.         }
  51. }
  52. void main()
  53. {
  54.         AUXR &= 0x7F;                //定时器时钟12T模式
  55.         TMOD &= 0xF0;                //设置定时器模式
  56.         TMOD |= 0x01;                //设置定时器模式
  57.         TH0=0x00;//(65535-45872)/256;
  58.         TL0=0x00;//(65535-45872)%256;
  59.         EA=1;
  60.         ET0=1;
  61.         TR0=1;
  62.         while(1)       
  63.         {
  64.                 keyscan(); //按键扫描
  65.                 delayms(1);//控制主循环周期约1ms
  66.         }
  67. }

  68. void T0time() interrupt 1
  69. {
  70. //        初值0x0000 71~72ms
  71. //        TH0=(65535-45872)/256; //50ms初值
  72. //        TL0=(65535-45872)%256;
  73.         if(num1<scan){sout=0;sled=0;}
  74.         else {sout=1;sled=1;}
  75.         num1=++num1%10;

  76.         if(num2<xcan){xout=0;xled=0;}
  77.         else {xout=1;xled=1;}
  78.         num2=++num2%10;
  79. }
复制代码

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:217075 发表于 2021-3-19 08:19 | 只看该作者
多谢这位老师
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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