标题:
有人能帮我看一看程序有哪里不对吗
[打印本页]
作者:
上官二白
时间:
2020-12-4 10:37
标题:
有人能帮我看一看程序有哪里不对吗
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit SW1=P2^0;//用于调高灯的亮度
sbit SW2=P2^1;//用于调低灯的亮度
sbit CF=P2^2;//用于触发可控硅
sbit SW3=P2^3;//用于控制灯的亮灭
void kdelay();
void maichong();
delay500us(uint z);
void delay10us();
void liangmie();
uint x,y,z,k,i,j;
void main()
{
IT0=1;//设定外部中断 0 为下降沿触发方式
EX0=1;//开外部中断 0
P2=0xff;
z=10;
j=0;
while(1)
{
if(SW1==0)
{
kdelay(); //软件 2ms 延时防抖
if(SW1==0)
{
z--;
if(z==0){z=19;}//灯达到最亮以后继续按下 SW2,灯会变到最暗
}
while(!SW1);//等待按键弹起
}
if(SW2==0)
{
kdelay();
if(SW2==0)
{
z++;
if(z==20){z=0;}//灯达到最暗以后继续按下 SW1,灯会变到最亮
}
while(!SW2);
}
liangmie();
if(j==0)
{
EA=1; //开总中断
}
else
{
EA=0; //关总中断
}
}
}
/************2ms 按键防抖动延时函数**********/
void kdelay()
{
for(i=0;i<200;i++)
{
delay10us(); //调用 200 次 10us 约为 2ms
}
}
/*将半周期 0.01 秒平均分成 20 等分,每等分为 0.5 毫秒,即 500us*/
/************0.5ms 倍数的子函数************/
delay500us(uint z)
{
uchar x,y;
for(x=0;x<z;x++)
{
for(y=0;y<50;y++)
{
delay10us();//调用 50 次 10us 约为 502us
}
}
}
/*************脉冲函数*****************/
void maichong()
{
CF=0;
for(k=0;k<10;k++)
{
delay10us();//调用 10 次 10us 约为 102us
}
CF=1;
}
/*************10us 延时函数**************/
void delay10us()
{
_nop_(); _nop_();_nop_();
_nop_(); _nop_();_nop_();
}
/************灯的亮灭控制函数***********/
void liangmie()
{
if(SW3==0)
{
kdelay();
if(SW3==0)
{
j++;
if(j==2){j=0;}
}
while(!SW1);//等待按键弹起
}
}
/**********外部中断 0 函数**********/
void Int0(void) interrupt 0
{
delay500us(z);//控制角的大小由 z 决定
maichong();//发脉冲
}
作者:
上官二白
时间:
2020-12-4 10:38
用的51的开发板 没有反应啊
作者:
devcang
时间:
2020-12-4 12:22
大哥 至少说说程序是干嘛的、什么环境(软硬件环境)的,遇到怎样的问题
作者:
寄语
时间:
2020-12-4 13:28
有仿真图吗?
作者:
上官二白
时间:
2020-12-4 13:46
是一个调灯亮度的台灯,用的MOC3020 和BTA 16的,51单片机的
作者:
hcfat51h
时间:
2020-12-4 13:59
程序干嘛的不知道,电路不知道,全靠猜,谁能看懂
作者:
菜鸟yc
时间:
2020-12-4 14:22
外部中断0的P3.2脚,硬件连接是怎么样的?
作者:
asmmcu
时间:
2020-12-4 15:00
106行的SW1应改为SW3.
看你的程序也是相当的头痛!
作者:
上官二白
时间:
2020-12-4 15:13
这是图片 谢谢大哥们了
172417a224l44gj22kyjii.png
(170.73 KB, 下载次数: 132)
下载附件
2020-12-4 15:13 上传
作者:
hcfat51h
时间:
2020-12-5 09:48
31脚要接高电平吧
作者:
6620680
时间:
2020-12-5 11:31
除了106行的SW3,光耦的工作电流不够,不能触发中断也是有可能的!
作者:
1922323908
时间:
2020-12-5 12:29
先检查一下接线是否正确,还有程序不要写在main函数中,自己可以试着自己写个封装库
作者:
hejianmin
时间:
2020-12-5 15:01
你要实现什么东西说出来呀,才能说那里有没有反应吧,如果是STC的单片机先把要PM20 寄存器初始化一下
作者:
lovexulu
时间:
2020-12-5 16:23
硬件检测TB是否有输出。检测CF是否有输出。
软件,程序流程相当混乱,自己画个程序流程框图不费事,这是好习惯。触发式调光对时间控制严格要求,你在中断中调用函数就不对,按键检测采用delay也不对,改状态机读取按键。
小技巧,定义一个led,任意脚,让它作为程序调试指示器,例如判断是否中断,在中断函数中加一条IO反转。或者赋值。判断中断是否执行完毕,就在最后面加一句反转就能知道程序工作的位置,是否完成等。
调试完毕解除掉它就行了。
作者:
哈哈哈fxd
时间:
2020-12-5 17:13
PM20 寄存器初始化一下,31脚要接高电平
作者:
Chellson
时间:
2020-12-5 20:52
我觉得31脚=0才是对的
作者:
yx945945
时间:
2020-12-6 20:37
106行的SW1应改为SW3
作者:
FBDF
时间:
2020-12-6 21:25
sbit SW1=P2^0;//用于调高灯的亮度 sbit SW2=P2^1;//用于调低灯的亮度 sbit CF=P2^2;//用于触发可控硅 sbit SW3=P2^3;//用于控制灯的亮灭
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1