找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机pwm按键调光不起作用,是哪里有错误啊?

[复制链接]
跳转到指定楼层
楼主

#include <REG51.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char
//******************adc0832****************************//
sbit CLK=        P2^2;//时钟,初始状态为0
sbit DI=        P2^3;//数据输入
sbit DO=        P2^1; // 数据输出
sbit CS=        P2^0;
//******************按钮****************************//
sbit start =P2^4;
sbit end=P2^5;
sbit led=P3^5;
sbit down = P3^0;
sbit up = P3^1;

uchar start_flag;//开始标志
//延时
void delay(uchar i)
{
        while(i--)
        {
                if(!end)                         //end按钮按下
                        start_flag=0;
        }
}
/*******************亮灯函数***************/
void led_red(uchar i)//占空比i/13
{
        led=0;
        delay(i/10);
        if(i/10<12)
        {
                led=1;
                delay(12-i/10);
        }
}
/*********************************************
读取ADC
**********************************************/
uchar ADC()//通道ch0
{
        uchar temp0,temp1,i;
        CS=0;
        temp0=0;
        temp1=0;
        _nop_();
        _nop_();
        DI=1;//开始位
        _nop_();
        _nop_();
        CLK=1;
        _nop_();
        _nop_();
        CLK=0;
        _nop_();
        _nop_();
        DI=0;
        _nop_();
        _nop_();
//选择通道0
                DI=1;
                _nop_();
                CLK=1;//上升沿DI=1
                _nop_();
                CLK=0;//1个下降沿DI=1
                _nop_();
                DI=0;
                _nop_();
                CLK=1;
                _nop_();
                CLK=0;//第3个上升沿DI=0
                _nop_();
                   DI=1;
//********通道选择结束开始读取转换后的二进制数****
//下降沿读数,一下进行判断和处理,共8次
for(i=0;i<8;i++)
   {
        temp0=temp0<<1;
        CLK=1;
    if(DO)
           temp0++;
           _nop_();
           CLK=0;
   }
for(i=0;i<8;i++)
   {
        temp1=temp1>>1;
        CLK=1;
    if(DO)
           temp1=temp1 +0x80;
           _nop_();
           CLK=0;
   }
         CS=1;
   return temp0;
}
//*********************************************
void main()
{
        uchar num,i,t;
        CLK=0;//ADC时钟初始化
        start_flag=0;
while(1)
        {
//按键检测
        if(!start)                         //start按钮按下
                {
                start_flag=1;
                }
        if(!end)                         //end按钮按下
                {
                start_flag=0;
                }
               
        if(start_flag)
        {
     if(!up)
                         {
                                if(t<i)
                                        {
                                          t++;
                                        }
                                
                                delay(100);
                        }
                 if(!down)
                         {
                                if(t>0)
                                        {
                                          t--;
                                        }
                                
                        delay(100);
                        }

                num=ADC();
                P1=num;
                for(i=0;i<100;i++)
                        led_red(num);
        }
        }
}



pwm调光.zip

46.75 KB, 下载次数: 7

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

使用道具 举报

沙发
ID:213173 发表于 2020-4-5 06:58 | 只看该作者
仿真软件无法观察到PWM驱动LED调光效果。只能通过虚拟示波器观察占空比来确认。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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