打印
[AVR单片机]

发给近期我用ATTINY26实现的程序

[复制链接]
4118|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huguang0218|  楼主 | 2009-12-26 16:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include   <iot26v.h>
#include   <macros.h>
//变量的定义
unsigned char temp;       //PORTB口状态?
unsigned int  AD_data;    //AD采样值
unsigned int  temp1,CP_time;   
unsigned char Key_num=0;   //
//标志的定义
unsigned char open_status=0x00;//开窗标志定义:0x01-窗正在开启;0x00-窗正没有在开启;;
unsigned char close_status=0x00;//关窗标志定义:0x01-窗正在关闭;0x00-窗正没有在关闭;;
unsigned char stop_status=0x00;//
unsigned char open_close=0x00;//0x01:开窗;0x11:关窗
//函数的定义
unsigned int get_ad(void);    /*AD采样函数*/
unsigned char Scan_Key(void);//判断按键并且返回状态值
void set_value(void);        //动作判断函数
void open_window(void);      //开窗函数
void close_window(void);     //关窗函数
void stop_window(void);      //开窗函数
void Test_current(void);  //检测电流   
/*********************************************************************************************
延时函数
函数说明:软件延时函数,此函数延时单位约为1mS。
晶振频率:CPU内部1M晶振。
带入参数:i无符号整型,变量范围:0-65535。
返回参数:无
*********************************************************************************************/
void delay_ms(unsigned int i) {
unsigned int a;
unsigned char b;
for (a = 0; a < i; a++) {
  for (b = 1; b; b++) {;
   }}}
void t1_init(void) {
OCR1A=250;                     //设定计数次数
TIMSK |= (1 << OCIE1A);    /*比较中断A允许*/           
TCCR1B|=(1<<CS13);             //256分频
    TCCR1B|=(1<<CS10);
}
/*********************************************************************************************
主函数
*********************************************************************************************/
void main(void) {
unsigned int i,b;
   
DDRA = 0x7F;      /*方向输出*/
PORTA = 0x73;      /*高电平*/
DDRB = 0x00;      /*方向输入*/
PORTB = 0x77;      /*打开上拉*/
SEI();             /*开总中断*/
MCUCR|=(1<<SE);                    //睡眠使能
MCUCR|=(1<<SM1);                   //掉电模式
t1_init();                         /*定时器T1初始化*/
while(1)
{
for(b=0;b<10;b++){
for(i=0;i<60000;i++){
   if(open_close==0x01)//执行开窗
   {open_close=0x00;
    open_window();}
   if(open_close==0x11)//执行关窗
  {open_close=0x00;
   close_window();}
   }}
     PORTA&=0xBF;
     GIMSK |= (1 << PCIE0);      /*外部电平变化中断允许*/
      asm("sleep");              //进入睡眠模式
     GIMSK &= ~(1 << PCIE0);   /*外部电平变化中断禁止?*/
  }
  }
#pragma interrupt_handler EXT1: iv_PIN_CHANGE   
//外部中断引脚电平变化中断-PB0
void EXT1(void) {
      delay_ms(20); }
   
#pragma interrupt_handler TIME0: iv_TIMER1_COMPA      
  void TIME0(void) {
                    temp1++;
      //Test_current();//电流检测函数
      set_value();   //获取按键值
                if(temp1%2==0)
     {PORTA&=0xBF;}
       if(temp1%2!=0)
     {PORTA|=~(0xBF);}
     }
                  
/*********************************************************************************************
ADC采样函数
函数说明:采样ADC通道0。
晶振频率:CPU内部1M晶振。
带入参数:无
返回参数:16位AD值
*********************************************************************************************/
unsigned int get_ad(void) {

  ADCMUX=(1 << REFS1);        /*基准2.56V,P*/
  ADCMUX |= (1 << MUX2) | (1 << MUX1);             /*通道6*/
  ADCSR = (1 << ADEN) | (1 << ADSC)     /*使能、开启*/
   | (1 << ADPS1) | (1 << ADPS0);    /*8分频*/
  while(!(ADCSR & (1 << ADIF)));      /*等待采样结束*/
  AD_data = ADC;          /*读取AD结果*/
  ADCSR &= ~(1 << ADIF);        /*清标志*/
  ADCSR &= ~(1 << ADEN);        /*关闭转换*/
  return AD_data;         /*返回结果*/
}
void Test_current(void)  //检测电流值
{unsigned char i;
  i=get_ad();
  i=get_ad();
  if(i>290){stop_window();}
}
unsigned char Scan_Key(void)
    {//按键扫描函数,只扫描0 1 2前三挝?
       unsigned char Key_num1;
           Key_num1=PINB;     //取得当前PB口的值
       if((Key_num1&0x07)!=0x07)//判断是否有键按下
        { delay_ms(10);        //延时20MS
    Key_num1=PINB;        //再次取得值
         if((Key_num1&0x07)!=0x07)//再次判断是否按键有效
            {Key_num1=Key_num1&0x07;//
   do{;}while((PINB&0x07)!=0x07);
             return Key_num1;}     //返回当前按键值
             }
    }
   
void set_value(void)//动作判断函数
{
Key_num=Scan_Key();
if(Key_num==0x06) //判断是否按下了开窗按钮
{       //开窗动作标志     关窗动作标志
   if((open_status==0x00)&&(close_status==0x00))//如果开与关窗标志都为0,表示窗处于
     {open_close=0x01;}                         //停止状态,那么置开窗执行标志为0x01,开窗
   if((open_status==0x00)&&(close_status==0x01))//如果窗正处于关闭过程,则停止动作
     {stop_window();}
}
//判断是否按下了关窗按钮   
if(Key_num==0x05)
{      if((open_status==0x00)&&(close_status==0x00))
    {open_close=0x11;}                     //置关窗标志有效
    if((open_status==0x01)&&(close_status==0x00))
    {stop_window();}
}
//判断是否按下了停止按钮  
if(Key_num==0x03){stop_window();}   
}
//开窗函数
void open_window(void){
     PORTA&=0xFE;     //开窗指示灯
  PORTA|=(1<<PA2); //开窗:置PA2开窗
  open_status=0x01;//开窗标志置1,正在开窗
  for(CP_time=0;(open_status==0x01)&&(CP_time<60);CP_time++)
        {delay_ms(1000);} //延时
open_close=0x00; //开窗执行标志清0
  open_status=0x00;//开窗标志清0,
  PORTA|=~0xFE;     //结束开窗
  PORTA&=~(1<<PA2);
}
//关窗函数
void close_window(void){
     PORTA&=0xFD;      //关窗指示灯
  PORTA|=(1<<PA3); //关窗
  close_status=0x01;//关窗标志置1,正在关窗
  for(CP_time=0;(close_status==0x01)&&(CP_time<60);CP_time++)
        {delay_ms(1000);} //
  open_close=0x00;  //关窗执行标志清0
  close_status=0x00;//关窗标志清0,
  PORTA|=~0xFD ;     //结束关窗
  PORTA&=~(1<<PA3);
}
//停止函数
void stop_window(void){
       PORTA|=~0xFE;     //结束开窗
    PORTA|=~0xFD ;     //结束关窗
    PORTA&=~(1<<PA2);
    PORTA&=~(1<<PA3);
  open_close=0x00;
  close_status=0x00;//开窗标志清0,
  open_status=0x00; //关窗标志清0,
   
}

相关帖子

沙发
huguang0218|  楼主 | 2009-12-26 16:19 | 只看该作者
近期有AVR26做了个小项目,虽然程序不长,但是用到了许多资源如:AD转换,定时器T0,睡眠模式,外部中断唤醒,IO扫描。我也是刚刚开始用AVR做产品,请多多指教,程序调试通过,在硬件上运行正常。

使用特权

评论回复
板凳
lovelyegle| | 2009-12-26 21:33 | 只看该作者
注释怎么也有问号,难道楼主自己都不明白程序?

使用特权

评论回复
地板
huamunv| | 2009-12-26 22:53 | 只看该作者
连题目都有错:L

使用特权

评论回复
5
杜专| | 2009-12-27 12:59 | 只看该作者
收藏

使用特权

评论回复
6
huguang0218|  楼主 | 2009-12-28 09:23 | 只看该作者
注释怎么也有问号,难道楼主自己都不明白程序?
lovelyegle 发表于 2009-12-26 21:33
我是用ICCAVR编写的程序,那里面写汉语注释老是出现一些乱码,程序都是原创,我肯定都明白的。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

233

帖子

2

粉丝