找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用pwm调节led灯亮度 编译没毛病 烧录到单片机没反应 这个代码哪里出问题?

[复制链接]
跳转到指定楼层
楼主
ID:841280 发表于 2020-11-24 00:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
150黑币
*单片机实现PWM调节LED灯的亮度*/
#include<reg52.h>
#define uchar unsigned char
sbit P2_0=P2^0;
sbit key1=P3^4;
sbit key2=P3^5;
uchar zkb,i;// zkb指占空比
void delay(uchar z)
{
  uchar x,y;
  for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}
void init()  //初始化函数
{
     TMOD=0X01;
  TH0=(65536-10)/256;
  TL0=(65536-10)%256;
  EA=1;
  ET0=1;
  TR0=1;
}
void keyscan()  //键盘扫描
  {
    P3=0XFF;
if(key1==0)
  {
   delay(5);
    if(key1==0)
    {
     while(!key1);
     
  if(zkb<9)
   {
     zkb++;
   }
  
    }
  }
if(key2==0)
  {
   delay(5);
    if(key2==0)
    {
     while(!key2);
     if(zkb>0)  
   {
     zkb--;
   }

    }
  }  
  }
void main() //主函数
  {
   
    zkb=2;
    init();
while(1)
{
  keyscan();
}
  }
void time0(void) interrupt 1  //中断函数
  {
   
    TH0=(65536-10)/256;
TL0=(65536-10)%256;
++i;
if(i>10)
   {
   i=0;
   };
if(i<=zkb)
{
  P2_0=1;
}
else P2_0=0;

  }

最佳答案

查看完整内容

楼主这个程序从表面看没有什么毛病,其实有诸多毛病。 1.设置中断周期10us,但10us时间根本完不成中断任务,必然达不到设计意图。 2.延时程序看来按1ms写的,但数据类型用错,实际延时时间只有1/4。 3.按键扫描函数语句排列不当,导致按键松手才能响应。 4.计数方式不当,导致PWM控制范围只能10~90%。达不到0~100%。 修改如下:
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-11-24 00:12 | 只看该作者
楼主这个程序从表面看没有什么毛病,其实有诸多毛病。
1.设置中断周期10us,但10us时间根本完不成中断任务,必然达不到设计意图。
2.延时程序看来按1ms写的,但数据类型用错,实际延时时间只有1/4。
3.按键扫描函数语句排列不当,导致按键松手才能响应。
4.计数方式不当,导致PWM控制范围只能10~90%。达不到0~100%。
修改如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit P2_0=P2^0;
  5. sbit key1=P3^4;
  6. sbit key2=P3^5;
  7. uchar zkb,i;// zkb指占空比
  8. void delay(uint z)
  9. {
  10.         uint x,y;
  11.         for(x=z;x>0;x--)
  12.                 for(y=110;y>0;y--);
  13. }
  14. void init()  //初始化函数
  15. {
  16.         TMOD=0X01;
  17.         TH0=(65536-100)/256;
  18.         TL0=(65536-100)%256;
  19.         EA=1;
  20.         ET0=1;
  21.         TR0=1;
  22. }
  23. void keyscan()  //键盘扫描
  24. {
  25.         if(key1==0)
  26.         {
  27.                 delay(10);
  28.                 if(key1==0)
  29.                 {
  30.                         if(zkb<10)
  31.                         {
  32.                                 zkb++;
  33.                         }
  34.                         while(!key1);
  35.                 }
  36.         }
  37.         if(key2==0)
  38.         {
  39.                 delay(10);
  40.                 if(key2==0)
  41.                 {
  42.                         if(zkb>0)  
  43.                         {
  44.                                 zkb--;
  45.                         }
  46.                         while(!key2);
  47.                 }
  48.         }  
  49. }
  50. void main()
  51. {
  52.         zkb=2;
  53.         init();
  54.         while(1)
  55.         {
  56.                 keyscan();
  57.         }
  58. }
  59. void time0(void) interrupt 1  //中断函数
  60. {
  61.         TH0=(65536-100)/256;
  62.         TL0=(65536-100)%256;
  63.         ++i;
  64.         if(i==10)
  65.         {
  66.                 i=0;
  67.         }
  68.         if(zkb>i)
  69.         {
  70.                 P2_0=1;
  71.         }
  72.         else P2_0=0;
  73. }
复制代码
回复

使用道具 举报

板凳
ID:443955 发表于 2020-11-24 10:06 | 只看该作者
uint timer0_count=0;                                //计数次数,由于定时器的本质是计数器

void timer0_init(void)        //定时器0初始化
{
        TMOD=0x01;                        //设置定时器0的定时方式
        TH0=(65536-50000)/256;        //设置初值,相当于每50毫秒进入一次中断函数
        TL0=(65536-50000)/256;
        EA=1;                                //开启总中断
        ET0=1;                                //开启定时器0中断
        TR0=1;                                //启动定时器0中断
}

void timer0_interrupt(void)interrupt 1                //定时器0的中断函数
{
        count++;                                                //每加一次代表过了一个50毫秒
        if(count==220)                                        //代表过了11秒
        {
                //然后打开LED2;
        }
        //之后的15秒钟的自己就OK了吧
}

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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