标题:
新手求助,请高手看看单片机程序问题出在哪里?
[打印本页]
作者:
hsujinshan
时间:
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;
}
}
作者:
csmyldl
时间:
2021-3-18 13:42
程序那么长,你要描述你的问题吧!
作者:
wulin
时间:
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--);
}
作者:
hsujinshan
时间:
2021-3-18 16:05
sout,xout分别控制2路可控硅,实现加热炉的强弱档控制,强档可控硅始终导通,弱档可控硅断续导通,定时器T0确定弱档时的周期t0,T2确定占空比t1/t0,每路两个按钮,开关和强弱选择
作者:
wulin
时间:
2021-3-18 22:02
hsujinshan 发表于 2021-3-18 16:05
sout,xout分别控制2路可控硅,实现加热炉的强弱档控制,强档可控硅始终导通,弱档可控硅断续导通,定时器T0 ...
这种简单控制不用写得那么啰嗦。定时器也不必非得50ms,用最大值约71ms不影响占空比,用键控制占空比可以由全开到关断,如不用数码管显示占空比就用LED闪亮时间观察占空比。修改如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sfr AUXR = 0x8E; //STC15W特殊寄存器定义
//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 sled=P3^7; //输出1强/弱发光二极管显示
//sbit sr=P3^6; //输出1弱发光二极管显示
sbit xled=P3^1; //输出2强/弱发光二极管显示
//sbit xr=P3^2; //输出2弱发光二极管显示
uchar num; //键值变量
uchar num1; //中断计数1变量
uchar num2; //中断计数2变量
uchar scan; //占空比1变量
uchar xcan; //占空比2变量
void delayms(uint xms)//@11.0592MHz/1T
{
uint i,j;
for(i=xms;i>0;i--)
for(j=829;j>0;j--);
}
void keyscan()
{
static uchar count=0;//静态计数变量
static bit sign=0; //静态标志位
num=(P1&0x3c)>>2; //按键P1.2~1.5
if(num!=0x0f) //有键按下
{
if(++count>=10 && sign==0)//10ms消抖
{
sign=1; //记忆键态
switch(num)
{
case 0x0e: if(scan<10)scan++; break;//输出1占空比+
case 0x0d: if(scan>0)scan--; break;//输出1占空比-
case 0x0b: if(xcan<10)xcan++; break;//输出2占空比+
case 0x07: if(xcan>0)xcan--; break;//输出2占空比-
default: break;
}
}
}
else //松手
{
count=0;//计数清0
sign=0; //
}
}
void main()
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TH0=0x00;//(65535-45872)/256;
TL0=0x00;//(65535-45872)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan(); //按键扫描
delayms(1);//控制主循环周期约1ms
}
}
void T0time() interrupt 1
{
// 初值0x0000 71~72ms
// TH0=(65535-45872)/256; //50ms初值
// TL0=(65535-45872)%256;
if(num1<scan){sout=0;sled=0;}
else {sout=1;sled=1;}
num1=++num1%10;
if(num2<xcan){xout=0;xled=0;}
else {xout=1;xled=1;}
num2=++num2%10;
}
复制代码
作者:
hsujinshan
时间:
2021-3-19 08:19
多谢这位老师
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1