历史上的今天
返回首页

历史上的今天

今天是:2024年10月16日(星期三)

正在发生

2019年10月16日 | avr单片机atmega16自动浇花器Proteus仿真+源程序

2019-10-16 来源:eefocus

 

单片机源程序如下:

#include

#include

#define  key_bz   0b00000111

#define uchar  unsigned char

#define  uint_16  unsigned short

char smg_zx[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x37};// 全局变量

char smg_wx[]={0B00000001,0B00000010,0B00000100,0b00001000}; 

char  smg_oFF[]={0x3f,0X71,0X71};

unsigned int flag_10ms=0,flag_1s=0,on=0,buff[]={0,0,0},mode=0;

unsigned  int jh_hour1=2,u=0,count=0,count1=2,on_sec=0;

unsigned int jh_sec1=5,jh_hour=0,jh_sec=0,flag=0;



unsigned long int jishi_sec=0;

void delay_ms(unsigned int k)                        

{

    unsigned int i,j;

    for(i=0;i    {

      for(j=0;j<570;j++);

    }

}

// 用定时器实现定时

void T0_init(void)// 端口初始化函数

{

TIFR=0XFF;

TCCR0=0X0B; //64FENPIN, CTC MODE

TCNT0=0;

OCR0=250;

TIMSK=0X02;

}


void port_init(void)// 端口初始化函数

{

  DDRC|=0b10001111;  // PC4 5 OUT PUT

  PORTC=0b11110000; //m103 output only


PORTD= 0xFF; 

DDRD= 0xff;

DDRB&= 0b11111000;  

PORTB|=0B00000111;


}


void init_devices(void)

{


CLI(); //disable all interrupts

port_init();//smg_zx[0]=1;

T0_init();

SEI(); //re-enable interrupts


}




////多位数拆分函数///////*/


void xs_buff(uchar va1, uchar va2)

{

  buff[0]=va1/10;

  buff[1]=va1%10;

  buff[2]=va2/10;

  buff[3]=va2%10;

  

}

void xs_buff_on( uchar va2)

{

  buff[0]=0;

  buff[1]=10;

  buff[2]=va2/10;

  buff[3]=va2%10;

}



void xs_smg()

{//char smg_zx[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,

  // 0x7d,0x07,0x7f,0x6f};// 局部变量

  static unsigned char  posit=0;

    PORTC&=0X80; // turn off

     

          PORTC|=smg_wx[posit];//selecting led 7-segment 

         PORTD=~smg_zx[buff[posit]];  // 

        

  if(posit++>=3)posit=0;

        

         }




////////////////////////////////////////////////////////////

void smg_xs(void)

{


if((count<=20)||(flag==1))

{

if((on!=1)&&(on!=2))

{

xs_buff(jh_hour,jh_sec);

xs_smg();

}

else

{

if((on==1))

{ xs_buff_on(on_sec);

   xs_smg();

}

else if(on==2)

{PORTC&=0X80;on_sec=0;

PORTD=~smg_oFF[u];

PORTC|=smg_wx[u];if(u++>=2)u=0;

}

}

}

else

{PORTC&=0X80;count1=0;}

}

////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////

void motor(void)

if(on==1)

{PORTC|=0X80;flag=1;

}

else 

on_sec=0;

if(on==2){PORTC&=0X7F;flag=0;}//off状态下关闭电机

else if((jishi_sec>jh_hour1*3600)&&(jishi_sec<=jh_hour1*3600+jh_sec1))//大于设定的时间间隔和浇花时长


{PORTC|=0X80;//开电机

flag=1;}

else 

{   

     PORTC&=0X7F;flag=0;

   if(jishi_sec>jh_hour1*3600+jh_sec1)

   jishi_sec=0;

   



  }

///////////////////////////////////////////////////////////////////////////////////

        /// 按键子程序,实现按键值返回

uchar  key(void)

{ static uchar  key_zt=1, key_value;

   uchar  returnvalue=100; // 100表示无按键对应的一个数值

   switch(key_zt)  // 0b00000111  /0b00000110  //0b00000110

    {

        case 1:if((PINB&key_bz)!=key_bz) 

                 {key_value=PINB&key_bz;

                           key_zt=2;}  

                           break;

    case 2:  if((PINB&key_bz)==key_value) 

                 {key_zt=3;

                  switch(key_value)

                  {

                   case 0b00000110:  

                                returnvalue=1; //切换模式

                                        break;

                   case 0b00000101:

                                returnvalue=2;//在时分之间切换

                                        break; 

                  case 0b00000011:  

                                returnvalue=3;//在时分之间切换

                                        break; 

                       }

                       }else key_zt=1;  

                                 break;

    case 3: 

                if((PINB&key_bz)==key_bz)

                key_zt=1;  

                        break;

             }

      return  returnvalue;

       }

// 根据按键子程序返回的按键值去执行相应的功能

void key_process(void)

{  

   switch(key())

     {   case 1:count=0;count1++;if(count1>1){count1=2;if(on==0)/*只有on=0,回归正常显示界面才能加*/{if(jh_hour++>=99)jh_hour=0;}}break; //mode:0-计时,1,校准,2闹钟  // 模式切换


        case 2:count=0;count1++;if(count1>1){count1=2;if(on++>=2){on=0;jishi_sec=0;}}break;//每手动开启电机,jishi_sec就赋零

            case 3:count=0;count1++;if(count1>1){count1=2;if(on==0)/*只有on=0,回归正常显示界面才能加*/{if(jh_sec++>=99)jh_sec=0;}}break;

                }

                }

///////////////////////////////////////////////////////////////////////////////////////////////////

void sj_lj(void)

  {

  jishi_sec++;

  if(jishi_sec%3600==0&&jishi_sec!=0)jh_hour--;

  if(jh_hour==0){if(jh_sec--<=0){jh_hour=jh_hour1;jh_sec=jh_sec1;}}

}

//主函数////////////////////////////////////////////////////////////////////////////////////

void main(void)

{

jh_hour=jh_hour1;

jh_sec=jh_sec1;

init_devices();


   while(1)

   {

       

            motor();

                smg_xs();

       if(flag_1s==1)

           {flag_1s=0;

           sj_lj();}

       if(flag_10ms==1)

           {flag_10ms=0;

           key_process();}

   }

  }


/////////////////

//////////////

        

//T0中断服务程序 //  2ms 进入中断

   #pragma interrupt_handler timer0_ocf_isr:20

  void timer0_ocf_isr(void)

  {static uint_16  count_1s=0,count_10ms=0,count_5s=0;


   if(++count_10ms>=5)

   { count_10ms=0;

     flag_10ms=1;

     if(++count_1s>=100)

     {count_1s=0;

          flag_1s=1;

          count++;

          if(on==1)

          on_sec++;

          }

          }

          }



推荐阅读

史海拾趣

ATO SOLUTION公司的发展小趣事

面对日益激烈的市场竞争,ATO SOLUTION公司不断创新营销策略,提升品牌知名度和影响力。公司利用互联网和社交媒体等新媒体平台,开展线上宣传和推广活动;同时,还积极参加各类行业展会和论坛,与业界同行和潜在客户进行深入交流和合作。这些创新的营销策略有效地提升了公司的市场影响力,为公司的业务拓展提供了有力支持。

静芯微电子(ElecSuper)公司的发展小趣事

静芯微电子深知产品质量对于企业的重要性,因此建立了完善的质量管理体系。公司从原材料采购、生产制造到产品检测等各个环节都实行严格的质量控制和管理,确保每一款产品都符合高标准的质量要求。同时,静芯微电子还引进了先进的检测设备和技术手段,对产品质量进行全面检测和评估。这些措施保证了静芯微电子产品的稳定性和可靠性,赢得了客户的信任和好评。

CLAIREX公司的发展小趣事

随着市场的不断发展,Clairex意识到,要想在激烈的竞争中脱颖而出,必须不断创新。于是,公司加大了对研发的投入,积极探索新技术、新材料和新工艺。经过数年的努力,Clairex成功开发出了一系列具有自主知识产权的光电子组件。这些组件不仅性能优异,而且成本更低、更易于集成。它们的推出,不仅进一步巩固了Clairex在市场上的地位,也为公司带来了可观的利润。

国炬(GOOGLL)公司的发展小趣事
由于省去了输出电容,OCL电路能够提供相对较高的功率输出,适用于需要大功率输出的音频应用。
柯爱亚(ceaiya)公司的发展小趣事

柯爱亚一直秉承“持续改进,满足客户要求,不断创新,超越客户期望”的品质方针。公司严格把控产品质量,从原材料采购到生产流程,再到产品检测,每一个环节都力求精益求精。这种对品质的坚持赢得了客户的信任,柯爱亚的产品逐渐在市场上树立了良好的口碑。

Discrete Semiconductor Industries公司的发展小趣事

“绿源科技”是一家致力于绿色环保的Discrete Semiconductor Industries公司。该公司注重环保理念在产品研发和生产过程中的应用,积极推广绿色制造和循环经济。通过采用环保材料和工艺,绿源科技成功开发出了一系列低能耗、低污染的半导体产品。这些产品不仅满足了市场的需求,还为环境保护做出了积极贡献。同时,绿源科技还积极参与各种环保公益活动,推动行业向更加绿色、可持续的方向发展。

问答坊 | AI 解惑

可视倒车雷达

ddddddddddddddddddddddddddddddd…

查看全部问答>

dsp晶振选用

请问dps外接晶振用无源的好还是有源的好?57个问题中说:晶体没有电压的问题,可以适应于任何DSP,建议用无源的晶体,是这样吗?…

查看全部问答>

散分!!!!!!!

恭喜发财,我散分,我发财,大家一起发财!!!!!!…

查看全部问答>

如何选择A/D

我最近要做一个温度检测系统,范围0---99,检测分辨率 0.1℃,在检测电路设计上用铂电阻电桥检测(三线),由于第一次做设计不懂如何选择A\\D,请各位朋友帮忙小弟一下,感激不尽!…

查看全部问答>

eVC++ 对web service 的调用可以么??

论坛以前有这个帖子可是没有明确的答复。 如果谁知道这个问题可以麻烦帮忙解答一下么?? 如果不能调用可以说出根据 或者 文章出处么/? 如果可以调用的话,可以介绍一下方法么?? 谢谢!!…

查看全部问答>

时钟抖动测试-Ivan

时钟抖动测试-Ivan…

查看全部问答>

MSP-EXP430FR5739

这款单片机 用IAR编吗?什么软件下载?…

查看全部问答>

STM32F105 USB OTG 硬件连接

我现在要用STM32F105做个东西要求用到USB OTG功能,但是我不太清楚STM32F105的VBUS引脚该如何连接,是否可以直接连到USB接口的VBUS上,请用过的高人指教下…

查看全部问答>