51单片机C语言程序100例分析(3)串口

发布时间:2022-12-07  

//实例49:用定时器T0的中断实现"渴望"主题曲的播放


#include    //包含51单片机寄存器定义的头文件


sbit sound=P3^7;     //将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”的频率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;i<250;i++)


for(j=0;j<250;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个延时单位


unsignedcharcodeJP[]={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个音符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=0;j

delay();


TR0=0;


i++;



//控制节拍数


//延时1个节拍单位


//关闭定时器T0


//播放下一个音符



/***********************************************************


函数功能:定时器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位的赋初值方法


}

分析:对于音符我就不了解了。


//实例56-1:数据发送程序


#include//包含单片机寄存器的头文件


unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};


//流水灯控制码,该数组被定义为全局变量


/*****************************************************


函数功能:向PC发送一个字节数据


***************************************************/


void Send(unsigned char dat)


{


SBUF=dat;


while(TI==0);


TI=0;


}


/**************************************************************


函数功能:延时约150ms


**************************************************************/


void delay(void)


{


unsigned char m,n;


for(m=0;m<200;m++)


for(n=0;n<250;n++)


;


}


/*****************************************************


函数功能:主函数


***************************************************/


void main(void)


{


unsigned char i;


TMOD=0x20;  //TMOD=00100000B,定时器T1工作于方式2


SCON=0x40;  //SCON=01000000B,串口工作方式1


PCON=0x00;  //PCON=00000000B,波特率9600


TH1=0xfd;   //根据规定给定时器T1赋初值


TL1=0xfd;   //根据规定给定时器T1赋初值


TR1=1;       //启动定时器T1


while(1)


{


for(i=0;i<8;i++)    //模拟检测数据


{


Send(Tab[i]);          //发送数据i


delay();   //50ms发送一次检测数据


}


}


}

分割线


//实例56-2:数据接收程序


#include//包含单片机寄存器的头文件


/*****************************************************


函数功能:接收一个字节数据


***************************************************/


unsigned char Receive(void)


{


unsigned char dat;


while(RI==0)   //只要接收中断标志位RI没有被置“1”


;      //等待,直至接收完毕(RI=1)


RI=0;      //为了接收下一帧数据,需将RI清0


dat=SBUF;  //将接收缓冲器中的数据存于dat


return dat;


}


/*****************************************************


函数功能:主函数


***************************************************/


void main(void)


{


TMOD=0x20;  //定时器T1工作于方式2


SCON=0x50;  //SCON=01010000B,串口工作方式1,允许接收(REN=1)


PCON=0x00;  //PCON=00000000B,波特率9600


TH1=0xfd;  //根据规定给定时器T1赋初值


TL1=0xfd;  //根据规定给定时器T1赋初值


TR1=1;    //启动定时器T1


REN=1;    //允许接收


while(1)


{


P1=Receive();//将接收到的数据送P1口显示


}


}


//实例57-1:数据发送程序


#include//包含单片机寄存器的头文件


sbit p=PSW^0;


unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};


//流水灯控制码,该数组被定义为全局变量


/*****************************************************


函数功能:向PC发送一个字节数据


***************************************************/


void Send(unsigned char dat)


{


ACC=dat;


TB8=p;


SBUF=dat;


while(TI==0)


;


TI=0;


}


/**************************************************************


函数功能:延时约150ms


**************************************************************/


void delay(void)


{


unsigned char m,n;


for(m=0;m<200;m++)


for(n=0;n<250;n++)


;


}


/*****************************************************


函数功能:主函数


***************************************************/


void main(void)


{


unsigned chari;


TMOD=0x20;  //TMOD=00100000B,定时器T1工作于方式2


SCON=0xc0;  //SCON=11000000B,串口工作方式3,


//SM2置0,不使用多机通信,TB8置0


PCON=0x00;  //PCON=00000000B,波特率9600


TH1=0xfd;     //根据规定给定时器T1赋初值


TL1=0xfd;     //根据规定给定时器T1赋初值


TR1=1;       //启动定时器T1


while(1)


{


for(i=0;i<8;i++)    //模拟检测数据


{


Send(Tab[i]);          //发送数据i


delay();   //50ms发送一次检测数据


}


}


}

//实例57-2:数据接收程序


#include//包含单片机寄存器的头文件


sbitp=PSW^0;


/*****************************************************


函数功能:接收一个字节数据


***************************************************/


unsigned char Receive(void)


{


unsigned char dat;


while(RI==0)     //只要接收中断标志位RI没有被置"1"


;        //等待,直至接收完毕(RI=1)


RI=0;      //为了接收下一帧数据,需将RI清0


ACC=SBUF;  //将接收缓冲器中的数据存于dat


if(RB8==p)


{


dat=ACC;


return dat;


}


}


/*****************************************************


函数功能:主函数


***************************************************/


void main(void)


{


TMOD=0x20;  //定时器T1工作于方式2


SCON=0xd0;  //SCON=11010000B,串口工作方式1,允许接收(REN=1)


PCON=0x00;  //PCON=00000000B,波特率9600


TH1=0xfd;     //根据规定给定时器T1赋初值


TL1=0xfd;     //根据规定给定时器T1赋初值


TR1=1;       //启动定时器T1


REN=1;       //允许接收


while(1)


{


P1=Receive();//将接收到的数据送P1口显示


}


}

//实例58:单片机向PC发送数据


#include//包含单片机寄存器的头文件


unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};


//流水灯控制码,该数组被定义为全局变量


/*****************************************************


函数功能:向PC发送一个字节数据


***************************************************/


void Send(unsigned char dat)


{


SBUF=dat;


while(TI==0)


;


TI=0;


}


/**************************************************************


函数功能:延时约150ms


**************************************************************/


void delay(void)


{


unsigned char m,n;


for(m=0;m<200;m++)


for(n=0;n<250;n++)


;


}


/*****************************************************


函数功能:主函数


***************************************************/


void main(void)


{


unsigned char i;


TMOD=0x20;  //TMOD=00100000B,定时器T1工作于方式2


SCON=0x40;  //SCON=01000000B,串口工作方式1


PCON=0x00;  //PCON=00000000B,波特率9600


TH1=0xfd;     //根据规定给定时器T1赋初值


TL1=0xfd;     //根据规定给定时器T1赋初值


TR1=1;       //启动定时器T1


while(1)


{


for(i=0;i<8;i++)    //模拟检测数据


{


Send(Tab[i]);          //发送数据i


delay();   //150ms发送一次数据


}


}


}

//实例59:单片机接收PC发出的数据


#include         //包含单片机寄存器的头文件


/*****************************************************


函数功能:接收一个字节数据


***************************************************/


unsigned char Receive(void)


{


unsigned char dat;


while(RI==0)   //只要接收中断标志位RI没有被置“1”


;      //等待,直至接收完毕(RI=1)


RI=0;      //为了接收下一帧数据,需将RI清0


dat=SBUF;  //将接收缓冲器中的数据存于dat


return dat;


}


/*****************************************************


函数功能:主函数


***************************************************/


void main(void)


{


TMOD=0x20;  //定时器T1工作于方式2


SCON=0x50;  //SCON=01010000B,串口工作方式1,允许接收(REN=1)


PCON=0x00;  //PCON=00000000B,波特率9600


TH1=0xfd;  //根据规定给定时器T1赋初值


TL1=0xfd;  //根据规定给定时器T1赋初值


TR1=1;    //启动定时器T1


REN=1;    //允许接收


while(1)


{


P1=Receive();//将接收到的数据送P1口显示


}


}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    他们也没那么厉害!即便你是初中文凭,也照样能编程。 对于c语言来说,要记得东西其实不多,基本就是几个常用语句加一些关键字而已。 你所看到的那些几千甚至上万行的代码,都是用这些语句......
    的执行时间 MCS-51系列单片机指令执行时间有单周期指令,双周期指令和四周期指令。 汇编语言的语句结构 一般来讲,汇编语言的语句结构由5部分组成,即标号,操作助记符,目的操作数,源操作数和注释. 如下......
    中断的发生是由外部因素决定的,程序中无法事先安排调用语句。因此,调用中断函数的过程是由硬件自动完成的。 参考资料: (1)王静霞等. 单片机应用计数(C语言版)第3版[M]. 北京,电子工业出版社,2015:166. ......
    复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发; 2、HEX文件建立了第一个单片机C语言项目,但为了让编译好的程序能通过编程器写入51芯 片中,要先用编译器生成HEX文件 3、C 编译器所支持的注释语句......
    系列单片机,再学习STM32单片机。 如果大家掌握了51单片机之后,大家就需要学习一下C语言的一些高级语法了 1. C语言结构体的定义和使用 2. C语言指针的概念,定义和应用 3. C语言......
    电路 2. C语言 3. 单片机 1. 基础电路 要熟悉常用的电子元器件、比如电阻电容、二极管、三极管等原理,熟悉串联并联电路原理等等。 2.C语言 前期通常只需要学习常用的一些数据类型和条件语句......
    合与对MCS-51系列单片机进行C语言编程,特殊的能寄存器C51定义的一般语法格式如下:   sfrsfr-name=intconstant;   “sfr”是定义语句的关键字,其后必须跟一个MSC-51......
    MCS-51单片机汇编伪指令;汇编语言的特点 1.助记符指令和机器指令一一对应。用汇编语言编制的程序,效率高,占用存贮空间小,运行速度快。因此汇编语言能编写出最优化的程序,而且......
    的开发。 51单片机好学不好学? 必须要看个人的实际情况和学习的恒心。 如果理科毕业的学生,电路基础、C语言比较好的同学,学习单片机相对是比较容易的。 当然,好学不好学是一个话题,能不......
    在屏幕前显示冷冰冰一些字符。 而单片机则有趣的多,你只要会C语言入门语句,再加一点单片机寄存器配置就能点亮电路板上的一个灯。 这个时候你会更有成就感,感觉你学的东西可以很快看到成果,很快......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>