手电大家谈-手电筒爱好者之家

 找回密码
 注册成为会员,享受更多功能。

QQ登录

只需一步,快速开始

只需一步,快速开始

搜索
查看: 2647|回复: 1

【【【AVR单片机代码问题】】】请教各位大神!!!

[复制链接]
  • TA的每日心情
    难过
    2014-12-21 17:30
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2014-9-5 16:24 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有账号?注册成为会员,享受更多功能。

    x
    小弟写一个程序,主要实现LED灯的亮,弱,暴闪等状态的切换,用的是ATtiny13.
    现在遇到两个问题,望坛子里的各位大神指点迷津:
    问题1:状态4的目标是想让PB0到PB3轮流输出暴闪信号,结果程序编译没问题,下到单片机上不工作。(再次尝试,如果状态4的子状态中只有一个管脚输出暴闪信号,其余子状态的输出暴闪信号代码注释掉,则单片机可以工作。)
    问题2:状态2是想调节LED等亮度,但是调节状态2的“if((tick_counter/10)%2) ”语句,LED等要么没怎么变暗,要么就是会闪烁,没办法调到希望的比较弱的亮度。
    多谢!
    代码如下:
    #include <avr/io.h>

    #define uchar  unsigned char
    #define uint  unsigned int

    #define Key_PIN         PINB

    #define PB0_set()        PORTB |= (1 << PB0)//设置为高电平
    #define PB1_set()        PORTB |= (1 << PB1)
    #define PB2_set()        PORTB |= (1 << PB2)
    #define PB3_set()        PORTB |= (1 << PB3)

    #define PB0_clr()        PORTB &= ~(1 << PB0)//设置为低电平
    #define PB1_clr()        PORTB &= ~(1 << PB1)
    #define PB2_clr()        PORTB &= ~(1 << PB2)
    #define PB3_clr()        PORTB &= ~(1 << PB3)

    uchar state_flag = 1;//状态标识位

    /*        微秒级延时程序         */
    void delay_us(uint time){            
                while (time --);
             }          
    /*                              毫秒级延时程序                        */       

    void delay_ms(uint time){
              while(time!=0){               
                       delay_us(150);
                       time--;
                      }
             }

    uchar key_scan(){
            if(!(Key_PIN&0x10)){//按键按下
                    delay_ms(5);//消抖
                    if(!(Key_PIN&0x10)){
                            while(!(Key_PIN&0x10));//松手后按键响应
                            return 1;
                    }
            }
      return 0;
    }

    void IO_Init(){//管脚配置初始化
            PORTB = 0x10;//PB4-上拉电阻
            DDRB = 0b00001111; //设置输入输出方向,PB0,1,2,3为输出,PB4为输入
    }       

    int main(void)
    {       
            uint tick_counter = 0;//循环计数1ms一次,最大3999,4秒钟时间
            state_flag = 1;//默认状态1
            IO_Init();
            while(1){
    /*****按键扫描&四种状态标识位切换*****/       
                    if(key_scan()){//有按键按下
                            state_flag ++;
                            if(state_flag > 4)
                                    state_flag = 1;
                    }       
    /****************四种状态切换**********************/
                    switch(state_flag){                       //四种状态
                            case 1://状态1
                                    PB0_set();
                                    PB2_clr();
                                    PB3_clr();
                                    PB1_clr();   //HDD
                                    break;
                            case 2://状态2
                                    if((tick_counter/10)%2){     //输出周期方波,控制LED亮度    问题2
                                            PB0_clr();
                                    }else{
                                            PB0_set();
                                    }
                                    PB2_clr();
                                    PB3_clr();
                    PB1_clr();   //HDD
                                    break;       
                            case 3://状态3
                                    if((tick_counter/100)%2){//输出周期方波,控制闪动,每100ms切换一次
                                            PB0_clr();
                                    }else{
                                            PB0_set();
                                    }
                                    PB1_clr();
                                    PB2_clr();
                                    PB3_clr();   //HDD
                                    break;
                            case 4://状态4                 问题1
                                    switch(tick_counter/1000){                                            
                                            case 0:
                                           if((tick_counter/100)%2){//输出周期方波,控制闪动,每100ms切换一次
                                            PB0_clr();
                                            }else{
                                            PB0_set();                                        
                                            }
                                            
                                                    PB1_clr();
                                                    PB2_clr();
                                                    PB3_clr();
                                                    break;
                                            case 1:
                                        if((tick_counter/100)%2){//输出周期方波,控制闪动,每100ms切换一次
                                                PB1_clr();
                                            }else{
                                             PB1_set();
                                            }
                                            
                                        PB0_clr();
                                                    PB2_clr();
                                                    PB3_clr();
                                                    break;
                                            case 2:
                                        if((tick_counter/100)%2){//输出周期方波,控制闪动,每100ms切换一次
                                                PB2_clr();
                                            }else{
                                                PB2_set();
                                            }
                                            
                                                    PB0_clr();
                                                    PB1_clr();
                                                    PB3_clr();
                                                    break;
                                            case 3:
                                        if((tick_counter/100)%2){//输出周期方波,控制闪动,每100ms切换一次
                                                PB3_clr();
                                            }else{
                                                PB3_set();
                                            }
                                            
                                                    PB0_clr();
                                                    PB1_clr();
                                                    PB2_clr();
                                                    break;
                                            default:
                                                    break;
                                    }
                                    break;
                            default:
                                    break;                       
                    }                                                                       
    /****************计数周期**********************/
                    tick_counter ++;
                    if(tick_counter >= 4000)
                            tick_counter = 0;
                    delay_us(30);//调节延时参数为1周期1ms      问题2
            }
    }


    回复 dsu_marcocopyright:copyright

    使用道具 举报

  • TA的每日心情
    难过
    2014-12-21 17:30
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2014-9-8 00:58 | 显示全部楼层
    自己顶起!
    回复

    使用道具 举报

    本版积分规则

    小黑屋|手机版|Archiver|论坛自带搜索|下载论坛app|手电大家谈-手电筒爱好者之家 ( 备案序号:鲁ICP备05002565号 )
    以上言论纯属个人观点,与手电大家谈立场无关。
    最佳浏览模式:1920*1080


    GMT+8, 2024-9-23 22:28 , Processed in 0.190530 second(s), 26 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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