第一篇:AVR单片机定时器TC0定时操作过程
定时器T/C0定时功能实现过程
一、中断总使能:SREG=0X80;
二、使能定时器溢出中断,TIMSK的TOIE0置1
三、选择定时器时钟分频系数,由TCCR0的CS01,CS01,CS00决定。
四、定时器计数器付初始值,TCNT0=61,TCNT0位8位寄存器,计数范围为0-255,付初始值61后,从61开始计数到255时产生溢出中断
付初值后定时就开始工作。
定时时间计算:每个计数时钟脉冲的时间T=1/f,f=晶振频率/分频系数,如晶振为8MHZ,分频系数为1024,则定时器器时钟
频率为f=8000000HZ/1024=7812.5HZ,单个时钟脉冲时间:T=1/f=1/7812.5=0.128ms(毫秒),T/C0最大的计数值 为256,最大计时时间为256*0.128ms=32.768ms。
定时器初值计算公式:定时器初值=256-定时时间/单个时钟脉冲时间: 如定时25ms,初值=256-25ms/0.128ms=256-195=61
注:1MHZ=1000KHZ=1000000HZ,1s(秒)=1000ms(毫秒)
/***************************************************************************************
函数功能:定时器T/C0实现1秒钟定时,控制发光二极管周期性亮灭,晶振8MHZ
***************************************************************************************/
#include
char Counter = 0;// 1S计数变量清零,变量声明
/********端口初始化********/
void port_init()//端口初始化子函数
{
PORTA=0xFF;//PA口配置为输出
DDRA=0xFF;//PA口初始值为“1”
}
/********定时器0初始化********/
void timer0_init()//因为定时时间太短,看不到灯的变化
{
SREG = 0x80;//使能全局中断
TIMSK|=(1< TCCR0|=(1< TCNT0 = 61;//定时初值设置,定时时间 =(256-61)/7812.5=25ms } /********主函数********/ void main() { port_init(); timer0_init(); while(1); } /********定时器0中断服务函数********/ #pragma interrupt_handler timer0_ovf:10 void timer0_ovf(void) { TCNT0 =61;//重装计数初值 if(++Counter >= 40)//定时时间到1S吗?定时中断溢出40次为1S,25ms*40=1000ms=1s(秒){ PORTA^=BIT(0);//,将PA口的第0位取反操作。 Counter = 0;//1S计时变量清零 } } 小企鹅diy科学探究学习网 更多相关文章转到: http://hi.baidu.com/wqb_lmkj/blog文章分类下的单片机 一、定时/计数器PWM设计要点 根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点: 1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。如输出PWM波用于控制灯的亮度,由于人眼不能分辨42Hz以上的频率,所以PWM的频率应高于42Hz,否则人眼会察觉到灯的闪烁。 2.然后根据需要PWM的频率范围确定ATmega128定时/计数器的PWM工作方式。AVR定时/计数器的PWM模式可以分成快速PWM和频率(相位)调整PWM两大类。 3.快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。此时计数器仅工作在单程正向计数方式,计数器的上限值决定PWM的频率,而比较匹配寄存器的值决定了占空比的大小。PWM频率的计算公式为: PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值)) 4.快速PWM模式适合要求输出PWM频率较高,但频率固定,占空比调节精度要求不高的应用。 5.频率(相位)调整PWM模式的占空比调节精度高,但输出频率比较低,因为此时计数器仅工作在双向计数方式。同样计数器的上限值决定了PWM的频率,比较匹配寄存器的值决定了占空比的大小。PWM频率的计算公式为: PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值)) 6.相位调整PWM模式适合要求输出PWM频率较低,但频率固定,占空比调节精度要求高的应用。当调整占空比时,PWM的相位也相应的跟着变化(Phase Correct)。 7.频率和相位调整PWM模式适合要求输出PWM频率较低,输出频率需要变化,占空比调节精度要求高的应用。此时应注意:不仅调整占空比时,PWM的相位会相应的跟着变化;而一但改变计数器上限值,即改变PWM的输出频率时,会使PWM的占空比和相位都相应的跟着变化(Phase And Frequency Correct)。 8.在PWM方式中,计数器的上限值有固定的0xFF(8位T/C);0xFF、0x1FF、0x3FF(16位T/C)。或由用户设定的0x0000-0xFFFF,设定值在16位T/C的ICP或OCRA寄存器中。而比较匹配寄存器的值与计数器上限值之比即为占空比。 二、PWM应用参考设计 下面给出一个设计示例,在示例中使用PWM方式来产生一个1KHz左右的正弦波,幅度为0-Vcc/2。 首先按照下面的公式建立一个正弦波样本表,样本表将一个正弦波周期分为128个点,每点按7位量化(127对应最高幅值Vcc/2): F(X)= 64 + 63 * Sin(2πx/180)X∈[0…127] 如果在一个正弦波周期中采用128个样点,那么对应1KHz的正弦波PWM的频率为 128KHz。实际上,按照采样频率至少为信号频率的2倍的取样定理来计算,PWM的频率的理论值为2KHz即可。考虑尽量提高PWM的输出精度,实际设计使用PWM的频率为16KHz,即一个正弦波周期(1KHz)中输出16个正弦波样本值。这意味着在128点的正弦波样本表中,每隔8点取出一点作为PWM的输出。 程序中使用ATmega128的8位T/C0,工作模式为相位调整PWM模式输出,系统时钟为8MHz,分频系数为1,其可以产生最高PWM频率为: 8000000Hz / 510 = 15686Hz。每16次输出构成一个周期正弦波,正弦波的频率为980.4Hz。PWM由OC0(PB4)引脚输出。参考程序如下(ICCAVR)。 //ICC-AVR Application Builder : 2004-08 // Target : M128 // Crystal: 8.0000Mhz #Include #Include #Pragma Data:code // 128点正弦波样本表 Const Unsigned Char Auc_SinParam[128] = { 64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,118,120,121,123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,124,123,121,120,118,117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,25,28,31,33,36,39,42,45,48,51,54,57,60};#Pragma Data:data Unsigned Char X_SW = 8,X_LUT = 0; #Pragma Interrupt_handler Timer0_ovf_isr:17 Void Timer0_ovf_isr(Void) { X_LUT += X_SW;// 新样点指针 If(X_LUT > 127)X_LUT-= 128;// 样点指针调整 OCR0 = Auc_SinParam[X_LUT];// 取样点指针到比较匹配寄存器 } Void Main(Void) { DDRB |= 0x10;// PB4(OC0)输出 TCCR0 = 0x71;// 相位调整PWM模式,分频系数=1,正向控制OC0 TIMSK = 0x01;// T/C0溢出中断允许 SEI();// 使能全局中断 While(1) {……}; } 每次计数器溢出中断的服务中取出一个正弦波的样点值到比较匹配寄存器中,用于调整下一个PWM的脉冲宽度,这样在PB4引脚上输出了按正弦波调制的PWM方波。当PB4的输出通过一个低通滤波器后,便得到一个980.4Hz的正弦波了。如要得到更精确的1KHz的正弦波,可使用定时/计数器T/C1,选择工作模式10,设置ICR1=250为计数器的上限值。 学avr单片机的建议 建议,(1)做工控首选PLC,实现简单安全可靠开发周期很短,不用很系统的学,买一本教材看看就行了,选型也别挑花眼,就选西门子,不用一下就想学会所有的功能,简单的起步,做项目的同时逐渐延伸。 (2)如果要学单片机,8位机就选avr,型号齐全,一个公司做的,资料统一,实现容易。编译器就用icc avr7.22(不用破解,没有bug),仿真软件就用avr studio4.17(免费下载,最新版式4.18,需要注册才能下载,我闲麻烦就用4.17),到的网站上免费下载。建议买两本书《avr单片机c语言开发入门指导》清华大学出版社的,还有就是《avr单片机嵌入式原理与应用实践》马潮、北航。两本书足以。第一本书主要介绍icc,其余的各种编译器也做了详细介绍,都是经典之作(他的icc版本很低,你用7.22的话有些程序定义部分需要改动,还好icc有自动生成代码框架的功能)。第二本书主要以cva编译器为背景,里面的编程思路是国产教材的经典(不用刻意学cva,主要看看编程思路)。- 到网上再下一个(10天学会avr单片机,叶大鹏老师讲的,以icc为背景),真的10天就可以学会.然后最重要的就是到淘宝上买一个avr单片机实验板100元左右的就不错。到此你的avr全套学习和实验系统就全了,很全别的东西都不需要了。 网络上有关于个各种编译器的好坏之争,我觉得icc就很好,所有编译器里最简单好用的。gcc avr也很好(winavr),到百度里搜winavr,到他的官网下个最新的。网络里有关于它的介绍总是很复杂(网络里的gcc avr学习的帖子过时了),其实科技进步了,他也进步了,你用一个winavr+avr studio,就可以构造一个正版的免费的有固定ide界面的(用的avr studio界面)编译系统和仿真系统.最新的gcc是20100110版的,他升级很快,每个版本编程时有地方会不同,你在老版本下通过,到新版本下不一定通过,所以需要固定一个版本使用,并且要认真看看gcc avr的帮助文件(都是英文的,建议打印出来仔细看,这很重要,关于教材上的定义中断的方式在2010下肯定不能用,所以需要看帮助里的中断定义方面的改动和其余的勘误说明)。我现在就用gcc做工程,暂时没有发现有问题。 avr的介绍就到这里,还有就是要仔细看看你所用avr芯片的手册,不管什么编译器,他的头文件里寄存器定义都和手册里的寄存器名相同的,这很重要,否则教材上介绍的mega16,当你换用mega128时就不会用了,达到触类旁通是我们的目标。到atmel网站里可以下载手册和相关的开发说明。编译器选择要么icc要么gcc,不要用iar和别的。以我的经验从零到做项目需要3个月时间。 单片机就是个控制器和工具,如果要做工程靠他还不够,你要经常看看电路系统构成和强电、弱电、测控、数据信号传输方面的综合知识,如果你要只停留在单片机方面就失败了。还要会画电路图(就用altium designer winter09).好了,祝你早日精通单片机。 哦,对了,科技进步今非昔比,如果要学一种芯片何不学一种再先进一点的呢,比如arm的。切记:选择一种芯片和编译器把它学会,不要为别人的说法所动摇。 基于AVR单片机Mega16的时钟设计报告 1摘 要 近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此越来越广泛地应用各个领域.本文的电子钟系统是以单片机(ATmega16)为核心,时钟芯片、数码管显示驱动芯片等元器件组成。具体介绍应用Proteus的ISIS软件进行单片机系统的电子钟设计与仿真的实现方法。该方法既能准确验证所设计的系统是否满足技术要求,又能提高系统设计的效率和质量,降低开发成本,具有推广价值。 关键词:单片机; 时钟芯片 ;数码管显示驱动芯片 ;电子钟 2引 言 单片机电子时钟系统可以用多种技术手段实现。本文借助于Proteus仿真系统进行系统虚拟开发成功之后再进行实际操作,可以节约开发时间,降低开发成本,具有很大的灵活性和可扩展性。在国外有包括斯坦福、剑桥等在内的几千家高校将Proteus作为电子工程学位的教学和实验平台;在国内也有众多大学正在体验Proteus的独一无二的功能并申报大学计划。该方法具有普遍意义。通过实际应用发现,采用该方法可以大大简化硬件电路测试和系统调试过程中电路板制作、元器件安装、焊接等过程。很明显,使用该方法可以提高开发效率、降低开发成本、提升开发… AVR系列的单片机不仅具有良好的集成性能,而且都具备在线编程接口,其中的系列还具备仿真和下载功能;含有片内看门狗电路、片内程序FLASH、同步串行接口SPI;多数AVR单片机还内嵌了A/D转换器、EEPROM、模拟比较器、PWM定时计数器等多种功能;AVR单片机的I/O接口具有很强的驱动能力,灌人电流可直接驱动继电器、LED等元件,从而省去驱动电路,节约系统成本。 3设计思路 利用单片机(ATmega16)制作简易电子时钟,由六个LED数码管分别显示小时十位、小时个位、分钟十位、分钟个位、秒钟十位、秒钟个位。6个PNP管分别控制六个数码管的亮灭,此外还可以实现时间调整、等多种实用功能。整个设计分硬件和软件两大部分。硬件部分采用MEGA16单片机作为可编程芯片,字符液晶作为信号显示;软件部分利用C语言作为设计语言,对MEGA16进行编程实现各种功能。 硬件设计电路分解为单片机、晶体振荡器和数码管3个部分,其结构简单,经济实惠。单片机内部晶体振荡器的外接电路。由两个电容和晶体振荡器构成,其电路如图1所示。图中X1和X2分别接MEGA16的两个脉冲控制端,使得MEGA16的内部脉冲电路为电子时钟和整个系统时钟提供脉冲。 图1所示给出了采用单片机外加电源及晶体振荡器构成最小单片机系统。配合单片机开发的设计、调试和下载,最终将时钟信息从端口输出到字符液晶显示。 图26位模式与单片机的端口相连。 4软件设计及调试过程 软件设计包括Proteus的ISIS软件、Code Vision AVR编辑软件和AVRStudio4调试。利用ISP将生成程序timer.cof 下载到目标板。其主要程序如下: void display(void)// 6 位LED 数码管动态扫描函数 { PORTC = 0xff; PORTA = led_7[dis_buff[posit]]; if(point_on &&(posit==2||posit==4))PORTA |= 0x80; PORTC = position[posit]; if(++posit >=6)posit = 0; } // Timer 0 比较匹配中断服务 interrupt [TIM0_COMP] void timer0_comp_isr(void) { display();// 调用LED 扫描显示 if(++time_counter>=100) { time_counter = 0; time_1s_ok = 1; } } void time_to_disbuffer(void)// 时钟时间送显示缓冲区函数 { char i,j=0; for(i=0;i<=2;i++) { dis_buff[j++] = time[i] % 10; dis_buff[j++] = time[i] / 10; } } // INT0 中断服务程序 interrupt [EXT_INT0] void ext_int0_isr(void) { if(++time[2]>=24)time[2] = 0; } // INT1 中断服务程序 interrupt [EXT_INT1] void ext_int1_isr(void) { if(++time[1]>=60)time[1]=0; } void main(void) { PORTA=0x00;// 显示控制I/O 端口初始化 DDRA=0xFF; PORTC=0x3F; DDRC=0x3F;// T/C0 初始化 PORTA=0xFF; DDRA=0xFF; GICR|=0xC0;// 允许INT0、INT1 中断 MCUCR=0x0A;// INT0、INT1 下降沿触发 GIFR=0xC0;// 清除INT0、INT1 中断标志位 TCCR0=0x0B;// 内部时钟,64 分频(4M/64=62.5KHz),CTC 模式 TCNT0=0x00; OCR0=0x7C;// OCR0 = 0x7C(124),(124+1)/62.5=2ms TIMSK=0x02;// 允许T/C0 比较匹配中断 time[2] = 14;time[1] = 01;time[0] = 55;// 设时间初值23:58:5 5posit = 0; time_to_disbuffer(); #asm(“sei”)// 开放全局中断 while(1) { if(time_1s_ok)// 1 秒到 { time_1s_ok = 0; point_on = ~point_on; if(++time[0] >= 60)// 以下时间调整 { time[0] = 0; if(++time[1] >= 60) { time[1] = 0; if(++time[2] >= 24)time[2] = 0; } } time_to_disbuffer();// 新调整好的时间送显示缓冲区 5总结心得 这次设计报告培养了学生综合运用所学知识,发现,提出,分析和解决问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。 回顾起此次单片机设计,我仍感慨颇多,的确,从选题到定稿,从理论到仿真,在这些日子里,我学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。 这次设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师那里我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢! }结束语 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。尤其是AVR单片机可以用高级语言编程,极容易地实现系统移植,并且加快了软件的开发过程。这次设计通过对它的学习、应用,以Mage16单片机为核心,辅以必要的电路,采用高级C语言编程,设汁了一个简易的电子时钟,由 4.5 V直流电源供电,通过数码管能够准确显示时间。 目录: 0、任务书...............................................................................2 1、系统总体设计方案规划与选定.......................................2 2、硬件设计...........................................................................5 3、软件设计...........................................................................6 4、调试...................................................................................8 5、新增功能及实现方法.......................................................8 6、小结与体会.......................................................................9 7、参考文献...........................................................................9 8、附录.................................................................................10 单片机课程设计 0.任务书 基于51单片机设计一个电子数字钟,显示时、分、秒,且具有闹钟功能。用8255接口实现4*8键盘及8位LED显示。 32个键:0~9共10个键,调时(设置当前时间)键;设定闹钟(定时)键;走时键;光标左右移动各一个键。 要求键复位后,应该最后面的LED上显示H(待命状态)。 1.系统总体设计方案规划与选定 1.1主控制芯片选择 方案一:采用ARM微处理,做主控芯片,计算速度快,缺点;成本高,控制较复杂,不容易焊接。 方案二:采用80C51单片机做主控制器,由单片机来完成采集和信号处理等底层的核心计算,做主控芯片,成本低,易控制,易实现。 经过以上两个方案比较,在此题方案二明显优于方案一,故采用80C51单片机做主控制器。 1.2定时模块选择 方案一:采用时钟芯片DS1302。 DS1302 可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录,且较单片机计时简单节约硬件资源,但存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。 方案二:采用单片机内部的定时系统,外接晶振进行分频脉冲计数。 单片机课程设计 此系统采用12MHz晶振。 由于方案二使用简单,比方案一更适用该系统设计,所以选择方案二。 1.3 LED显示及计时模块选择 方案一:74LS192计数器——74LS47七点显示译码器 74LS192芯片是一块可预置数可逆计数芯片,功能强大。将74LS192芯片CPU引脚接高电平可实现减法计数,以倒计时显示。可通过74LS47与LED共阳极数字显示器配合使用。 方案二:使用移位寄存器74HC595与译码器相连 74HC595具有8位移位寄存器和一个存储器,使用时可直接与数字显示器相连。 方案三:使用8255扩展LED显示计时模块 8255是一个可编程并行接口芯片,有一个控制口和三个8位数据口,外设通过数据口与单片机进行数据通信,各数据口的工作方式和数据传送方向是通过用户对控制口写控制字控制的。我们用到了A与B口分别进行对数码显示管的片选和段选,且B口同时作为键盘扫描模块的输入口,与数码显示模块分时复用。故采用方案三 1.4蜂鸣器的选择 方案一:电磁式蜂鸣器 电磁式蜂鸣器主要是利用通电导体会产生磁场的特性,用一个固定的永久磁铁与通电导体产生磁力推动固定在线圈上的鼓膜。电磁式由于音色好,所以多用于语音、音乐等设备。对于不同提示音且考虑实际,此种较好。 方案二:压电式蜂鸣器 单片机课程设计 压电式蜂鸣器用的是压电材料,即当受到外力导致压电材料发生形变时压电材料会产生电荷。同样,当通电时压电材料会发生形变。压电式结构简单耐用但音调单一音色差,适用于警报器等设备。 由于闹铃为音乐闹铃,所以使用电磁式蜂鸣器更为合适。 2.硬件设计 2.1 芯片的选择 2.1.1 单片机80C51 2.1.1.1单片机80C51的组成 80c51单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明: 中央处理器: 中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。 数据存储器(RAM)8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。 程序存储器(ROM): 8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。 单片机课程设计 定时/计数器(ROM): 8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。 并行输入输出(I/O)口: 8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。 2.1.1.2 MCS-51的引脚说明: MCS-52系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在我们对这些引脚的功能加以说明: MCS-51的引脚说明: MCS-52系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。 单片机课程设计 图1 80C51的引脚 2.1.1.3 MCS-51单片机内部定时器计数器、中断系统简介(1)定时器计数器 1、MCS-51系列中51子系列有两个16位的可编程定时计数器可:定时计数器T0和定时计数器T1。它由加法计数器、方式寄存器TMOD、控制寄存器TCON等组成。方式寄存器用于设定定时计数器T0和T1的工作方式,控制寄存器用于对定时计数器启动、停止进行控制。 2、每个定时计数器既可以对系统时钟计数实现定时,也可以外部信号计数实现计数功能通过编程设定来实现。 3、每个定时计数器都有多种工作方式,其中T0有四种工作方式,T1有三种工作方式,T2有三种工作方式。通过编程可设定工作于某种方式。四种工作方式为:13位定时计数器、16位定时计数器、8位自动重置定时 6 单片机课程设计 计数器、两个8位定时计数器(只有T0有) 4、每一个定时计数器定时计数时间到时产生溢出,使相应的溢出位置位,溢出可通过查询或中断方式处理。 (2)中断系统 1、MCS-51单片机提供5个硬件中断源,2个外部中断源,2个定时计数器T0和T1的溢出中断TF0和TF1,1个串行口发送TI和接收RI中断。 2、MCS-51单片机中没有专门的开中断和关中断指令,对各个中断源的允许和屏蔽是由内部的中断允许寄存器IE的各位来控制的。中断允许寄存器IE的字节地址为A8H,可以进行位寻址。系统复位时,中断允许寄存器IE的内容为00H,如果要开放某个中断源,则必须使IE中的总控置位和对应的中断允许位置“1”。 3、MCS-51单片机有5个中断源,为了处理方便,每个中断源有两级控制,高优先级和低优先级。通过由内部的中断优先级寄存器IP来设置,中断优先级寄存器IP的字节地址为B8H,可以进行位寻址。如果某位被置“1”,则对应的中断源被设为高优先级;如果某位被清零,则对应的中断源被设为低优先级。对于同级中断源,系统有默认的优先权顺序,从高到低优先权顺序为外部中断0、定时计数器T0中断、外部中断 1、定时计数器T1中断、串行口中断。通过设置中断优先级寄存器IP能够改变系统默认的优先级顺序。 4、MCS-51单片机响应中断的条件为:中断源有请求且中断允许。 2.1.2 八位一体七段数码管 单片机课程设计 数码管使用条件: a、段及小数点上加限流电阻。 b、使用电压:段:根据发光颜色决定; 小数点:根据发光颜色决定。c、使用电流:静态:总电流 80mA(每段 10mA);动态:平均电流 4-5mA 峰值电流 100mA 上图为七段数码管引脚图,其中共阳极数码管引脚图和共阴极相同。LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。右图是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。 将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将“b”和“c”段接上正电源,其它端接地或悬空,那么“b”和“c”段发光,此时,数码管显示将显示数字“1”。而将“a”、“b”、“d”、“e”和“g”段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它字符的显示原理类同。 单片机课程设计 2.1.3 并行接口扩展芯片8255 8255内部包括三个并行数据输入/输出端口,两个工作方式控制电路,一个读/写控制逻辑电路和8位总线缓冲器。 各部分功能概括如下:(1)端口A、B、C A口:是一个8位数据输出锁存器/缓冲器和一个8位数据输入锁存器。B口:是一个8位数据输入/输出锁存器/缓冲器和一个8位数据输入锁存器。C口:是一个8位数据输出锁存器/缓冲器和一个8位数据输入缓冲器(输入不锁存)。 通常A口、B口作为数据输入/输出端口。C口作为控制/状态信息端口,它在“方式控制字”的控制下可分为两个4位端口,每个端口有一个4位锁存器,分别与A口、B口配合使用,作为控制信号输出或状态信息输入端口。 (2)工作方式控制电路 工作方式控制电路有两个,一个是A组控制电路,另一个是B组控制电路。 单片机课程设计 这两组控制电路具有一个控制命令寄存器,用来接受中央处理器发来的控制字,以决定两组端口的工作方式,也可根据控制字的要求对C口按位清“0”或者按位置“1”。 A组控制电路用来控制A口和C口的上半部分(PC7-PC4)。B组控制电路用来控制B口和C口的下半部分(PC3-PC0)。 (3)总线数据缓冲器 总线数据缓冲器是一个三态双向8位缓冲器,作为8255与系统总线之间的接口,用来传送数据、指令、控制命令以及外部状态信息。 (4)读/写控制逻辑电路 读/写控制逻辑电路接受CPU发来的控制信号RD、WR、RESET、地址信号A1-A0等,然后根据控制信号的要求,将端口数据读出,发往CPU,或者将CPU送来的数据写入端口。 2.2 电路的组成 2.2.1 数码管显示电路 数码管显示器成本低,配置灵活,与单片机接口简单,在单片机应用系统中广泛应用。 数码管的工作原理如下: 数码管是由8个发光二极管构成的显示器件。在数码管中,若将二极管的阳极连在一起,称为共阳极数码管;若将二极管的阴极连在一起,称为共阴极数码管。本次课程设计用到的8个数码管均是共阳极的。当发光二极管导通时,它就会发光。每个二极管就是一个笔划,若干个二极管发光时,就 单片机课程设计 构成了一个显示字符。将单片机的I/O口控制相应的芯片与数码管的a-g相连,高电平的位对应的发光二极管亮,这样,由I/O口输出不同的代码,就可以控制数码管显示不同的字符。8个数码管均采用动态显示方式,显示当前的时间。 2.2.2 键盘扫描电路 键盘扫描电路图 键盘可分为两类:非编码键盘和编码键盘;常见的非编码键盘有两种结构:独立式键盘和矩阵式键盘。本次课程设计使用矩阵式键盘。 矩阵键盘的工作原理:按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。列线通过上拉电阻接到+5V 电源上。无按键按下时,列线处于高电平的状态,而当有按键按下时,列线电平与此列线相连的行线电平决定。 行列扫描法原理:第一步,使列线为编程的输入线,行线是输出线,拉低所有的行线,判断列线的变化,如果有按键按下,按键按下的对应列线被拉低,否则所有的列线都为高电平。第二步,在第一步判断有键按下后,延时10ms消除机械抖动,再次读取列值,如果此列线还处于低电平状态则进入下一步,否则返回第一步重新判断。第三步,开始扫描按键位置,采用 11 单片机课程设计 逐行扫描,分别拉低第一行,第二行,第三行,第四行,无论拉低哪一行其他三行都为高电平,读取列值找到按键的位置,分别把行值和列值储存在寄存器里。第四步,从寄存器中找到行值和列值并把其合并,得到按键值,对此按键值进行编码,与已经设定好的键码表进行一一对比,如果不等,则继续比较,如果相等,则利用转移指令实现键盘扫描到按键功能的转移。 2.2.3 音乐闹铃电路 蜂鸣器电路 2.2.3.1 蜂鸣器 蜂鸣器是一种一体化结构的电子讯响器,主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,他广泛应用于计算机、打印机、复印机、报警器、电话 12 单片机课程设计 机等电子产品中作发声器件。 2.2.3.2 单片机驱动 单片机上面使用的蜂鸣器一般都是无源电磁式的蜂鸣器(如下图所示)。它由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。 蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。 2.2.4 复位电路 RESET/Vpd为复位信号复用脚,当80C51通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,80C51的初始态。 上电复位:上电复位电路是—种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复 13 单片机课程设计 位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。 电路图如下: 上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。 3软件设计 4.调试 5.新增功能及实现方法 5.1定时器产生音乐的原理 音乐的产生主要是通过单片机的I/O口输出高低不同的脉冲信号来控制蜂鸣器发音。要想产生音频脉冲信号,需要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用单片机定时器计时这个半个周期时间,每当计时到后就将输出脉冲的I/O口反相,然后重复计时此半周期时间再对I/O口反相,这样就能在此I/O口上得到此频率的脉冲。 单片机课程设计 通常,利用单片机的内部定时器0,工作在方式1下,改变计数初值TH0和TL0来产生不同频率。 对于音乐的节拍,每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍。如果1拍为0.4S,1/4拍为0.1S,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,那么1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY,其余的节拍就是它的倍数。 总而言之,一首乐曲是由音阶和节拍两大要素构成。一首乐曲演奏的原理是:不同音阶分别对应不同的频率,发出不同的音调,而节拍则控制发出音调时间的长短;若将乐曲的音调连续发出,并使其按相应的节拍变化,即可演奏一首乐曲。根据这一特点,我们采用单片机辅以相应的接口来设计音乐播放器。 5.2实现方法 利用定时器产生音乐,添加了音乐闹钟功能,能在闹钟时间到来时蜂鸣器发出《祝你生日快乐》歌,但缺点是在响铃时间里,无法正常显示时间。在此次课程设计中,产生的音乐是利用查表法来改变定时器T1的初值,即改变音高,而通过延时来确定每个音符的长短,即确定音长。 6.小结与体会 7.参考文献 【1】《单片机原理、接口及应用——单片机嵌入式系统技术基础(第2版)》,肖看、李群芳,清华大学出版社 【2】《单片机原理及应用》,霍孟友,机械工程出版社 【3】《51系列单片机设计实例(第二版)》,楼然苗、李光飞,北京航 单片机课程设计 空航天大学出版社 8.附录 8.1 源程序代码ORG 0000H LJMP START ORG 000BH LJMP T0INT;T0中断服务程序 ORG 001BH LJMP TIM0 ;;;;;主程序;;;;;;;;START:LCALL CLEA START1:LCALL SCAN LCALL BELLSCAN LCALL KEYSCAN SJMP START1 CLEA:MOV R0,#70H MOV R7,#0EH CLEAR:MOV @R0,#00H INC R0 DJNZ R7,CLEAR;70H~7CH赋值0 MOV TMOD,#11H MOV TL0,#0B0H MOV TH0,#03CH SETB EA SETB ET0 SETB EX0 SETB TR0 CLR IT0 MOV 72H,#10 MOV 75H,#10 MOV 68H,#55H MOV 69H,#01H MOV 6AH,#00H CLR P1.0 RET ;延时子程序1MS DL1MS: MOV R6,#14H DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET DL10MS:ACALL SCAN ACALL SCAN ACALL SCAN RET ;《祝你生日快乐》音乐闹铃程序BELLSCAN:MOV A,6AH CJNE A,7AH,BELLOUT MOV A,69H CJNE A,79H,BELLOUT MOV A,68H CJNE A,78H,BELLOUT LCALL MUSIC BELLOUT:RET MUSIC: MOV IE,#8AH MOV 30H,#00H NEXT1:MOV A,30H MOV DPTR,#TABLE MOVC A,@A+DPTR MOV R2,A JZ END0 ANL A,#0FH MOV R5,A MOV A,R2 SWAP A ANL A,#0FH 单片机课程设计 JNZ SING CLR TR1 LJMP D1 SING:DEC A MOV 22H,A RL A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV TH1,A MOV 21H,A MOV A,22H RL A INC A MOVC A,@A+DPTR MOV TL1,A MOV 20H,A SETB TR1 D1:LCALL DELAY INC 30H LJMP NEXT1 END0:CLR TR1 LCALL BELLOUT TIM0:PUSH ACC PUSH PSW MOV TL1,20H MOV TH1,21H CPL P1.0 POP PSW POP ACC RETI DELAY:MOV R7,#02H D2:MOV R4,#187 D3:MOV R3,#248 DJNZ R3,$ DJNZ R4,D3 DJNZ R7,D2 DJNZ R5,DELAY RET TABLE1:DW 64260,64400,64521,64580 DW 64684,64777,64820,64898 DW 64968,65030,65058,65110 DW 65157,65178,65217 TABLE:;1 DB 82H,01H,81H,94H,84H DB 0B4H,0A4H,04H DB 82H,01H,81H,94H,84H DB 0C4H,0B4H,04H;2 DB 82H,01H,81H,0F4H,0D4H DB 0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H DB 0C4H,0B4H,04H DB 00H SCAN:;把记的数送给偏移量 MOV DPTR,#7FFFH MOV A,#80H MOVX @DPTR,A;写控制字,在显示程序中A口输出,B口输出 MOV A,78H;秒 MOV B,#0AH DIV AB MOV 71H,A MOV 70H,B MOV A,79H;分 MOV B,#0AH DIV AB MOV 74H,A MOV 73H,B MOV A,7AH;时 MOV B,#0AH DIV AB MOV 77H,A MOV 76H,B; 单片机课程设计 T0中断允许 ;循环扫描显示,数码管显示程序,数码管为共阳型 MOV R1,#70H MOV R5,#80H;位选 MOV R3,#08H SCAN1:MOV A,R5 MOV DPTR,#7FFCH MOVX @DPTR,A;送A口位选 MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#7FFDH MOVX @DPTR,A;送B口字形码 LCALL DL1MS INC R1;字形码偏移量 MOV A,R5 RR A;位选码 MOV R5,A DJNZ R3,SCAN1;8次 MOV DPTR,#7FFCH MOV A,#00H MOVX @DPTR,A;A口清位选 RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH;对应于“0”~“9”、“_” ;定时器T0中断服务程序 T0INT:PUSH ACC CLR ET0;停 CLR TR0;停T0工作 MOV TL0,#0B0H MOV TH0,#03CH SETB TR0;开T0工作 INC 7BH;7BH存放20 MOV A,7BH CJNE A,#14H,OUTT0;20 MOV 7BH,#00H INC 78H;78H秒 MOV A,78H CJNE A,#3CH,OUTT0;60 MOV 78H,#00H INC 79H ;79H分 MOV A,79H CJNE A,#3CH,OUTT0;60 MOV 79H,#00H INC 7AH ;7AH时 MOV A,7AH CJNE A,#18H,OUTT0;24 MOV 7AH,#00 OUTT0:SETB ET0;开T0中断允许 POP ACC RETI ;;;;;;键盘扫描子程序;;;;;;;; KEYSCAN:MOV DPTR,#7FFFH MOV A,#82H MOVX @DPTR,A;写控制字,此时A口输出,B口输入 MOV DPTR,#7FFEH MOV A,#00H MOVX @DPTR,A;C口写0 单片机课程设计 MOV DPTR,#7FFDH MOVX A,@DPTR MOV B,A ;B口输入 CJNE A,#0FFH,HAVE KEYOUT: RET HAVE: LCALL DL10MS1 MOVX A,@DPTR CJNE A,B,KEYOUT;延时一段时间再检测有键按下才开始扫描处理 INC DPTR MOV A,#0FEH MOV B,A MOVX @DPTR,A;C口输出行值 MOV DPTR,#7FFDH MOVX A,@DPTR;B口输入列值 CJNE A,#0FFH,KEYLIE0 MOV A,B RL A MOV B,A MOV DPTR,#7FFEH MOVX @DPTR,A;C口输出行值 MOV DPTR,#7FFDH MOVX A,@DPTR;B口输入列值 CJNE A,#0FFH,KEYLIE1 MOV A,B RL A MOV B,A MOV DPTR,#7FFEH MOVX @DPTR,A;C口输出行值 MOV DPTR,#7FFDH MOVX A,@DPTR;B口输入列值 CJNE A,#0FFH,KEYLIE2 MOV A,B RL A MOV DPTR,#7FFEH MOVX @DPTR,A;C口输出行值 MOV DPTR,#7FFDH MOVX A,@DPTR;B口输入列值 CJNE A,#0FFH,KEYLIE3 ACALL KEYOUT; KEYLIE0:MOV R2,#00H;R2 键码 行值,第1行八个数 LJMP KEYGET KEYLIE1:MOV R2,#08H;第2行,八个数 LJMP KEYGET KEYLIE2:MOV R2,#10H;第3行,八个数 LJMP KEYGET KEYLIE3:MOV R2,#18H;第4行,八个数 LJMP KEYGET KEYGET:MOV B,A ;B中存放B口读入的列值 MOV DPTR,#KEYTAB MOV A,#0 NEXT: PUSH ACC MOVC A,@A+DPTR CJNE A,B,AGAIN POP ACC;A是偏移值,即列值 ADD A,R2;A中存放键码 单片机课程设计 MOV B,A RL A ADD A,B;PC偏移量 MOV LJMP KEYFUN30 LJMP KEYFUN31 RET KEYTAB:DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH DPTR,#KEYFUNTAB JMP @A+DPTR AGAIN: POP ACC INC A CJNE A,#8,NEXT ACALL KEYOUT KEYFUNTAB: LJMP KEYFUN00 LJMP KEYFUN01 LJMP KEYFUN02 LJMP KEYFUN03 LJMP KEYFUN04 LJMP KEYFUN05 LJMP KEYFUN06 LJMP KEYFUN07 LJMP KEYFUN08 LJMP KEYFUN09 LJMP KEYFUN10 LJMP KEYFUN11 LJMP KEYFUN12 LJMP KEYFUN13 LJMP KEYFUN14 LJMP KEYFUN15 LJMP KEYFUN16 LJMP KEYFUN17 LJMP KEYFUN18 LJMP KEYFUN19 LJMP KEYFUN20 LJMP KEYFUN21 LJMP KEYFUN22 LJMP KEYFUN23 LJMP KEYFUN24 LJMP KEYFUN25 LJMP KEYFUN26 LJMP KEYFUN27 LJMP KEYFUN28 LJMP KEYFUN29 ;0 1 2 3 4 5 6 7 RET DL10MS1:MOV R4,#20 DL3: MOV R5,#7DH DL4: NOP NOP DJNZ R5,DL4 DJNZ R4,DL3 RET KEYFUN00:MOV @R0,#00H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN01:MOV @R0,#01H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN02:MOV @R0,#02H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN03:MOV @R0,#03H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN04:MOV @R0,#04H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN05:MOV @R0,#05H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN06:MOV @R0,#06H MOV A,7EH CJNE A,#0FFH,CALCU RET 单片机课程设计 KEYFUN07:MOV @R0,#07H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN08:MOV @R0,#08H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN09:MOV @R0,#09H MOV A,7EH CJNE A,#0FFH,CALCU RET CALCU: MOV A,71H MOV B,#0AH MUL AB ADD A,70H MOV 78H,A MOV A,74H MOV B,#0AH MUL AB ADD A,73H MOV 79H,A MOV A,77H MOV B,#0AH MUL AB ADD A,76H MOV 7AH,A RET KEYFUN10://调时键 CLR TR0 MOV R0,#77H;R0指向时的偏移量 MOV 7DH,#00H;闪烁标志位 LCALL FLASH RET FLASH:MOV A,@R0 MOV @R0,#0BH;R0(此时77H)指向熄灭的偏移量 MOV 7CH,#3DH;7CH单元存放循环次数 RE: LCALL OFFSCAN DJNZ 7CH,RE;调用OFFSCAN60次,半秒 MOV @R0,A;R0(此时77H)指向原来的偏移量 MOV 7CH,#3DH RE1: LCALL OFFSCAN DJNZ 7CH,RE1;调用OFFSCAN60次,半秒 LCALL KEYSCAN;键盘扫描 MOV A,7DH CJNE A,#0FFH,FLASH;判断闪烁标志位 RET OFFSCAN: PUSH ACC MOV R1,#70H MOV R5,#80H;位选 MOV R3,#08H OFFSCAN1:MOV DPTR,#7FFFH MOV A,#80H MOVX @DPTR,A;写控制字 MOV A,R5 MOV DPTR,#7FFCH MOVX @DPTR,A;A口输出位选 MOV A,@R1 MOV DPTR,#OFFTAB MOVC A,@A+DPTR MOV DPTR,#7FFDH MOVX @DPTR,A;B口输出字形码 LCALL DL1MS INC R1 ;R1指向下一个单元 MOV A,R5 RR A MOV R5,A;位选 DJNZ R3,OFFSCAN1;8次 单片机课程设计 MOV DPTR,#7FFCH MOV A,#00H MUL AB ADD A,73H MOV 69H,A MOVX @DPTR,A;A口位选清零 POP ACC RET OFFTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH,0FFH,89H RET //调时键按下 KEYFUN11:INC R0 RET KEYFUN12:DEC R0 RET KEYFUN13://走时键 MOV 7DH,#0FFH SETB TR0 RET KEYFUN14://闹铃键 MOV R0,#77H MOV 7EH,#0FFH;改变显示单元,不改变计数单元 MOV 7DH,#00H;开FLASH标志位 LCALL FLASH RET KEYFUN15://闹钟时间确认键,写入计数比较单元 MOV A,71H MOV B,#0AH MUL AB ADD A,70H MOV 68H,A MOV A,74H MOV B,#0AH MOV A,77H MOV B,#0AH MUL AB ADD A,76H MOV 6AH,A RET KEYFUN16:RET KEYFUN17:MOV 7DH,#00H MOV 70H,#0CH MOV 71H,#0BH MOV 72H,#0BH MOV 73H,#0BH MOV 74H,#0BH MOV 75H,#0BH MOV 76H,#0BH MOV 77H,#0BH;送熄灭符以及H符 MOV R0,#70H LCALL FLASH RET KEYFUN18:MOV 7DH,#0FFH;关闭闪烁 LCALL CLEA RET KEYFUN19:RET KEYFUN20:RET KEYFUN21:RET KEYFUN22:RET KEYFUN23:RET KEYFUN24:RET KEYFUN25:RET KEYFUN26:RET KEYFUN27:RET KEYFUN28:RET KEYFUN29:RET KEYFUN30:RET KEYFUN31:RET ACALL KEYOUT END 单片机课程设计 8.2电路图 总体电路图第二篇:AVR单片机定时器输出PWM的设计及注意问题
第三篇:学avr单片机的建议
第四篇:AVR单片机的时钟设计(范文)
第五篇:单片机课程设计音乐闹钟定时器