数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3039|回复: 3

[C51] 求助,15w204 定时器模拟PWM控制LED,每次擦除EEPROM时候都会爆闪一下

[复制链接]
发表于 2019-3-24 13:58:51 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
本帖最后由 晴天不会哭 于 2019-3-24 14:03 编辑

RT,最近在做一个双路PWM,色温亮度独立可调的LED台灯,各种都调试好了,最后加上读写EEPROM,用来保存亮度和色温时出现了问题。因为要做双路PWM,15只有两个定时器,只能一个用来模拟PWM,一个用作计时。T0产生10US的中断,为了提高精度,总计数200次,频率为500HZ。
现在的问题就是如果不关中断,则擦除扇区时会爆闪,关了中断,会熄灭一下,读和写的时候都没问题,只有擦除时候会出现,提高T0定时器中断时间为20US问题依旧。通过屏蔽语句发现只有擦除会导致这个问题。下面贴上相关代码,等全做好了,再把台灯的全部代码放上来。

保存亮度和色温的函数,Brigheness代表亮度,uchar,占用一个字节,保存在0x200处;CCT代表色温,uchar,占用一个字节,保存在0x201处
  1. if(save_time == 25)
  2. {
  3.         saved = 1;
  4.         save_time = 0;
  5.         save_flag = 0;
  6.         EA = 0;
  7.         eraseEEP(0x0200);
  8. //                                        EA = 1;
  9. //                                        delay(50);
  10. //EA = 0;
  11.         writeEEP(0x0200,Brightness);
  12.         writeEEP(0x0201,CCT);
  13.         EA = 1;
  14. }
复制代码

下面是定时器T0的初始化和中断处理函数
  1. /***************** 定时器和外部中断初始化函数*******************/
  2. void interruptInit(void)               
  3. {   
  4. /*********************定时器0初始化****************************/
  5.         AUXR |= 0x80;                   //定时器0为1T模式
  6.     TMOD &= 0xf0;                   //设置定时器0为模式0(16位自动重装载)
  7.     PT0 = 1;                        //高优先级中断
  8.     TL0 = 0xD4;                                //设置定时初值10us,作为PWM的时基
  9.     TH0 = 0xFE;                                //设置定时初值
  10.     TF0 = 0;                                //清除TF0标志
  11.     ET0 = 1;                        //使能定时器0中断
  12.       
  13. /********************定时器2初始化****************************/   
  14.     AUXR &= 0xFB;                            //定时器2时钟12T模式
  15.     T2L = 0xE0;                                //设置定时初值  20ms
  16.     T2H = 0xB1;                                //设置定时初值
  17.     IE2 |= 0x04;                    //使能定时器2中断

  18. /*******************外部中断1初始化***************************/  
  19.     IT0 = 1;                        //设置INT1中断类型(1:仅下降沿 0:上升沿和下降沿),对应编码器按钮
  20.     EX0 = 1;                        //使能INT1中断
  21.    
  22.     EA = 1;   
  23.     TR0 = 1;                        //定时器0开始计时   
  24.     AUXR |= 0x10;                        //定时器2开始计时
  25. }
复制代码

下面是EEPROM的函数
  1. void IAPIDLE()
  2. {
  3.     IAP_CMD = 0;      //关闭令,保护
  4.     IAP_CONTR = 0;    //关EEPROM,保护
  5.     IAP_TRIG = 0;
  6.     IAP_ADDRL = 0; //设置读取地址的低字节,地址改变才需要设置
  7.     IAP_ADDRH = 0X80; //设置读取地址的高字节,地址改变才需要设置
  8. }
  9. unsigned char readEEP(unsigned int adddata)
  10. {        //读取
  11.         unsigned char eerdata;
  12.         IAP_CONTR=0X83;//设置等待时间,1MHz以下取7,2M以下取6,3M取5,6M取4,12M取3,20M取2,24M取1,30M取0,前导1表示许档IAP
  13.         IAP_CMD = 1;      //读取值1,写取2,擦除取3,擦除时按所在字节整个扇区撺除
  14.         IAP_ADDRL = adddata;    //设置读取地址的低字节,地址改变才需要设置
  15.     IAP_ADDRH = adddata>>8; //设置读取地址的高字节,地址改变才需要设置
  16.         IAP_TRIG = 0x5A;  //先送5A
  17.     IAP_TRIG = 0xA5;  //先送5A再送A5立即触发
  18.         _nop_();
  19.         eerdata=IAP_DATA;
  20.         IAPIDLE();
  21.         return eerdata;
  22. }
  23. void writeEEP(unsigned int adddata, unsigned char eerdata)
  24. {//写入
  25.   IAP_CONTR=0X83;//设置等待时间,
  26.   IAP_CMD = 2;      //读取值1,写取2,擦除取3,擦除时按所在字节整个扇区撺除
  27.   IAP_ADDRL = adddata;    //设置读取地址的低字节,地址改变才需要设置
  28.   IAP_ADDRH = adddata>>8; //设置读取地址的高字节,地址改变才需要设置
  29.   IAP_DATA=        eerdata;//传入数据
  30.   IAP_TRIG = 0x5A;  //先送5A
  31.   IAP_TRIG = 0xA5;  //先送5A再送A5立即触发
  32.   _nop_();
  33.   IAPIDLE();
  34. }
  35. void eraseEEP(unsigned int adddata)
  36. { //擦除
  37.    IAP_CONTR=0X83;//设置等待时间,
  38.   IAP_CMD = 3;      //读取值1,写取2,擦除取3,擦除时按所在字节整个扇区撺除
  39.   IAP_ADDRL = adddata;    //设置读取地址的低字节,地址改变才需要设置
  40.   IAP_ADDRH = adddata>>8; //设置读取地址的高字节,地址改变才需要设置
  41.   IAP_TRIG = 0x5A;  //先送5A
  42.   IAP_TRIG = 0xA5;  //先送5A再送A5立即触发
  43.   _nop_();
  44.   IAPIDLE();
  45. }
复制代码






打赏

参与人数 1家元 +10 收起 理由
拿糖糖换媳妇 + 10

查看全部打赏

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-8-9 14:17 , Processed in 0.608401 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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