您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > AVR单片机作业——实时时钟的设计
全院选修课程AVR单片机嵌入式系统入门作业题目带校时和音乐报时功能实时时钟的设计学生姓名专业班级学号院(系)硬件原理图:Atmega16单片机结构与特点ATMEL公司的AVR单片机是一种基于增强RISC结构的、低功耗、CMOS技术、8位微控制器(EnhancedRISCMicrocontroller),目前有Tiny、Mega两个系列50多种型号。它们的功能和外部的引脚各有不同,小到8-12个引脚,多到100个引脚,但它们内核的基本结构是一样的,指令系统相容。尽管AVR单片机系列有几十种的型号,但它们有着相同的内核结构,指令兼容。ATmega16单片机的Flash程序存储器空间可以分成两段:引导程序段(Bootprogramsection)和应用程序段(Applicationprogramsection)。两个段的读写保护可以分别通过设置对应的锁定位(Lockbits)来实现。在引导程序段内驻留的引导程序中,可以使用SPM指令,实现对应用程序段的写操作(实现在应用自编程IAP功能,使系统能够自己更新系统程序)。在AVR中,所有的存储器空间都是线性的。数据存储器(SRAM)可以通过5种不同的寻址方式进行访问。AVR的中断控制由I/O寄存器空间的中断控制寄存器和状态寄存器中的全局中断允许位组成。每个中断都分别对应一个中断向量(中断入口地址)。所有的中断向量构成了中断向量表,该中断向量表位于Flash程序存储器空间的最前面。中断的中断向量地址越小,其中断的优先级越高。ATmega16有如下特点:16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512字节EEPROM,1K字节SRAM,32个通用I/O口线,32个通用工作寄存器,用于边界扫描的JTAG接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP封装)的ADC,具有片内振荡器的可编程看门狗定时器,一个SPI串行端口,以及六个可以通过软件进行选择的省电模式。ATmega16单片机有三种形式的封装:40脚双列直插PDIP、44脚方形的TQFP和MLF形式(贴片形式)。其外部引脚封装如图所示。数码管的原理数码管按段数分为七段数码[9]管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。7段LED数码管显示原理7段LED数码管,在一定形状的绝缘材料上,利用单只LED组合排列成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-9的数字。LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。右图是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将b和c段接上正电源,其它端接地或悬空,那么b和c段发光,此时,数码管显示将显示数字“1”。而将a、b、d、e和g段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它字符的显示原理类同原理电路:原理电路如图1所示,PA口为LED数码管的8段码输出,PC0-PC5共6个I/O口,作为控制时间显示的6个LED数码管的位扫描线。PC6、PC7分别接连接两个按键,用于设置时钟的工作状态和校时时间的设置。图1带校时功能的实时时钟电路图图中音乐报时电路部分如图2,由端口PD5输出产生音乐的脉冲信号,经三极管驱动蜂鸣器发声。PD5为ATmega16的T/C1匹配输出脚OC1A。编写程序在该脚上输出脉冲波,输出经三极管放大驱动蜂鸣器发声。图中的发声部分位于AVR-51多功能实验板的M区。BZ为一个无源蜂鸣器,作为发声器件(有源蜂鸣器的发声频率固定,不能使用),I/O口的脉冲输出经三极管放大驱动蜂鸣器发声)。,图2采用T/C0的PWM功能产生正弦波定义两个按键的功能为:K1用于设置转换时钟工作状态,K2用于设置校时时间(加1操作)。时钟工作状态转换图如图3所示,具体每个状态的定义和功能如下:平时时钟工作在时钟显示状态,每按一下K1键,时钟依次进入校时时间的设置状态。时钟由“时钟显示”进入“秒低位设置”时,校时时间的初始值为转换时刻的时钟值。时钟由“时高位设置”回到(K1作用下)“时钟显示”时,时钟时间由校时时间代替,确认完成校时的设置。当时钟处在时间设置的6个状态时,每按一次K2键,相应的位上的数值加1,并且要能根据具体所在的位置自动做相应的调整。如秒高位的数字只能在0-5之间,而时高位的数值要限制在0、1、2(时个位数小于3时),或时高位的数值要限制在0、1(时个位数大于3时)。当时钟处在时间设置的6个状态时,在20秒内无任何键按下,系统自动返回“时间显示”状态,设置的时间无效,不改变原时钟的计时时间。在效时时间设置的操作过程中,时钟不停止其前时间的计时过程,除非当时钟由“时高位设置”回到(K1作用下)“时钟显示”时,时钟的计时时间由确认的校时时间代替而改变。时钟显示亮度均匀、无闪烁。当设置相应时间位时,该位应闪烁提示。图3时钟工作状态转换图单片机编程代码:/*********************************************Filename:demo_11_4.cChiptype:ATmega16Programtype:ApplicationClockfrequency:1.000000MHzMemorymodel:SmallExternalSRAMsize:0DataStacksize:256*********************************************/#includemega16.hflashcharled_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};flashcharposition[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};flashunsignedintt[9]={0,956,865,759,716,638,568,506,470};flashunsignedchard[9]={0,105,116,132,140,157,176,198,209};#defineMax_note32flashunsignedcharmusic[Max_note]=K1K1K1K1K1K1K1时钟显示秒低位设置秒高位设置分低位设置分高位设置时低位设置时高位设置超时{5,2,8,2,5,2,4,2,3,2,2,2,1,4,1,2,1,2,2,2,3,2,3,2,1,2,3,2,4,2,5,8};unsignedcharnote_n;unsignedintint_n;bitplay_on;chartime[3],time_set[3];//时、分、秒计数和设置单元chardis_buff[6];//显示缓冲区,存放要显示的6个字符的段码值chartime_counter,key_stime_counter;//时间计数单元,charclock_state=6,return_time;bitpoint_on,set_on,time_1s_ok,key_stime_ok;voiddisplay(void)//6位LED数管动态扫描函数{staticcharposit=0;PORTC=0xff;PORTA=led_7[dis_buff[posit]];if(set_on&&(posit==clock_state))PORTA=0x00;//校时闪烁if(point_on&&(posit==2||posit==4))PORTA|=0x80;//秒闪烁PORTC=position[posit];if(++posit=6)posit=0;}//Timer0比较匹配中断服务,2ms定时interrupt[TIM0_COMP]voidtimer0_comp_isr(void){display();//LED扫描显示if(++key_stime_counter=5){key_stime_counter=0;key_stime_ok=1;//10ms到if(!(++time_counter%25))set_on=!set_on;//设置校时闪烁标志if(time_counter=100){time_counter=0;time_1s_ok=1;//1s到}}}//T/C1比较匹配A中断服务interrupt[TIM1_COMPA]voidtimer1_compa_isr(void){if(!play_on){note_n=0;int_n=1;play_on=1;}else{if(--int_n==0){TCCR1B=0x08;if(note_nMax_note){OCR1A=t[music[note_n]];int_n=d[music[note_n]];note_n++;int_n=int_n*music[note_n];note_n++;TCCR1B=0x09;}elseplay_on=0;}}}voidtime_to_disbuffer(char*time)//时钟时间送显示缓冲区函数{chari,j=0;for(i=0;i=2;i++){dis_buff[j++]=time[i]%10;dis_buff[j++]=time[i]/10;}}#definekey_inputPINC//按键输入口#definekey_mask0b11000000//按键输入屏蔽码#definekey_no0#definekey_k11#definekey_k22#definekey_state_00#definekey_state_11#definekey_state_22charread_key(void){staticcharkey_state=0,key_press;charkey_return=key_no;key_press=key_input&key_mask;//读按键I/O电平switch(key_state){casekey_state_0://按键初始态if(key_press!=key_mask)key_state=key_state_1;break;//键被按下,状态转换到键确认态casekey_state_1://按键确认态if(key_press==(key_input&key_mask)){if(key_press==0b01000000)key_return=key_k1;elseif(key_press==0b10000000)key_return=key_k2;key_state=key_state_2;//状态转换到键释放态}elsekey_state=key_state_0;//按键已抬起,转换到按键初始态break;casekey_state_2:if(key_press==ke
本文标题:AVR单片机作业——实时时钟的设计
链接地址:https://www.777doc.com/doc-7307929 .html