单片机c语言总结..doc_第1页
单片机c语言总结..doc_第2页
单片机c语言总结..doc_第3页
单片机c语言总结..doc_第4页
单片机c语言总结..doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

.入门有针对性的解决一些简单的实际问题,边理论边实践学一样会一样基本实验:流水灯,数码管显示,键盘控制,音乐播放,继电器控制通信实验,串口通信实验,红外线遥控信号解码实验等单片机的定义分类和内部组成1单片机就是中央处理器CPU,随机存储器RAM。只读存储器ROM。定时、计数器和各种输入输出接口I/o接口电路等部件集成在一块电路芯片上的微型计算机。2,1分类按制造工艺分:HMOS和CHMOS CHMOS包括80c51等中间加了C功耗要小适合便携式手提式和野外作业。2分类按不同容量的存储器配置分:51子系列和52子系列51表示单片机最后一位数字为1作为标志。片内带有4KbROM或EPROM(Erasable Programmable ROM,可擦除可编程ROM,128BRAM,两个16位定时器/计数器和5个中段器52系列是增强型各项指标都高。AT89S51是AT89C51的升级版支持ISP在线更新程序ISP(Internet Service Provider内部集成看门狗计时器等。3.1串行接口就是接口数据传送3.2中断控制系统接收中断请求如定时时间到,需要鸣笛报警类似stop to do 停下来去执行ROM中特定的每段程序,执行完后再继续执行先前中断的程序时钟电路控制节拍工作。一个典型的单片机应用系统包括输入电路,单片机,输出电路把他想象成电脑。单片机的应用:十六进制记和点得点不是十六进制加逻辑数据的运算逻辑与。两个输入一个输出中间加一个恒定电压有为,全出逻辑或有为,全出;字长通常与计算机内部的寄存器和运算器数据总线的宽度一致实例1功能感受protues仿真单片机播放渴望主题曲运用protues打开仿真原理图。对单片机进行处理编辑edit component,选取目标文件hexClock frequency 时钟频率Ok原理图编辑窗口没有滚动条,可通过预览窗口该表原理图的可视范围。Protues双击右键删除先单击鼠标右键,可通过鼠标左键可以编辑元器件的属性鼠标右键来删除画错的连线中键缩放原理图新建即保存新建设计文件Junction dot mode连接点 Subcircuit mode 子电路 lab用总线时会用到Terminals mode 终端接口,有VCC地输出输入等接口Device pins mode 器件引脚用于绘制各种引脚。Graph mode 仿真图表,用于各种分析,如noise analysisTape recorder mode录音机Generator mode 信号发生器Voltage probe mode 电压探针仿真图表用Current probe mode 电流探针仿真图表用Virtual instruments mode虚拟仪表有示波器可显示工作波形Resistors 电阻Capacitors电容Crystal晶振Radianl electrolytic圆柱形电解电容Keywords输入resistors 470r或功率先选择元器件后放元器件Led+yellowDrag object 拖动对象Editi properties 编辑属性Rotate clockwise 顺时针旋转90Rotate anti-clockwise 逆时针旋转90X-mirror 水平翻转Y-mirror 垂直翻转删可以右键双击双击鼠标左键编辑label放置电源和地必须编辑正确的label如VCC地GND各元器件引脚通过总线的连接并不表示真正意义上的电气连接,需要添加网络标号。要运行双击单片机基本电源5V振荡电路:单片机是一种时序电路,必须施加脉冲信号才能工作。在它的内部有一个时钟产生电路,只要接上两个电容和一个晶振即可正常工作。P30复位电路;启动后让单片机从初始状态开始执行程序。EA一横:接正电源端,表示使用内部程序存储器。注意:观察仿真效果时,晶振电路,复位电路和EA引脚和电路的连接可以省略。Keil软件源程序后缀。C必须手工输入,表示为c语言程序,让keilc51采用对应的c语言的方式来编译源程序。#include包含51单片机寄存器定义的头文件将新建的源程序文件加载到项目管理器右击source group文件add c文件单片机不能处理c,必须将c转换成二进制或十六进制代码,汇编或编译。用鼠标右键点击target 进入options for target 确认output选项中create hex重新构造所有目标程序烧录器及烧录软件的使用单片机软硬件系统仿真成功后,要真正投入实际应用,必须将程序烧写入单片机芯片,A51程序烧录器和先将COM接口(用作数据通信)与计算机的COM接口(RS-232)连接好,然后将单片机安插在烧录器的插座中,再用一根USB线将USB接口与计算机的USB接口连接,让计算机通过这根USB线向烧录器提供+5V电源使用烧录器前,手动设置一些,参数标签页,根据COM口,设置好串口,波特率设置为28800;点击自动擦除器件命令,点击打开文件命令选择单片机文件十六进制文件hex 再点击打开点击自动写器件。实例4用单片机控制一个灯闪烁Led灯亮存在电压差和正向偏置延迟函数Void main(void)/ 两个void分别表示无须返回值和没有参数传递 Unsigned int i;/ 定义无符号整数,最大65535 For(i=0;i20000;i+) ; 只有一个分号表示什么都不做,等待一个机器周期 0x中的0是数字0,而不是字母O郁闷一编写keil时,文档第一行必须是#include虚拟仪表示波器oscilloscopeProtues示波器面板?及使用单片机需要一个时钟信号送给内部个电路,才能使他们有节拍的工作,时钟信号的频率由外部振荡电路的晶振频率决定,51系列单片机的机器周期是由12个振荡周期组成。指令周期:单片机执行一条指令的时间。时钟频率越低,延时的时间就越长,灯闪烁的速度就越慢。实例5 将p1口状态送入p0口p2口p3口利用单片机工作速度快的特点,无限循环可以让单片机不停地把p1口的电平状态送到p0口p2口和p3口。引脚接地低电平被输入到p口实例6使用p3口流水点亮8位led记忆,0xfe 11111110 0xfd 11111101 0xfb 11111011 0xf7 11110111 0xef 11101111 0xdf 11011111 0xbf10111111 0x7f 01111111实例7通过对p3口地址的操作流水点亮8位led单片机都有固定的地址,记忆:张三在教室的第2排第5列老师可以说清张三回答问题也可以说请第2排第5列的同学答题。Sfr x=0xb0; 通过关键字sfr将x定义为p2的地址0xb0定义后,程序中对x的操作就相当于对地址0xb0即p3的操作类似于指针P3口的固定地址是BOHMCS-51单片机存储器的基本结构 它有两种1即程序存储器和2数据存储器从物理MSC-51有4个存储地址空间,即片内程序存储器和片外程序存储器程序存储器受EA一横外接电平的控制。1当EA一横接地时,单片机只能使用外部程序存储器2当EA一横接+5v是单片机先使用内部程序存储器,容量不够时自动使用外部程序存储器。特殊功能寄存器ACC 累加器标识符名称地址ACC累加器E0HBb寄存器F0HPSW程序状态字D0HSP堆栈指针81HDRTR数据指针83H 82HP080HP190HP2A0HP3B0HIP中断优先级控制B8HIE允许中断控制A8HTMOD定计方式控制89HTCON定计控制88HTH0定计0高位字节8CHTL0定计0低位字节8AHTH1定计1高位字节8DHTL1定计1低位字节8BHSCON串行控制98HSBUF串行数据缓冲器99HPCON电源控制87H单片机的复位电路P54页?单片机C语言开发基础#includeC注释1种采用/*。*/可以注释多行内容2种采用/但只能注释一行ANSI标准定义的关键字P57记忆思考P58跳过数据类型表p59页指针型数据位类型数据空类型数据延时函数不需要返回值。X+先用x的值,再让x加1逻辑与&逻辑或|逻辑非!按位与& 25&77=9按位或| 25|77=93按位异或 相异为1,相同出0按位取反 有0出1,有1出0左移运算符 将一个二进制数的各位全部左移若干位,移动的过程中,高位丢弃,低位补0. w=0x3a 00111010B w低位丢弃,高位补0赋值运算符逗号运算符条件运算符强制转换运算符?实例8用不同数据类型的数据控制led的闪烁 使用无符号整型数据和无符号字符数据来设计延时函数。由于整型数据占两个字节,而无符号字符型数据仅占一个字节,因此对无符号整型数据进行操作花费的时间就要长一些,整型数据要实现100次循环,消耗的时间约800个机器周期。无符号100占300个。为了提高运行效率,尽可能用无符号字符型数据。实例9 用p0口和p1口分别显示加法和减法运算结果其实就是利用二进制的单位数值进行亮1不亮0的表示乘法除法就是利用二进制转化为十进制再进行处理实例12用自增运算控制p0口8位ked的闪烁花样只要送到p0口的数值发生变化,p0口8位led点亮的状态就会发生变化。可以先将变量的初值送到p0口延迟一段时间,再利用自增运算使变量加1,然后将新的变量值送到p0口并延时一段时间,即可使8位led的闪烁花样不断变化,Unsigned char I;定义无符号字符型变量,其值不超过255运用变量的值变化和将变量的值送到p口用来变化。For(i=0;i0)&(90xab)=1&0=0;将运算结果送到p0口实例14用p0口显示条件运算的结果P0=(84)?8:4; P0=8=00001000B实例15;用p0口显示按位异或运算结果异或相异出1,相同出0;记忆异性才能很火热的做出子女P0=0xa20x3c 异或要做必须上顶 很公平应用实例16 用p0口显示左移的运算结果实例17万能逻辑电路 F=EY+Z逻辑函数p77图1专门设计数字电路,实现逻辑功能2通过单片机编程来实现逻辑功能软件即硬件/实例17:万能逻辑电路实验#include /包含单片机寄存器的头文件sbit F=P14; /将F位定义为 P1.4sbit X=P15; /将X位定义为 P1.5sbit Y=P16; /将Y位定义为 P1.6sbit Z=P17; /将Z位定义为 P1.7void main(void) while(1) F=(X)&Y)|Z; /将逻辑运算结果赋给F ; 实例18用右移实现流水灯前提设p口为0xff八次右移一位高位丢弃低位补0延迟用的变量因为要取大数所以必须用int后面因为要快所以取char型变量因为单片机运行快。所以led灯闪后要延迟。C语言语句 If(S1=0)P1=0x00;如果按键s按下接地(相应位为低电平),Swich 整型 break 三者紧密While语句花括号运用和 一般情况下,在循环体中应该有让循环停止的语句。?Do while 语句注意;Do和while连用 while后面的分号不能丢,它表示整个循环语句的结束Do循环语句 while(循环式)尽量避免使用goto语句P87页的程序软件即硬件实例21用for语句实现鸣笛报警T=1/f,所以要让蜂鸣器发出频率f的声音,只要让单片机输送周期为t的脉冲方波电平即可,让单片机没半个周期取反一次。半周期可通过延时来实现。可以通过循环的方式来实现延时,P90一重循环消耗的机器数近似N=3*n二重循环消耗的机器数近似N=3*n*m例子,如果单片机的晶振频率为11.0592MHz,则机器的周期为1.085s,要发出1600Hz的声音,就让单片机每半个周期312s将输出电平取反一次,而延时312s需要消耗机器周期数N=312/1.085286可以取300循环次数300/3=100次Void delay(void) Unsigned char I;For(i=0;i100;i+);形成1600Hz的音频相对应800Hz的音频可以i取200Sbit sound=P15;Sound=0; 即可执行Unsigned char i;While(1)i=0;?数组是同类型的一组变量?Unsigned char code tab应用却是tab【】? 字符型数组中的个字符数据在单片机中是以字符的ASCII 存放的,正确的使用指针,可以有效地表示复杂的数据类型,动态分配内存,方便的使用字符串,有效地使用数组。指针本身就具有地址还存在一个地址,Unsigned char*p;Unsigned char a;P=&a;指针数组Unsigned char a=0,1,2,3;Unsigned char *a=&a0,&a1,&a2,&a3;数组的指针Unsigned char a=0,1,2,3;Unsignde *p;P=&a0;Pi+j 为Pij实例26未细看返回值是通过return语句获得的。如果函数无返回值,需要用void来声明。数组作为函数参数一个数组的名字表示该数组的首地址,所以用数组名作为函数的参数时。被传递的数组的首地址,被调用函数的参数的形式须是定义为指针型变量。 用数组名作为函数的参数时,应该在主调函数和被调函数中都进行数组定义。定义的数组类型必须一致。编译器不检查形参数组的长度p109函数?函数型指针一个函数在编译时,就分配了一个入口地址,这个入口地址就是函数的指针,类型说明符 (*指针变量名)(形参列表)Int (*p)(int a,int b)(*p)(a,b)这些需要思考p110页。P1=z/256;取得z的高八位P2=z/256;取得z的低八位?While(1);无限循环防止程序跑飞。实例30用有参函数控制p0口8位流水灯的流水速度P113实例31不实用?、实例32 实例33是不错的c语言程序函数调用。练习c语言p115p116实例34不错c语言程序p118指针数组适合用来指向若干个字符串,尤其是各列字符串长度不一致的情形,这对于字符的液晶显示等很有意义。实际运用液晶等显示器显示字符时,如果液晶的接口通过P0口和单片机连接,将各字符串送入p0口,实际上就是送入液晶显示器。实例35#includeP0=isalpha(_)?0xf0:0x0f;内部函数文件instrins.h中有_crol_()函数实例36;应用内部函数文件instrins.h中有_crol_()函数来点亮P3口8位流水灯_crol_(15,2)的返回值为00111100B=0x3c思考他的应用实例37实例38感觉像是介绍函数以后?c语言应用程序卡那可可能看看C语言编译预处理宏定义c语言允许一个标示符来表示一个字符串,称为宏。P125宏定义不是c语句,所以不需加分号。可以用#undef命令来终止宏定义的作用域。即对#undef后面的无用。为防止歧义应加括号及时带参数的函数宏和函数不同,函数是先求出实参表达式的值,然后代入形参,而带参数的宏只是进行简单的字符替换。实例40文件包含应用举例使用头文件为#include中有关特殊功能寄存器的定义已将P3_0定义为P3.0引脚,直接应用P3_0就可以对P3口进行操作了。实例41条件编译应用举例 常用的条件编译是根据某常量表达式的值的是否为真来控制编译即#if 常量表达式 程序段1#else 程序段2#endif?思考好的应用第五章单片机的定时器计数器当加在定时器计数器T0或T1用作计数器时,对外接晶振产生的振荡信号经12分频后,提供给计数器,作为计数器的脉冲输入,计数器以12分频后的脉冲周期为基本计数单位,对输入的脉冲进行计数,直至产生溢出。?P136页到p140页有点不懂。工作方式图p135T0或T1引脚上的外部脉冲信号出现一个由1到0的负跳变时,计数器加1,直至计数器溢出。CPU是按顺序进行工作的。实例42用计时器T0查询方式控制P2口的8位LED闪烁T0工作于方式1,LED灯的闪烁周期为100ms,即亮50ms,熄灭50ms;12分频即频率被12等分,周期即12除频率定时器的初值设定需要进行计算,总而言之,就是定时器必须达到顶值即65536.初值需要T0的高八位寄存器TH0和低八位寄存器TL0分别存储存储方法及TH0= /256;TL0= %256;溢出标志位是否为1若为1表示时间已到,否则,等待。/实例42:用定时器T0查询方式P2口8位控制LED闪烁#include / 包含51单片机寄存器定义的头文件/*函数功能:主函数*/void main(void) / EA=1; /开总中断/ET0=1; /定时器T0中断允许 TMOD=0x01; /使用定时器T0的模式1TH0=(65536-46083)/256; /定时器T0的高8位赋初值TL0=(65536-46083)%256; /定时器T0的高8位赋初值TR0=1; /启动定时器T0TF0=0;P2=0xff; while(1)/无限循环等待查询 while(TF0=0)/查询标志位是否溢出 ; TF0=0; P2=P2;按位取反,实现led灯的闪烁 TH0=(65536-46083)/256; /定时器T0的高8位赋初值 TL0=(65536-46083)%256; /定时器T0的高8位赋初值 TFO 记忆flow溢出TRO 记忆trigger引起启动THO 记忆high高八位TMOD 记忆mode 方式实例43,用定时器t1查询方式控制单片机发出1kHz音频/实例43:用定时器T1查询方式控制单片机发出1KHz音频#include / 包含51单片机寄存器定义的头文件sbit sound=P37; /将sound位定义为P3.7引脚/*函数功能:主函数*/void main(void) / EA=1; /开总中断/ET0=1; /定时器T0中断允许 TMOD=0x10; /使用定时器T1的模式1TH1=(65536-921)/256; /定时器T1的高8位赋初值TL1=(65536-921)%256; /定时器T1的高8位赋初值TR1=1; /启动定时器T1TF1=0;while(1)/无限循环等待查询 while(TF1=0) ; TF1=0;sound=sound; /将P3.7引脚输出电平取反 TH1=(65536-921)/256; /定时器T0的高8位赋初值 TL1=(65536-921)%256; /定时器T0的高8位赋初值 /实例44:将计数器T0计数的结果送P1口8位LED显示#include / 包含51单片机寄存器定义的头文件sbit S=P34; /将S位定义为P3.4引脚/*函数功能:主函数*/void main(void) / EA=1; /开总中断/ET0=1; /定时器T0中断允许 TMOD=0x02; /使用定时器T0的模式2TH0=256-156; /定时器T0的高8位赋初值TL0=256-156; /定时器T0的高8位赋初值TR0=1; /启动定时器T0while(1)/无限循环等待查询 while(TF0=0) /如果未计满就等待 if(S=0) /按键S按下接地,电平为0 P1=TL0; /计数器TL0加1后送P1口显示 TF0=0; /计数器溢出后,将TF0清0 第六章单片机的中断系统中断系统类似写作业定时器计时器实际上就是中断源。MCS51单片机提供5个中断源。外部中断INT0一横 编号0 由P3.2引脚输入定时器T0 编号1外部中断INT1一横 编号2 由P3.3引脚输入定时器T1 编号3串行口通信中断RI或TI 编号4自然优先级从上到下逐级递减。P150 p151页未看void Time(void) interrupt 1 using 0/实例46:用定时器T0的中断实现长时间定时#include / 包含51单片机寄存器定义的头文件sbit D1=P20; /将D1位定义为P2.0引脚unsigned char Countor; /设置全局变量,储存定时器T0中断次数/*函数功能:主函数*/void main(void) EA=1; /开总中断ET0=1; /定时器T0中断允许 TMOD=0x01; /使用定时器T0的模式2TH0=(65536-46083)/256; /定时器T0的高8位赋初值TL0=(65536-46083)%256; /定时器T0的高8位赋初值TR0=1; /启动定时器T0Countor=0; /从0开始累计中断次数while(1)/无限循环等待中断 ; /*函数功能:定时器T0的中断服务程序*/void Time0(void) interrupt 1 using 0 /“interrupt”声明函数为中断服务函数 /其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器 Countor+; /中断次数自加1if(Countor=20) /若累计满20次,即计时满1s D1=D1; /按位取反操作,将P2.0引脚输出电平取反Countor=0; /将Countor清0,重新从0开始计数 TH0=(65536-46083)/256; /定时器T0的高8位重新赋初值TL0=(65536-46083)%256; /定时器T0的高8位重新赋初值 定时器T0工作于方式1时,最大可计脉冲数次数为65536,对于11。0592MHz的时钟频率。一个脉冲的宽度为1.085s,则最大计时长度只有1.08565536=71107s即大约71ms,要想计时更长时间,采用 软件计时的方法设置一个变量counter 来存储定时器T0的中断次数,即每产生一次中断,使变量counter自加1,如果T0每50ms中断一次,那当counter自加20次时,所及时间为1s。中断一次就要重新赋值一次控制两个LED灯以不同的周期闪烁,第一个LED亮灭时间为100ms,第二个LED亮灭时间为400ms,所以需要设置两个变量counter1 和counter2来分别统计中断次数,且都为最小的整数倍。/实例47:用定时器T1中断控制两个LED以不同周期闪烁#include / 包含51单片机寄存器定义的头文件sbit D1=P20; /将D1位定义为P2.0引脚sbit D2=P21; /将D2位定义为P2.1引脚unsigned char Countor1; /设置全局变量,储存定时器T1中断次数unsigned char Countor2; /设置全局变量,储存定时器T1中断次数/*函数功能:主函数*/void main(void) EA=1; /开总中断ET1=1; /定时器T1中断允许 TMOD=0x10; /使用定时器T1的模式1TH1=(65536-46083)/256; /定时器T1的高8位赋初值TL1=(65536-46083)%256; /定时器T1的高8位赋初值TR1=1; /启动定时器T1Countor1=0; /从0开始累计中断次数Countor2=0; /从0开始累计中断次数 while(1)/无限循环等待中断 ; /*函数功能:定时器T1的中断服务程序*/void Time1(void) interrupt 3 using 0 /“interrupt”声明函数为中断服务函数 /其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器 7 Countor1+; /Countor1自加1Countor2+; /Countor2自加1if(Countor1=2) /若累计满2次,即计时满100ms D1=D1; /按位取反操作,将P2.0引脚输出电平取反Countor1=0; /将Countor1清0,重新从0开始计数if(Countor2=8) /若累计满8次,即计时满400ms D2=D2; /按位取反操作,将P2.1引脚输出电平取反Countor2=0; /将Countor1清0,重新从0开始计数 TH1=(65536-46083)/256; /定时器T1的高8位重新赋初值TL1=(65536-46083)%256; /定时器T1的高8位重新赋初值 实现方法 先开总中断EA 分支中断ET?,选择方式,赋初值 ,启动定时器T?,声明音调与频率的关系音调低1低2低3低4低5低6低7频率262294330349392440494音调中1中2中3中4中5中6中7频率523 587659698784880988音调高1高2高3高4高5高6高7频率1046117513181397156817601967由于单片机的输入输出口只有高电平1和低电平0,因此向蜂鸣器输送的电平信号实际是就是该音频的方波。例如中音频率523Hz,他的周期为1523秒,即1。93ms只要向蜂鸣器输送周期为1.91ms的脉冲方波电平信号就能发出523Hz的音调,该方波的半周期为1.912=0.995ms。为此,需要利用定时器的中断,让输送给蜂鸣器的电平信号每0。955ms取反一次即可,由于本书使用的单片机晶振为11.0952mhz,他的机器周期为12(111。0592)=1.085s。因此需要的机器周期总数为995s1.085s=880定时器的定时常数为880C=106s除2f1.085s=460830频率THO=(8192-C)32?每分钟为72节拍,每节拍100060ms72=833ms/实例49:用定时器T0的中断实现渴望主题曲的播放#include /包含51单片机寄存器定义的头文件sbit sound=P37; /将sound位定义为P3.7unsigned int C; /储存定时器的定时常数/以下是C调低音的音频宏定义#define l_dao 262 /将“l_dao”宏定义为低音“1”的频率262Hz#define l_re 286 /将“l_re”宏定义为低音“2”的频率286Hz#define l_mi 311 /将“l_mi”宏定义为低音“3”的频率311Hz#define l_fa 349 /将“l_fa”宏定义为低音“4”的频率349Hz#define l_sao 392 /将“l_sao”宏定义为低音“5”的频率392Hz#define l_la 440 /将“l_a”宏定义为低音“6”的频率440Hz#define l_xi 494 /将“l_xi”宏定义为低音“7”的频率494Hz/以下是C调中音的音频宏定义#define dao 523 /将“dao”宏定义为中音“1”的频率523Hz#define re 587 /将“re”宏定义为中音“2”的频率587Hz#define mi 659 /将“mi”宏定义为中音“3”的频率659Hz#define fa 698 /将“fa”宏定义为中音“4”的频率698Hz#define sao 784 /将“sao”宏定义为中音“5”的频率784Hz#define la 880 /将“la”宏定义为中音“6”的频率880Hz#define xi 987 /将“xi”宏定义为中音“7”的频率523H /以下是C调高音的音频宏定义#define h_dao 1046 /将“h_dao”宏定义为高音“1”的频率1046Hz#define h_re 1174 /将“h_re”宏定义为高音“2”的频率1174Hz#define h_mi 1318 /将“h_mi”宏定义为高音“3”的频率1318Hz#define h_fa 1396 /将“h_fa”宏定义为高音“4”的频率1396Hz#define h_sao 1567 /将“h_sao”宏定义为高音“5”的频率1567Hz#define h_la 1760 /将“h_la”宏定义为高音“6”的频率1760Hz#define h_xi 1975 /将“h_xi”宏定义为高音“7”的频率1975Hz/*函数功能:1个延时单位,延时200ms*/void delay() unsigned char i,j; for(i=0;i250;i+) for(j=0;j250;j+) ; /*函数功能:主函数*/void main(void) unsigned char i,j; /以下是渴望片头曲的一段简谱 unsigned int code f=re,mi,re,dao,l_la,dao,l_la, /每行对应一小节音符 l_sao,l_mi,l_sao,l_la,dao, l_la,dao,sao,la,mi,sao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao, l_la,l_la,dao,l_la,l_sao,l_re,l_mi,l_sao,re,re,sao,la,sao,fa,mi,sao,mi,la,sao,mi,re,mi,l_la,dao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,re,l_la,dao,re,mi,re,l_la,dao,re,l_la,dao,re,mi,re,0xff; /以0xff作为音符的结束标志/以下是简谱中每个音符的节拍/4对应4个延时单位,2对应2个延时单位,1对应1个延时单位 unsigned char code JP =4,1,1,4,1,1,2, 2,2,2,2,8,4,2,3,1,2,2,10,4,2,2,4,4,2,2,2,2,4, 2,2,2,2,2,2,2,10,4,4,4,2,2,4,2,4,4,4,2,2,2,2,2,2,10,4,2,2,4,4,2,2,2,2,6,4,2,2,4,1,1,4,10,4,2,2,4,1,1,4,10; EA=1; /开总中断 ET0=1; /定时器T0中断允许 TMOD=0x00; / 使用定时器T0的模式1(13位计数器) while(1) /无限循环 i=0; /从第1个音符f0开始播放 while(fi!=0xff) /只要没有读到结束标志就继续播放 C=460830/fi; TH0=(8192-C)/32; /可证明这是13位计数器TH0高8位的赋初值方法 TL0=(8192-C)%32; /可证明这是13位计数器TL0低5位的赋初值方法 TR0=1; /启动定时器T0 for(j=0;jJPi;j+) /控制节拍数 delay(); /延时1个节拍单位 TR0=0; /关闭定时器T0 i+; /播放下一个音符 /*函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波*/ void Time0(void ) interrupt 1 using 1 sound=!sound; /将P3.7引脚输出电平取反,形成方波 TH0=(8192-C)/32; /可证明这是13位计数器TH0高8位的赋初值方法 TL0=(8192-C)%32; /可证明这是13位计数器TL0低5位的赋初值方法 、实例51本例用单片机U1从P1。4引脚输出正脉宽为250s的方波,再利用单片机U2的into引脚检测,验证方波的正脉冲宽度,有点没看懂/实例51-2:定时器T0的模式2测量正脉冲宽度#inclu

温馨提示

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

评论

0/150

提交评论