历史上的今天
返回首页

历史上的今天

今天是:2024年10月18日(星期五)

正在发生

2019年10月18日 | AVR单片机Atmega16电子时钟程序+仿真,内部定时器实现

2019-10-18 来源:eefocus

Atmega16电子时钟,内部定时器,有可调闹钟。

仿真原理图如下
 

单片机源程序如下:

#include

#include

#define  key_bz    0b00000111

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

  

char hour=12;

char min;

char sec;

char nz_hour=12;

char nz_min=1; 

char mode=0;

char set;


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  |= 0b11110000;  // PC4 5 OUT PUT

  PORTC |= 0b00111111; //m103 output only


PORTD = 0x00; //  上电关闭数码管, 因为上电电压不稳

DDRD  = 0xff;

DDRB  |= 0b11100000;  // PC5 6 7OUT PUT

}


//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

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

  T0_init();

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

//miao=45;


void key (void)

{


if(!(PINC&0X01))

{

   delay_ms(2);

   if(!(PINC&0X01)) 

   {

    TIMSK=0X00;

    mode++;

        mode%=3;

        set=0;

        if(mode==0)TIMSK=0X02;

        while(!(PINC&0X01));

   }

}



if(!(PINC&0X02))

{

   delay_ms(2);

   if(!(PINC&0X02)) 

   {

    if(mode==1)

        {

         set++;

         set%=3;

        }

        if(mode==2)

        {

         set++;

         set%=2;

        }

        while(!(PINC&0X02));

   }

}



if(!(PINC&0X04))

{

   delay_ms(2);

   if(!(PINC&0X04)) 

   {


    if(mode==1)

        {

         if(set==0)

         {

          hour++;

          hour%=24;

         }

         if(set==1)

         {

          min++;

          min%=60;

         } 

         if(set==2)

         {

          sec++;

          sec%=60;

         }  


        }

        if(mode==2)

        {

         if(set==0)

         {

          nz_hour++;

          nz_hour%=24;

         }

         if(set==1)

         {

          nz_min++;

          nz_min%=60;

         } 

        }

        while(!(PINC&0X04));

   }

  

}


//主函数

void main()

{/// 变量声明

   

char zz;  

  // 调用初始化哈数 

//port_init();

init_devices();

// 特定代码

   while(1)

   {

   

   

if(mode==0)  

{

   

    PORTD=~smg_zx[hour/10];  // 给5的字形编码  

    PORTB|=1<        delay_ms(2);

        PORTB&=0B00111111;//        

                

   

    PORTD=~smg_zx[hour%10];  // 给5的字形编码  

         PORTB|=1<         delay_ms(2);

     PORTB&=0B00111111;//

   

   

   

     PORTD=~smg_zx[min/10];  // 给5的字形编码  

     PORTC|=1<         delay_ms(2);

         PORTC&=0B00001111;//        

                

   

    PORTD=~smg_zx[min%10];  // 给5的字形编码  

        PORTC|=1<

         delay_ms(2);

    PORTC&=0B00001111;//

   

    PORTD=~smg_zx[sec/10];  // 给5的字形编码  

    PORTC|=1<        delay_ms(2);

        PORTC&=0B00001111;//        

                

   

     PORTD=~smg_zx[sec%10];  // 给5的字形编码  

         PORTC|=1<         delay_ms(2);

     PORTC&=0B00001111;//

}


else if(mode==1)  

{

   

    PORTD=~smg_zx[hour/10];  // 给5的字形编码  

    PORTB|=1<        delay_ms(2);

        PORTB&=0B00111111;//        

                

   

    PORTD=~smg_zx[hour%10];  // 给5的字形编码  

        if(set==0)  PORTD&=0x7f;//控制小数点亮

         PORTB|=1<         delay_ms(2);

     PORTB&=0B00111111;//

   

   

   

     PORTD=~smg_zx[min/10];  // 给5的字形编码  

     PORTC|=1<         delay_ms(2);

         PORTC&=0B00001111;//        

                

   

    PORTD=~smg_zx[min%10];  // 给5的字形编码  

         if(set==1)  PORTD&=0x7f;//控制小数点亮

        PORTC|=1<

         delay_ms(2);

    PORTC&=0B00001111;//

   

    PORTD=~smg_zx[sec/10];  // 给5的字形编码  

    PORTC|=1<        delay_ms(2);

        PORTC&=0B00001111;//        

                

   

     PORTD=~smg_zx[sec%10];  // 给5的字形编码  

         if(set==2)  PORTD&=0x7f;//控制小数点亮

         PORTC|=1<         delay_ms(2);

     PORTC&=0B00001111;//

}

else if(mode==2)

{


     PORTD=~smg_zx[nz_hour/10];  // 给5的字形编码  

    PORTB|=1<        delay_ms(2);

        PORTB&=0B00111111;//        

                

   

    PORTD=~smg_zx[nz_hour%10];  // 给5的字形编码  

        if(set==0)  PORTD&=0x7f;//控制小数点亮

         PORTB|=1<         delay_ms(2);

     PORTB&=0B00111111;//

   

   

   

     PORTD=~smg_zx[nz_min/10];  // 给5的字形编码  

     PORTC|=1<         delay_ms(2);

         PORTC&=0B00001111;//        

                

   

     PORTD=~smg_zx[nz_min%10];  // 给5的字形编码  

         if(set==1)  PORTD&=0x7f;//控制小数点亮

         PORTC|=1<         delay_ms(2);

     PORTC&=0B00001111;//

   


}



   if((hour==nz_hour)&&(min==nz_min))//闹钟

   {

    if(zz++>20)

        {

     PORTB^=1<         zz=0;

        }

   }

   else

   PORTB|=1<        

    

         key ();

        

        

    



   }

  }

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

   #pragma interrupt_handler timer0_ocf_isr:20

  void timer0_ocf_isr(void)

  {static int count=0;

   if(++count>=500)

   { count=0;

     sec++;

         if(sec>=60)

         {

         sec=0;

         min++;

          if(min>=60)

         {

         min=0;

         hour++;

         hour%=24;

         }

         }

   }

}



推荐阅读

史海拾趣

D+H Mechatronic AG公司的发展小趣事

随着公司业务的不断发展,D+H Mechatronic AG开始寻求与国际知名企业的合作。通过多次洽谈和协商,公司成功与一家德国的汽车制造巨头签订了战略合作协议。双方共同研发出了一款高度智能化的生产线,大大提高了汽车制造的效率和质量。这次国际合作不仅为D+H Mechatronic AG带来了可观的收益,也使其在国际市场上的影响力得到了显著提升。

General Dynamics SATCOM Technologies公司的发展小趣事

在电子行业的激烈竞争中,D+H Mechatronic AG公司凭借其在精密机械与电子技术结合领域的深厚积累,成功研发出一款具有划时代意义的智能机械臂。这款机械臂不仅具有高精度、高速度的运动性能,还能通过智能算法实现自主学习和优化操作路径。这一技术的突破为公司在工业自动化领域赢得了极高的声誉,也为其后续的市场拓展奠定了坚实的基础。

富捷(FOJAN)公司的发展小趣事

自成立以来,富捷电子始终将技术创新视为企业发展的核心驱动力。公司投入巨资建立了一支国际专业的晶片电阻核心技术研发团队,专注于贴片电阻、合金电阻、车规电阻等产品的研发与生产。近年来,富捷电子成功研发出高端抗静电汽车晶片电阻FQS系列产品,并建设了“高端抗静电汽车晶片电阻智能工厂”,实现了从原材料入库到成品出库的全程智能化、自动化操作。这一创新不仅提升了产品性能,还满足了汽车电子行业对元件高可靠性、高稳定性的严格要求,推动了公司在汽车电子领域的快速发展。

振宝佳(DMBJ)公司的发展小趣事

振宝佳(DMBJ)公司自成立之初,就专注于贴片铝电解电容的研发与生产。在1998年之前,公司一直在台湾深耕细作,积累了丰富的技术实力和市场资源。进入21世纪,随着电子产业的快速发展,振宝佳意识到技术突破的重要性。于是,公司投入大量资源,研发出多项专利技术,这些技术不仅提升了产品的性能,也增强了公司的市场竞争力。

Concurrent Logic公司的发展小趣事

在取得初步成功后,Concurrent Logic开始扩展其产品线。他们不仅开发了多款针对不同应用场景的并行处理芯片,还进军了与并行计算紧密相关的其他硬件领域,如高性能的服务器和存储设备。这些新产品的研发和上市,进一步增强了公司在市场上的竞争力。

Catalyst / ON Semiconductor公司的发展小趣事

在追求经济效益的同时,Catalyst / ON Semiconductor公司也高度重视可持续发展和社会责任。公司积极推行环保政策,减少生产过程中的污染排放;同时,公司还关注员工福利和社会公益事业,积极参与各种社会公益活动。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

这五个故事涵盖了Catalyst / ON Semiconductor公司从初创到发展壮大的不同阶段和方面,展现了公司在电子行业中的成长轨迹和贡献。虽然这些故事是基于假设和一般逻辑构建的,但它们旨在呈现一个企业在发展过程中可能遇到的挑战和机遇,以及企业如何应对这些挑战并抓住机遇。

问答坊 | AI 解惑

车载移动电视接收的系统方案

在柏林推出的DVB T(地面数字广播)数字电视也已经影响到汽车娱乐系统中的电视接收。现在,汽车电视接收机不仅能够接收模拟电视信号(它仍将在城市以外的地区继续存在数年),而且也能够接收和处理DVB T信号。Hirschmann Electronic ...…

查看全部问答>

S3C2410完全开发流程

这是一篇关于s3c2410的开发文档的资料,以及linux的一些实验…

查看全部问答>

无线收发模块汇总

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 :P :P :P :P :P :P :P :P :P :P :P 好东西与各位分享!  …

查看全部问答>

电子书---高频电路设计与制作

发一本高频电路设计与制作,日本人写的。感觉还不错。不过有点大,40M,分享啦…

查看全部问答>

单片机双电源切换

请问老师:+5V单片机双电源自动及手动切换用哪种芯片?谢谢!…

查看全部问答>

医用自动洗片机控制器的研制

  1 引 言   洗片机是各医院影像科的必需设备。医院影像科每天要冲洗大量的x-射线透射胶片,工作量大,且洗片操作有一定难度,对操作人员专业技术要求高,另外,洗片时化学药液对人体有伤害。因此,目前医院大多采用医用自动洗片机。进口的 ...…

查看全部问答>

WINCE 5.0 输入法如何实现,

我使用 ARM 2440开发板, 使用WINCE 5.0 (中文)OS, 现在想实验软键盘 汉字输入 和手写 输入。 请前辈们 描述一下实现 思路。 …

查看全部问答>

串口接收不定长字符串

void InitSio(void) {         u16 RELOAD_COUNT = 0;                 //使用独立波特率发生器作为波特率发生器     S2CON    =   0x50;  ...…

查看全部问答>

PB的编译问题

新装的WIN XP SP2, 番茄花园, 然后装PB5.0, 先装.net framework 1.1, 然后装PB5.0(CPU选择了ARMV4I, X86, Emulator). PB5.0 装好之后,就新建工程编译了,这时EVC, VS2005等都还没有装. 用自带的2410BSP新建工程编译的时候出现错误: \"Invalid  ...…

查看全部问答>

电脑拆卸后无法开机

我的电脑拆卸了一次再重新装上后就无法启动了,按电源后只显示品牌标志.…

查看全部问答>