- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[工学]第八章 8051内部资源C语言编程
第八章 8051内部资源C语言编程 一、I/O口编程 例1:用按键控制发光二极管。并口是用的最多的资源,下面以P1口为例,见电路图,P1口低4位接了4个按钮,高4位接了4个指示灯,要求按下相应的按钮,对应的指示灯亮。P10对应P14,依次类推。指示灯是端口输出高电平亮。 源程序如下: #includeat89x51.h void main() { unsigned char data x,i; while(1) { P1=P1|0x0f; //给低4位置1,高4位不变 x=P10x0f; //读低4位 x=~x; //低4位取反 P1=x4; //左移4位 for(i=0;i255;i++); //延时 }} (端口编程) 注意上面几种常见的用法。 二、中断的C语言编程 C51编译器支持在C源程序中直接开发中断程序。前面已经讲过,中断服务程序是通过按规定语法格式定义的一个函数。(中断有关内容) 编号 中 断 源 入口地址 0 外部中断0 0003H 1 定时器/计数器0 000BH 2 外部中断1 0013H 3 定时器/计数器1 001BH 4 串行口中断 0023H 中断服务程序的函数定义的语法格式如下: Void 函数名(void) interrupt m [using n] { 中断程序代码;} m为MCS-51中断源编号,见表 using n 选项用于实现工作寄存器组的切换,n是中断服务子程序中选用的工作寄存器组号(0- 3)。 例2: 设AT89C52 的时钟频率为12MHz,利用定时中断在其P1.0 引脚输出周期为4ms,占空比为1:1的方波。 确定定时器工作方式和计算定时器初值。 选用定时器T0工作方式1,每个机器周期为1μs,翻转一次电平需要2ms,则 计数次数n=2000/1=2000, 初值x=65536-2000=63536=F830H 参考程序如下: #includeREG52.h sbit P10 = P1^0;//定义位 void clock_initial() reentrant using 0//在中断中调用,定义为重入函数 {TR0=0; TH0=0XF8;//装载计数初值 TL0=0X30; TR0=1;} main( ) { TMOD = 0x01; //定时器T0方式1 工作 P10 = 0; //初始值为低电平 TF0=0;//清除中断标志位 clock_initial(); ET0=1; EA=1; do{ } while(1); //死循环,等价于汇编语言的SJMP $ } void clk_int ( void ) interrupt 1 using 0 { P10= !P10;//逻辑变量 clock_initial(); } (延时中断) 例3: 图示是利用优先权解码芯片74LS148,在单片机8031的一个外部中断INT1上扩展多个中断源的原理电路图。图中是以开关闭合来模拟中断请求信号。当有任一中断源产生中断请求,能给8031的INT1引脚送一个有效中断信号,由P1的低3位可得对应中断源的中断号。 74LS148是8线-3线优先编码器,为输入端,为编码输出端,为扩展端。真值表见右图。只要有输入的中断请求,为低电平,申请中断。同时根据P10,P11,P12的值,可以判断出是那一个中断源提出的中断申请。 在中断服务程序中仅设置标志,并保存I/O口输入状态。 参考程序如下: # include reg51.h unsigned char status; bit flag=0; void service_int1( ) interrupt 2 using 2 // INT1中断服务程序,使用第3组工作寄存器 { flag=1; // 设置标志 status=P10x07; // 存输入口状态 } void main(void) {IP=0x04 ; // 置INT1为高优先级中断 IE=0x84 ; // INT1开中断,CPU开中断 for(; ;)//无限循环 { if(flag) // 有中断 { switch(status) // 根据中断源分支 { case 0 :{中断1程序;} break ; // 处理IN0 case 1 :{中断2程序;} break ; // 处理IN1 case 2 :{中断3程序;} break; // 处理IN2 case 3 :{中断4程序;} break; // 处理IN
文档评论(0)