单片机C语言应用100例
单片机C语言应用100例,单片机,语言,应用,利用,运用
/实例89:将“渴望“乐谱写入AT24C02并读出播放#include / 包含51单片机寄存器定义的头文件#include /包含_nop_()函数定义的头文件#define OP_READ 0xa1 / 器件地址以及读取操作,0xa1即为1010 0001B#define OP_WRITE 0xa0 / 器件地址以及写入操作,0xa1即为1010 0000Bsbit SDA=P34; /将串行数据总线SDA位定义在为P3.4引脚sbit SCL=P33; /将串行时钟总线SDA位定义在为P3.3引脚sbit sound=P37; /将sound位定义为P3.7,从该引脚输出音频unsigned 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”的频率523Hz/以下是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/*函数功能:节拍的延时的基本单位,延时200ms*/void delay() unsigned char i,j;for(i=0;i250;i+)for(j=0;j250;j+);/*以下是对AT24C02进行读写操作的源程序*/*函数功能:延时1ms(3j+2)*i=(333+2)10=1010(微秒),可以认为是1毫秒*/void delay1ms()unsigned char i,j;for(i=0;i10;i+)for(j=0;j33;j+); /*函数功能:延时若干毫秒入口参数:n*/void delaynms(unsigned char n)unsigned char i;for(i=0;in;i+)delay1ms();/*函数功能:开始数据传送*/void start()SDA = 1; /SDA初始化为高电平“1“SCL = 1; /开始数据传送时,要求SCL为高电平“1“_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SDA = 0; /SDA的下降沿被认为是开始信号_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)/*函数功能:结束数据传送*/void stop()SDA = 0; /SDA初始化为低电平“0“_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SCL = 1; /结束数据传送时,要求SCL为高电平“1“_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SDA = 1; /SDA的上升沿被认为是结束信号/*函数功能:从AT24Cxx读取数据出口参数:x*/unsigned char ReadData()unsigned char i;unsigned char x; /储存从AT24Cxx中读出的数据for(i = 0;i 8;i+)SCL = 1; /SCL置为高电平x=1; /将x中的各二进位向左移一位x|=(unsigned char)SDA; /将SDA上的数据 位“ “ 存入x中SCL = 0; /在SCL的下降沿读出数据return(x); /将读取的数据 /*函数功能:向AT24Cxx的 地址写入数据入口参数:y (储存待写入的数据)*/在调 数据写入函数 调 开始函数start(), 以SCL=0bit WriteCurrent(unsigned char y)unsigned char i;bit ack_bit; /储存 位for(i = 0; i 8; i+) / 移入8个位SDA = (bit)(y / 位“ “ 将 高位数据送 S/ 为传送时高位在 ,低位在后_nop_(); /等待一个机器周期 SCL = 1; /在SCL的上升沿将数据写入AT24Cxx _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 0; /将SCL 置为低电平,以在SC 线 传送数据 的 个 y = 1; /将y中的各二进位向左移一位SDA = 1; / 送(机) 在时钟 的高电平期(SCL=1)放SDA线,/以SDA线currency1“(AT24Cxx)_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 1; /据上fifl定,SCL 为高电平_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 ack_bit = SDA; / (AT24Cxx)向SDA送低电平,“ 一个 节/若送高电平,“ ,传送常SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)return ack_bit;/ AT24Cxx 位/*函数功能:向AT24Cxx中的定地址写入数据入口参数:add (储存定的地址);dat(储存待写入的数据)*/void WriteSet(unsigned char add, unsigned char dat)start(); /开始数据传递WriteCurrent(OP_WRITE); /”要操作的AT24Cxx片,并 要对写入数据WriteCurrent(add); /写入定地址WriteCurrent(dat); /向 地址(上 定的地址)写入数据stop(); /数据传递delaynms(4); /1个 节的写入周期为1ms, 延时1ms以上/*函数功能:从AT24Cxx中的 地址读取数据出口参数:x (储存读出的数据) */unsigned char ReadCurrent()unsigned char x;start(); /开始数据传递WriteCurrent(OP_READ); /”要操作的AT24Cxx片,并 要读数据x=ReadData(); /将读取的数据存入xstop(); /数据传递return x; / 读取的数据/*函数功能:从AT24Cxx中的定地址读取数据入口参数:set_addr出口参数:x */unsigned char ReadSet(unsigned char set_addr)start(); /开始数据传递WriteCurrent(OP_WRITE); /”要操作的AT24Cxx片,并 要对写入数据WriteCurrent(set_addr); /写入定地址return(ReadCurrent(); /从定地址读出数据并 /*函数功能:函数*/main(void)unsigned char i,j;unsigned char temp; /储存后的音频unsigned char Ji; /储存音节拍unsigned char N; /储存音的 个数以在AT24C02中为音节拍 存储unsigned int fr; /储存 后的音频 /以下是渴望片头的一 谱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,0x00; /以频率0x00作为 谱的结束 /以下是 谱中 个音的节拍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位 数器 SDA = 1; / SDA=1,SCL=1, 从 SCL = 1; while(1) / i=0; /从1个音频率f0开始写入AT24C02while(fi!=0x01) / 要读 结束 写入temp=(unsigned char)(fi/8); /将音频为的 变WriteSet(0x00+i,temp); /在定地址写入数据后的音频i+; /向下一个音音频N=i; /将音的 个数存 Ni=0; /从一个音节拍JP0开始写入AT24C02while(fi!=0x00)WriteSet(0x00+N+i,JPi); /在定地址写入音的节拍i+; /向下一个音音频for(i=0;iN;i+) temp=ReadSet(0x00+i); /读出音频Ji=ReadSet(0x00+N+i); /读出节拍fr=8*temp; /将音频 C=460830/fr; /定时常数的 TH0=(8192-C)/32; /可 是13位 数器TH0高8位的 初 TL0=(8192-C)%32; /可 是13位 数器TL0低5位的 初 TR0=1; / 定时器T0for(j=0;jJi;j+) /节拍数delay(); /延时1个节拍单位TR0=0; / 定时器T0 sound=1; /播放 后, 器for(i=0;i8;i+) /播放 后,一时后 播放delay(); /*函数功能:定时器T0的中 程序, P3.7引脚输出音频的 */void Time0(void ) interrupt 1 using 1 TH0=(8192-C)/32; /可 是13位 数器TH0高8位的 初 TL0=(8192-C)%32; /可 是13位 数器TL0低5位的 初 sound=!sound; /将P3.7引脚输出电平取反,
收藏