编程如下:
#include <reg52.h> //52系列头文件
#define uchar unsigned char //变量类型宏定义
#define uint unsigned int
sbit Key = P2^0 //按键位声明
sbit Bell = P2^3 //门铃位声明
uint p //中断次数变量
void main() //主程序
{
TMOD = 0x00 //设置T0工作于饥芦方式0
TH0 = (8192-700)/租肢桐32 //T0计数器装入定时700us初值
TL0 = (8192-700)%32
IE = 0x82 //开总中断,开T0中断
if(Key==0) //如果键被按下
{
TR0 = 1 //启动T0定时器计时
}
while(Key==0) //等待按键松开
}
void Timer0() interrupt 1 //T0中断服务子程序
{
Bell = ~Bell //每次中断发生时,门铃弊坦状态取反
p++ //中断计次值加1
if(p<=400) //如果中断<=400次,
{
TH0 = (8192-700)/32 //重装700us定时初值
TL0 = (8192-700)%32
}
if(p>400) //如果中断次数>400
{
TH0 = (8192-1000)/32 //则重装定时 1ms 初值
TL0 = (8192-1000)%32
if(p==1000) //如果中断次数 =800次
{
P = 0 //中断计数值归0
TR0 = 0 //关闭T0定时器
}
}
}
*** 作说明:每当按下并保持,响铃一声。松开后再按,即重复上述状态。
#include<reg52.h> //包含52单片机寄存器定义的头文件sbit sound=P3^7 //将sound位定义为P3.7
unsigned int C//储存定时器的定时常数
//以下是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"的频率523Hz
/*******************************************
函数功局段隐能:1个延时单位,延时200ms
******************************************/
void delay()
{
unsigned char i,j
for(i=0i<250i++)
for(j=0j<250j++)
}
/*******************************************
函数功能:主函数
******************************************/
void main(void)
{
unsigned char i,j
//以下是《两只老虎》歌曲
unsigned int code f[]={dao,re,mi,dao, //每行对应一小节音符
dao,re,mi,dao,
mi,fa,sao,
mi,fa,sao,
sao,la,sao,fa,mi,dao,
sao,la,sao,fa,mi,dao,
dao,sao,dao,
dao,sao,dao,
0xff}//以0xff作为音符的结束标志
//以下是简谱中每个音符的节拍
//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位
unsigned char code JP[ ]={2,2,2,2,
2,2,2,2,
2,2,3,
2,2,3,
1,2,2,1,2,2,
1,2,2,1,2,2,
2,2,2,
2,2,2,
}
EA=1//开总中断
ET0=1 //定时器T0中断允许
TMOD=0x00 // 使用定时器T0的模式1(13位计数器)
while(1) //无限循环
{
i=0 //从第1个音符f[0]开始播放
while(f[i]!=0xff)//只要没有读到结束标志就继续播放
{
C=460830/f[i]
TH0=(8192-C)/32 //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32 //可证明这是13位计数器TL0低5位的赋初值方法
TR0=1//启动定时器T0
for(j=0j<JP[i]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位的赋初值方法
}
单片机(Microcontrollers)诞生于1971年,经历了SCM、MCU、SoC三大阶段,早期的SCM单片机都是8位或4位的。其中最成功的是INTEL的8051,此后在8051上发展出了MCS51系列MCU系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随慎源着消费电子产品大发展,单片机技术得到了巨大提高。随着INTEL i960系列特别是后来段凳的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。高端的32位Soc单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。
当代单片机系统已经不再只在裸机环境下握孝旅开发和使用,大量专用的嵌入式 *** 作系统被广泛应用在全系列的单片机上。而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux *** 作系统。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)