- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第13章 C51应用程序的设计第13章 C51应用程序的设计13.1 C51的程序设计举例13.2 C51与汇编语言的混合编程13.3案例:电梯运行控制的楼层显示13.4案例:8位竞赛抢答器设计13.1 C51的程序设计举例13.1.1 中断编程C51编译器支持在C源程序中直接开发中断系统。中断服务程序是通过按规定语法格式定义一个函数。中断服务程序的函数定义的语法格式为: 返回值 函数名([参数])interrupt m [using n]AT89S51中断源编号见表13-1。表13-1 AT89S51中断源编号编号中断源入口地址0外中断00003H1定时/计数0000BH2外中断10013H3定时/计数1001BH4串行中断0023H【例13-1】在AT89S51单片机的P3.2引脚接有一个按键,按下按键后P1.0脚的LED点亮,再按一下熄灭。解:根据题目要求,程序如下:#include reg51.h sbit P1_0=P1^0;void main() {IT0=1; //设置为下降沿触发 EA=1; //开总中断 EX0=1; //开外部中断 for(;;) {; } }void int0() interrupt 0{P1_0=!P1_0; //取反P1.0}13.1.2定时/计数器编程定时/计数器编程主要是对定时器进行初始化,设置定时器工作模式和确定计数初值或将计数器的计数值显示出来等。【例13-2】设单片机的=1MHz,要求在P1.0脚上输出为2ms的方波信号。解:周期为2ms的方波要求定时间隔为1ms,每次时间到后P1.0取反。 (1)用定时器0的方式1编程,采用查询方式,程序如下: #include reg51.h
sbit P1_0=P1^0;
void main()
{
TMOD=0x01;
TR0=1;
for(;;){TH0=(1000/256); //装载计数器初值 TL0=(1000/256);
do{ }while(!TF0); //定时时间到TF0取反 P1_0=!P1_0; //定时时间到P1.0反相 TF0=0; //软件清TF0
}
} (2)用定时器0的方式1编程,采用中断方式,程序如下:#include reg51.h sbit P1_0=P1^0; void time() interrupt 1 using 1 //中断服务程序入口 { P1_0=!P1_0; //P1.0取反 TH0=(1000/256); TL0=-(1000/256); } void main(void) {TMOD=0x01; //设置定时的工作方式 P1_0=0; TH0=(1000/256); //预置计数器初值 TL0=-(1000/256); EA=1; ET0=1; TR0=1; do{} while(1); //等待中断 }13.1.3 串行口使用C语言编程【例13-3】单片机=11.0592MHz,波特率为2400,设计单片机间的通信程序。解:两台AT89C51单片机之间通过串行口通信,采用中断工作方式。两台单片机通过串行口进行通信的PROTEUS仿真电路如图13-1所示(其中的时钟电路及复位电路未画出)。发送方单片机将串行口设置为工作方式2,TB8作为奇偶校验位。待发送数据位于片内RAM40H~4FH单元中。数据写入发送缓冲器之前,先将数据的奇偶校验位写入TB8作为奇偶校验位,使第9位数据作为奇偶校验位。接收方单片机也将串行口设置为工作方式2,并允许接收,每接收到一个数据都要进行校验,根据校验结果决定接收是否正确。接收正确,则向发送方回送标志数据00H,同时将收到的数据送P1口显示;接收错误,则向发送方回送标志数据FFH,同时将数据FFH送P1口显示。发送方每发送一个字节后紧接着接收回送字节,只有收到标志数据00H后,才继续发送下一个数据,同时将发送的数据送P1口显示,否则停止发送。图13-1 两台单片机通过串行口进行通信的PROTEUS仿真电路图 发送方程序如下:#include reg51.h#define uchar unsigned char#define uint unsigned intuchar i=0;uchar dat[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; //待发数据void delay() //延时函数{uint j;for(j=0;j31000;j++){;}} void main(){TI=0;RI=0
文档评论(0)