定时计数器实验电子音响 单片机报告.docx

上传人:小飞机 文档编号:3433756 上传时间:2023-03-13 格式:DOCX 页数:20 大小:42.54KB
返回 下载 相关 举报
定时计数器实验电子音响 单片机报告.docx_第1页
第1页 / 共20页
定时计数器实验电子音响 单片机报告.docx_第2页
第2页 / 共20页
定时计数器实验电子音响 单片机报告.docx_第3页
第3页 / 共20页
定时计数器实验电子音响 单片机报告.docx_第4页
第4页 / 共20页
定时计数器实验电子音响 单片机报告.docx_第5页
第5页 / 共20页
亲,该文档总共20页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《定时计数器实验电子音响 单片机报告.docx》由会员分享,可在线阅读,更多相关《定时计数器实验电子音响 单片机报告.docx(20页珍藏版)》请在三一办公上搜索。

1、定时计数器实验电子音响 单片机报告实验四 定时器实验 一、实验内容 1、由51内部定时器0,按方式1工作、即作为十六位定时器使用每0.l秒钟T1溢出中断一次。P1口的P1.0接1个发光二极管。要求编写程序模拟一时序控制装置。开机以中断方式循环点亮,闪烁维持1s。 2、数码时钟程序,调用定时器中断来处理。 3、编制程序,利用P3口输出不同频率的脉冲通过扬声器发出不同频率音调。 了解计算机发声原理,学习使计算机发出不同音调声音的编程方法。 二、实验目的 1、学习89C51内部计数器的使用和编程方法。 2、进一步掌握中断处理程序的编程方法。 三、实验原理 1、定时常数的确定 定时器/计数器的输入脉冲

2、周期与机器周期一样,为振荡器频率的1/l2。本实验中时钟频率为12MHZ,现要采用中断方法来实现1秒延时,要在定时器1中设置一个时间常数,使其每隔10MS产生一次中断,CPU响应中断后将R0中计数值减一,令(R0)100,即可实现1s延时。 时间常数可按下法确定: 机器周期12晶振频率1212106110-6S Nt/ Tcy 10103/110610000 需设初值为X,则(216-X)110-60.1 X65536-1000055536=D8F0H 化为十六进制:X3800H,故初始值为了TH0D8H,TL0F0H 2、初始化程序 包括定时器初始化和中断系统初始化,主要是对IP、IE、TC

3、ON、 TMOD的相应位进行正确的设置,并将时间常数送入定时器中、由于只有定时器中断,IP便不必设置。 如: MOV TMOD,#01H ;置T0工作于方式1 MOV TH0,#0D8H ;装入计数初值 MOV TL0,#0F0H SETB ET0 ;T0开中断 SETB EA ;CPU开中断 SETB TR0 ;启动T0 3、设计中断服务程序和主程序 中断服务程序要将时间常数重新送入定时器中,为下一次中断做准备。主程序则用来控制发光二极管按要求闪烁。 4、音阶由不同频率的方波产生,音的节拍由延时子程来实现。延时子程序实现基本延时时间,节拍值只能是它的整数倍。音阶与频率的关系如下表所示。 方波

4、的频率由定时器控制。定时器计数溢出后,产生中断,将P1.7口取反即得周期方波。每个音阶相应的定时器初值可按下 法计算: 晶振为6.144MHZ时,音阶“1”相应的定时器初值为x,则 12622(216-X)126.1441016 可得X64559DFC2FH,其它音节可同样求得,见下表: 音频调 4 5 6 7 1 2 3 4 率 175*2 196*2 220*2 247*2 262*2 294*2 330*2 349*2 FX 4 5 6 7 1 2 3 9 E6 7E 0C 2F 8F F8 23 A FA FB FC FC FC FC FD 392*2 440*/2 494*2 523

5、*2 587*2 659*2 F7D F3 BD FA FD FA 1E F8 4E FC 9E 4 四、实验电路及连线 P1.0接发光二极管L1。 五、参考程序 程序一、 ORG AJMP ORG AJMP ORG MOV MOV MOV 0000h main 000bh int_timer 0030h tmod,#01h ;设置定时器工作方式01 th0,#high(65536-10000) ; tl0,#low(65536-10000) ;设10MS初始值。 ie,#82h ;设置中断允许寄存器 main: MOV MOV MOV SETB AJMP 30h,#10 31h,#10 tr

6、0 $ ; ;30H和31H是两个软件计数器。 ;启动定时 ;等待中断 int_timer: 程序二、 /* MOV MOV DJNZ MOV DJNZ MOV ;定时器0中断服务程序。 th0,#high(65536-10000) ; tl0,#low(65536-10000) ;重设10MS定时。 30h,l1 31h,l1 ; ; ; ;软件计数 30h,#10 31h,#10 CPL p1.0 END ;10*10*10MS=1S时间到,P1.0取反 ;中断返回 l1: RETI 数码管精确时钟 */ #include sbit buz=P14; sbit led=P20; #defi

7、ne shuma P0 sbit 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

8、,0x88,0x83,0xc6,0x86,0x8e,0x82; /定时初值计算方法:以5ms为例,5ms=5000us,0xffff-5000/1.085即为TH和/共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F /包含头文件 TL的值 void int1 interrupt 3 时 void main( void ) unsigned int i; d=0; m=1; TMOD=0x10; TH1=0xed; TL1=0xff; TR1=1; ET1=1; EA=1; while(1) /开中断 /设置为T1定时器 /装定时器初值 n+; if(n=200)

9、 n=0; d+; /5ms的中断,循环200次,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); /显示分秒 /把时间拆分为分和秒 /开中断 unsigned char d1,d2,d3,d4; TR1=0; /关中断 /装定时器初值实现5ms定TH1=0xed; /T1中断,时间是5ms d加一次,所以d是1秒跳1次 程序三、秒计时器 #include #define shuma P0 口的定义 sbit LED_0=P20; sbit

10、LED_1=P21; /包含头文件 /对显示用数码管进行数据口和控制if(m=1) if(m=2) if(m=3) if(m=4) m+; if(m=5) m=1; /数码管位循环扫描 LED_3=0; LED_1=LED_2=LED_0=1; shuma=ad4; LED_2=0; LED_1=LED_0=LED_3=1; shuma=ad3; LED_1=0; LED_0=LED_2=LED_3=1; shuma=ad2; LED_0=0; /使能该数码管控制位 /其他控制位无效 LED_1=LED_2=LED_3=1; shuma=ad1; /中断专用的显示函数 void display

11、(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4) /按照数据点亮该数码管 sbit LED_2=P22; sbit LED_3=P23; unsigned char m,n; unsigned int d; /临时变量 /秒计时器 /数码管显示函数声明,利用中void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4); 断方式 /*=0-9=A-G=*/ unsigned char a16=0xc0,0

12、xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82; /定时初值计算方法:以5ms为例,5ms=5000us,0xffff-5000/1.085即为TH和TL的值 void int1 interrupt 3 次 n=0; d+; /每秒计数值加1 n+; if(n=200) /5毫秒程序,每200周期更新一unsigned char d1,d2,d3,d4; TR1=0; TL1=0xff; ET1=1; TR1=1; d4=(d%60)%10; d3=(d%60)/10; d2=(d/60)%1

13、0; d1=(d/60)/10; display(d1,d2,d3,d4); /数码管以中断方式显示 /分离秒计数值到千、百、十、/开中断 /关中断 /装定时器初值实现5ms定时 TH1=0xed; /T1中断,时间是5ms /共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F 各位方便数码管显示 void main( void ) 程序四、 /*时钟程序,本程序采用外元件DS1302时钟IC,使用此IC不增加系统资源,要时钟时直接去读取就可以了本IC跟ADC0831一样以串口方式传送数据,不同的是协议,只要你读懂它的串口协议,就可以用P口来模拟协议进行 ,这样更

14、能使你对传送数据协议的了解,在看本程序之前,先看看芯片的串口协议*/ /- /在学习本实验的时候,务必把J-LED的跳线帽,拔到OFF方向,关闭发光二极管 /- #include #include sbit SCL2=P13; ADC0831SCL脚 sbit SDA2=P14; ADC0831SDA脚 /sbit CS2=P16; /CS2定义为P2口的第6位脚,连接ADC0831CS脚 sbit RST = P25; / DS1302片选脚 /SDA2定义为P1口的第4位脚,连接DS1302SCL和/SCL2定义为P1口的第3位脚,连接DS1302SCL和d=0; m=1; TMOD=0x

15、10; TH1=0xed; TL1=0xff; TR1=1; ET1=1; EA=1; while(1) /开中断 /设置为T1定时器 /装定时器初值 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,

16、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_disp

17、lay(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); 秒 led

18、_display(l_tmpdisplay); case 0: case 2: case 4: case 6: case 8: case 10: l_tmpdisplay0=l_tmpdate1/16; l_tmpdisplay1=l_tmpdate1&0x0f; l_tmpdisplay2=l_tmpdate0/16; l_tmpdisplay3=l_tmpdate0&0x0f; break; /数据的转switch (l_tmpdate0/5) /设计每个5秒 交替显示 年月日 时分 Read_RTC; while(1) 换,因我们采用数码管09的显示,将数据分开 case 1: case

19、 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; break; default: /*- 功能:数码管显示子程序 -*/ void led_display(unsigned char *temp ) wei1=0; /点亮第一个数码管 P0 = tabletemp0; Delay_xuS(5); wei1=1; wei2

20、=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) /*- 功能100uS延时子程序 -*/ void Delay_xuS(unsigned int x) unsigned char i=10; while(i) i-; /空5个指令 unsigned int i,j; for( i

21、 =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_; _nop_; SCL2=0; RST=1; _nop_; /启动 Write_Ds1302_Byte(address); /发送地址 Write_Ds1302_Byte(dat); RST=0; /*/

22、unsigned char Read_Ds1302 ( unsigned char address ) /恢复 /发送数据 /右移一位 unsigned char i,temp=0x00; RST=0; _nop_; _nop_; _nop_; /循环8次 读取数据 SCL2=0; RST=1; 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

23、=read_rtc_address; /地址传递 for(i=0;i7;i+) l_tmpdatei=Read_Ds1302(*p); p+; /*/ void Set_RTC(void) unsigned char i,*p,tmp; /设定 日历 /分7次读取 年月日时分秒星期 /读取 日历 for(i=0;i7;i+) /传地址 /依次写入 秒时分,日月年,星期 tmp=l_tmpdatei/10; l_tmpdatei=l_tmpdatei%10; l_tmpdatei=l_tmpdatei+tmp*16; Write_Ds1302(0x8E,0X00); p=write_rtc_ad

24、dress; for(i=0;i7;i+) 程序五、音乐程序八月桂花香 ORG 0000H LJMP START ORG 000BH INC 20H ;中断服务,中断计数器加1 MOV TH0,#0DBH MOV TL0,#0FEH ;12M晶振,形成10毫秒中断 RETI CPL P3.4 MOV SP,#50H MOV TH0,#0DBH MOV TL0,#0FEH MOV TMOD,#01H MOV IE,#82H NOP MOV DPTR,#DAT ;表头地址送DPTR MOV 20H,#00H ;中断计数器清0 MOV B,#00H ;表序号清0 NOP CLR A Write_Ds

25、1302(0x8E,0x80); Write_Ds1302(*p,l_tmpdatei); p+; START: MUSIC0: MUSIC1: MOVC A,A+DPTR ;查表取代码 JZ END0 ;是00H,则结束 CJNE A,#0FFH,MUSIC5 LJMP MUSIC3 NOP MOV R6,A INC DPTR MOV A,B MOVC A,A+DPTR ;取节拍代码送R7 MOV R7,A SETB TR0 ;启动计数 NOP CPL P3.4 MOV A,R6 MOV R3,A LCALL DEL MOV A,R7 CJNE A,20H,MUSIC2 ;中断计数器(20H

26、)=R7否? ;不等,则继续循环 MOV 20H,#00H ;等于,则取下一代码 INC DPTR LJMP MUSIC1 NOP CLR TR0 ;休止100毫秒 MOV R2,#0DH NOP MOV R3,#0FFH LCALL DEL DJNZ R2,MUSIC4 INC DPTR LJMP MUSIC1 NOP MOV R2,#64H ;歌曲结束,延时1秒后继续 MUSIC5: MUSIC2: ; INC B MUSIC3: MUSIC4: END0: MUSIC6: MOV R3,#00H LCALL DEL DJNZ R2,MUSIC6 LJMP MUSIC0 NOP DEL:

27、DEL3: MOV R4,#02H DEL4: NOP DJNZ R4,DEL4 NOP DJNZ R3,DEL3 RET NOP DB 18H, 30H, 1CH, 10H DB 20H, 40H, 1CH, 10H DB 18H, 10H, 20H, 10H DB 1CH, 10H, 18H, 40H DB 1CH, 20H, 20H, 20H DB 1CH, 20H, 18H, 20H DB 20H, 80H, 0FFH, 20H DB 30H, 1CH, 10H, 18H DB 20H, 15H, 20H, 1CH DB 20H, 20H, 20H, 26H DB 40H, 20H ,

28、 20H, 2BH DB 20H, 26H, 20H, 20H DB 20H, 30H , 80H, 0FFH DB 20H, 20H, 1CH, 10H DB 18H, 10H, 20H, 20H DB 26H, 20H , 2BH , 20H DB 30H, 20H , 2BH , 40H DB 20H, 20H , 1CH , 10H DB 18H, 10H, 20H, 20H DB 26H, 20H , 2BH, 20H DB 30H, 20H, 2BH , 40H DB 20H, 30H, 1CH , 10H DB 18H, 20H , 15H , 20H DAT: DB 1CH,

29、20H , 20H , 20H DB 26H, 40H, 20H , 20H DB 2BH, 20H, 26H , 20H DB 20H, 20H, 30H , 80H DB 20H, 30H, 1CH , 10H DB 20H, 10H, 1CH , 10H DB 20H, 20H, 26H , 20H DB 2BH, 20H, 30H , 20H DB 2BH, 40H, 20H , 15H DB 1FH, 05H, 20H , 10H DB 1CH, 10H, 20H , 20H DB 26H, 20H, 2BH , 20H DB 30H, 20H, 2BH , 40H DB 20H, 30H, 1CH , 10H DB 18H, 20H , 15H , 20H DB 1CH, 20H , 20H , 20H DB 26H, 40H, 20H , 20H DB 2BH, 20H, 26H , 20H DB 20H, 20H, 30H, 30H DB 20H, 30H, 1CH, 10H DB 18H, 40H, 1CH, 20H DB 20H, 20H, 26H, 40H DB 13H, 60H, 18H , 20H DB 15H, 40H, 13H , 40H DB 18H, 80H, 00H END

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号