实验四 定时计数器实验-电子音响.doc_第1页
实验四 定时计数器实验-电子音响.doc_第2页
实验四 定时计数器实验-电子音响.doc_第3页
实验四 定时计数器实验-电子音响.doc_第4页
实验四 定时计数器实验-电子音响.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验四 定时/计数器实验一、实验内容1、由51内部定时器0,按方式1工作、即作为十六位定时器使用每0.l秒钟T1溢出中断一次。P1口的P1.0接1个发光二极管。要求编写程序模拟一时序控制装置。开机以中断方式循环点亮,闪烁维持1s。2、数码时钟程序,调用定时器中断来处理。3、编制程序,利用P3口输出不同频率的脉冲通过扬声器发出不同频率音调。了解计算机发声原理,学习使计算机发出不同音调声音的编程方法。二、实验目的1、学习89C51内部计数器的使用和编程方法。2、进一步掌握中断处理程序的编程方法。三、实验原理1、定时常数的确定定时器/计数器的输入脉冲周期与机器周期一样,为振荡器频率的1/l2。本实验中时钟频率为12MHZ,现要采用中断方法来实现1秒延时,要在定时器1中设置一个时间常数,使其每隔10MS产生一次中断,CPU响应中断后将R0中计数值减一,令(R0)100,即可实现1s延时。时间常数可按下法确定:机器周期12晶振频率1212106110-6SNt/ Tcy 10103/110610000需设初值为X,则(216-X)110-60.1 X65536-1000055536=D8F0H化为十六进制:X3800H,故初始值为了TH0D8H,TL0F0H2、初始化程序包括定时器初始化和中断系统初始化,主要是对IP、IE、TCON、 TMOD的相应位进行正确的设置,并将时间常数送入定时器中、由于只有定时器中断,IP便不必设置。 如: MOV TMOD,#01H ;置T0工作于方式1 MOV TH0,#0D8H ;装入计数初值 MOV TL0,#0F0H SETB ET0 ;T0开中断 SETB EA ;CPU开中断 SETB TR0 ;启动T03、设计中断服务程序和主程序中断服务程序要将时间常数重新送入定时器中,为下一次中断做准备。主程序则用来控制发光二极管按要求闪烁。4、音阶由不同频率的方波产生,音的节拍由延时子程来实现。延时子程序实现基本延时时间,节拍值只能是它的整数倍。音阶与频率的关系如下表所示。方波的频率由定时器控制。定时器计数溢出后,产生中断,将P1.7口取反即得周期方波。每个音阶相应的定时器初值可按下 法计算:晶振为6.144MHZ时,音阶“1”相应的定时器初值为x,则 12622(216-X)126.1441016可得X64559DFC2FH,其它音节可同样求得,见下表:(单位:HZ,X为16进制)音调45671234频率175*2196*2220*2247*2262*2294*2330*2349*2XFAFAFBFCFCFCFCFD49E67E0C2F8FF823567123392*2440*/2494*2523*2587*2659*2FDFDFDFEFEFE73BAFA184C94四、实验电路及连线P1.0接发光二极管L1。(其他电路参考学习板说明书蜂鸣器与时钟部分)五、参考程序程序一、ORG0000hAJMPmainORG000bhAJMPint_timerORG0030hmain:MOVtmod,#01h;设置定时器工作方式01MOVth0,#high(65536-10000);MOVtl0,#low(65536-10000);设10MS初始值。MOVie,#82h;设置中断允许寄存器MOV30h,#10;MOV31h,#10;30H和31H是两个软件计数器。SETBtr0;启动定时AJMP$;等待中断int_timer:;定时器0中断服务程序。MOVth0,#high(65536-10000);MOVtl0,#low(65536-10000);重设10MS定时。DJNZ30h,l1;MOV30h,#10;DJNZ31h,l1;MOV31h,#10;软件计数CPL p1.0;10*10*10MS=1S时间到,P1.0取反l1:RETI;中断返回END程序二、/*数码管精确时钟*/#include /包含头文件sbit buz=P14;sbit led=P20;#define shuma P0sbit LED_0=P20;sbit LED_1=P21;sbit LED_2=P22;sbit LED_3=P23;unsigned char m,n;unsigned int d;unsigned int code ton7;void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);/*=0-9=A-G=*/unsigned char a16=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82; /共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F /定时初值计算方法:以5ms为例,5ms=5000us,0xffff-5000/1.085即为TH和TL的值void int1() interrupt 3 /T1中断,时间是5msunsigned char d1,d2,d3,d4;TR1=0; /关中断TH1=0xed; /装定时器初值实现5ms定时TL1=0xff;ET1=1; /开中断TR1=1;d4=(d%60)%10;/把时间拆分为分和秒d3=(d%60)/10;d2=(d/60)%10;d1=(d/60)/10;display(d1,d2,d3,d4);/显示分秒n+;if(n=200)/5ms的中断,循环200次,d加一次,所以d是1秒跳1次n=0;d+;void main( void )unsigned int i;d=0;m=1;TMOD=0x10; /设置为T1定时器TH1=0xed; /装定时器初值TL1=0xff;TR1=1; /开中断ET1=1;EA=1;while(1)/中断专用的显示函数void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4)if(m=1)LED_0=0;/使能该数码管控制位LED_1=LED_2=LED_3=1;/其他控制位无效shuma=ad1;/按照数据点亮该数码管if(m=2)LED_1=0;LED_0=LED_2=LED_3=1;shuma=ad2;if(m=3)LED_2=0;LED_1=LED_0=LED_3=1;shuma=ad3;if(m=4)LED_3=0;LED_1=LED_2=LED_0=1;shuma=ad4;m+;/数码管位循环扫描if(m=5)m=1;程序三、/*时钟程序,本程序采用外元件DS1302时钟IC,使用此IC不增加系统资源,要时钟时直接去读取就可以了本IC跟ADC0831一样以串口方式传送数据,不同的是协议,只要你读懂它的串口协议,就可以用P口来模拟协议进行,这样更能使你对传送数据协议的了解,在看本程序之前,先看看芯片的串口协议*/-/在学习本实验的时候,务必把J-LED的跳线帽,拔到OFF方向,关闭发光二极管/-#include #include sbit SCL2=P13;/SCL2定义为P1口的第3位脚,连接DS1302SCL和ADC0831SCL脚sbit SDA2=P14;/SDA2定义为P1口的第4位脚,连接DS1302SCL和ADC0831SDA脚/sbit CS2=P16;/CS2定义为P2口的第6位脚,连接ADC0831CS脚sbit RST = P25; / DS1302片选脚sbit wei1=P20;sbit wei2=P21;sbit wei3=P22;sbit wei4=P23;unsigned char code table=0xC0,0xF9,0xA4,0xB0, 0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0x8E;/共阳数码管码表/变量定义-unsigned char l_tmpdate8=0x00,0x00,0x0c,0x0d,0x04,0x09,0x01,0; /预设数据,秒分时,日月年,星期unsigned char l_tmpdisplay4=0,0,0,0;code unsigned char write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; code unsigned char read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d;/函数声明-void delay();/延时子函数,5个空指令void Delay_xuS(unsigned int x);void led_display(unsigned char *temp );void Write_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);/read RTC void Set_RTC(void);/set RTC void main(void) /入口函数 Set_RTC(); /设定时间 Delay_xuS(5);while(1)Read_RTC();switch (l_tmpdate0/5) /设计每个5秒 交替显示 年月日 时分秒case 0:case 2:case 4:case 6:case 8:case 10:l_tmpdisplay0=l_tmpdate1/16;/数据的转换,因我们采用数码管09的显示,将数据分开l_tmpdisplay1=l_tmpdate1&0x0f;l_tmpdisplay2=l_tmpdate0/16;l_tmpdisplay3=l_tmpdate0&0x0f;break;case 1:case 3:case 5:case 7:case 9:case 11:l_tmpdisplay0=l_tmpdate4/16;l_tmpdisplay1=l_tmpdate4&0x0f;l_tmpdisplay2=l_tmpdate3/16;l_tmpdisplay3=l_tmpdate3&0x0f;break;default:break;led_display(l_tmpdisplay);/*-功能:数码管显示子程序-*/void led_display(unsigned char *temp ) wei1=0; /点亮第一个数码管 P0 = tabletemp0; Delay_xuS(5); wei1=1;wei2=0; /点亮第二个数码管 P0 = tabletemp1; Delay_xuS(5); wei2=1;wei3=0; /点亮第三个数码管 P0 = tabletemp2; Delay_xuS(5); wei3=1;wei4=0; /点亮第四个数码管 P0 = tabletemp3; Delay_xuS(5); wei4=1;void delay(void)/空5个指令unsigned char i=10;while(i)i-;/*-功能100uS延时子程序-*/void Delay_xuS(unsigned int x) unsigned int i,j; for( i =0;i x;i+ ) for( j =0;j50;j+ ); /*/void Write_Ds1302_Byte(unsigned char temp) unsigned char i; for (i=0;i=1; /右移一位 SCL2=1; /*/void Write_Ds1302( unsigned char address,unsigned char dat ) RST=0;_nop_(); SCL2=0;_nop_(); RST=1; _nop_(); /启动 Write_Ds1302_Byte(address);/发送地址 Write_Ds1302_Byte(dat);/发送数据 RST=0; /恢复/*/unsigned char Read_Ds1302 ( unsigned char address ) unsigned char i,temp=0x00; RST=0;_nop_(); SCL2=0;_nop_(); RST=1;_nop_(); Write_Ds1302_Byte(address); for (i=0;i=1;/右移一位 RST=0;_nop_();SCL2=1;SDA2=0;return (temp);/返回/*/void Read_RTC(void)/读取 日历 unsigned char i,*p; p=read_rtc_address; /地址传递 for(i=0;i7;i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论