单片机实验7
来源:互联网 发布:气相色谱图数据怎么看 编辑:程序博客网 时间:2024/06/05 05:53
实验七 串行通信与电子音乐实验
一、实验目的
1、掌握串行口工作方式0的使用和用C51的编程方法;
2、掌握移位寄存器74HC164的工作原理;
3、掌握单片机驱动喇叭发声原理;
4、掌握定时计数器产生方波的编程方法;
二、实验设备与环境
硬件:DOFLY单片机实验仪;
软件:Keil uVision3开发环境。
三、实验内容
1、实验内容一
1.1、问题一:
使用74HC164的并行输出引脚接8支发光二极管,利用它的串入并出功能,把发光二极管从左向右轮流点亮,并反复循环。RXD(P3.0)接J11 A、B,TXD(P3.1)接J11 CLK,输出J12用8根杜邦线接发光二极管J9电路。原理图见图1:
1.2、问题一的代码:
#include <reg51.h>#include <intrins.h>sbit P1_0 = P1^0;void delay();void main(){ unsigned char i; SCON = 0x00; ES = 0; for (;;) { for (i = 0; i < 8;i++) { P1_0 = 0; SBUF = _cror_(0x80,i); while(!TI) {} P1_0 = 1; TI = 0; delay(); } }}void delay() { int y; for(y=300;y>0;y--);}
2、实验内容二
2.1、问题二:
用定时器T1方式1来产生歌谱中各音符对应频率的方波,由P1.1输出驱动喇叭。实现有外部中断0时演奏乐曲“小星星”一次,有外部中断1时演奏乐曲“新年好”一次。控制节拍可通过调用延时子程序次数来实现(考虑外部中断和定时计数器中断的优先级),ULN2003为电流放大芯片,驱动喇叭。
把乐谱中的音符和相应的节拍变换为定时常数和延时常数,作为数据表格数组tab存放在存储器中。每演奏一个音符调用定时常数和延时常数,分别用以控制定时器产生方波的频率和该频率方波的持续时间。当延时时间到,再调用下一个音符的定时常数和延时常数。依次下去,就可自动演奏出乐曲。
实验原理图见图2,流程图见图3:
2.2、问题二的代码:
#include <reg51.h>#include <intrins.h>void delay(int);code tab1[] = {0xFC,0x44,0x04,0xFC,0x44,0x04,0xFD,0x83,0x04,0xFD,0x83,0x04,0xFD,0xC8,0x04,0xFD,0xC8,0x04,0xFD,0x83,0x04,0x00,0x00,0x04,0xFD,0x34,0x04,0xFD,0x34,0x04,0xFD,0x09,0x04,0xFD,0x09,0x04,0xFC,0xAD,0x04,0xFC,0xAD,0x04,0xFC,0x44,0x04,0x00,0x00,0x04,0xFF,0xFF};code tab2[] = {0xFC,0x4A,0x04,0xFC,0x4A,0x04,0xFC,0x4A,0x08,0xFB,0x00,0x08,0xFD,0x08,0x04,0xFD,0x08,0x04,0xFD,0x08,0x08,0xFC,0x4A,0x08,0xFC,0x4A,0x04,0xFD,0x08,0x04,0xFD,0x80,0x08,0xFD,0x80,0x08,0xFD,0x30,0x04,0xFD,0x08,0x04,0xFC,0xAE,0x08,0x00,0x00,0x08,0xFF,0xFF};sbit P1_1 = P1^1;int H,L;void main(){ EA = 1; ET1 = 1; EX0 = 1; EX1 = 1; PT1 = 1; TCON = 0x05; TMOD = 0x10; P1_1 = 1; while(1) ;}void star() interrupt 0{ int t; int i; for (i = 0; i < 17;i++) { H = tab1[i*3]; L = tab1[i*3 + 1]; if (H == 0x00 && L == 0x00) TR1 = 0; else if (H == 0xFF && L == 0xFF) break ; else { TR1 = 1; TH1 = H; TL1 = L; } t = tab1[i * 3 + 2]; delay(t); }}void new() interrupt 2{ int t; int i; for (i = 0; i < 17;i++) { H = tab2[i*3]; L = tab2[i*3 + 1]; if (H == 0x00 && L == 0x00) TR1 = 0; else if (H == 0xFF && L == 0xFF) break ; else { TR1 = 1; TH1 = H; TL1 = L; } t = tab2[i * 3 + 2]; delay(t); }}void rec() interrupt 3{ P1_1 = !P1_1; TH1 = H; TL1 = L;}void delay(int n){ while (n--) { int i,j; for (i = 10; i > 0;i--) for(j = 625 ; j > 0;j--); }}
阅读全文
0 0
- 单片机实验7
- 【单片机】编码键盘实验
- 【单片机】LED实验
- 51单片机定时器实验
- 单片机串口通信实验
- 单片机时钟实验
- 单片机实验报告
- 单片机控制继电器实验
- 51 单片机串口实验
- 简单的单片机实验
- 单片机实验一
- 单片机第二次实验
- 单片机实验三
- 单片机实验4
- 单片机实验五
- 单片机实验六
- 单片机实验七
- 单片机实验八
- 集成开发环境VS 程序调试时逐语句与逐过程的区别
- 64位win10系统无法安装.Net framework3.5的两种解决方法
- 微服务治理之道
- Java之学习过错(三)
- Python笔记 NO.2
- 单片机实验7
- 如何阅读一篇论文
- 脚本之正则表达式
- properties文件
- 计算机发展的历史(整理中)
- PATest 练习解答
- 习题7(7.3)
- Mybatis介绍、安装、实现简单增删改查、实现基于动态代理增删改查、核心配置文件讲解 笔记
- html5 浏览器缓存 sessionStorage 之 LsySession.js插件的使用方法