- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十讲
课题:MCS-51单片机控制与C语言二
教学目的:掌握C51的语法和编程方法
学习C51程序设计:常用程序设计
教学难点、重点:C51程序设计
课程复习、引入
已经复习了C语言的基本语法,学习了一些C51程序的编程,了解了C51程序的侧重点还是在针对MCS-51应用系统编程,在C51程序中对硬件的控制是学习本部分编程的重点。
C51对I/O的操作:对I/O口(P口)的操作通常就是I/O的控制,与常规C语言程序中的输入输出程序有区别。
接口的读写——
输入时需要先预置高电平
C51关于SFR的数据类型:
sbit :预定义SFR位标识符=可按位寻址的预定义SFR标识符^常量;
例:sbit LED=P1^3; sbit TR1 = 1;
Sfr ;特殊功能寄存器预定义标识符=绝对地址;REG51.H
例:sfr P1 = 0x90;
数据长度:
unsigned char/int/ long——8/16/32
signed char/int/ long——8/16/32
float——32
double——64
一般指针——24位
本课内容
第七章 MCS-51单片机控制与C语言
7.2.2 C语言对MCS-51单片机位处理器的运用
标准C语言中是没有比特变量的,8051单片机中有强大的位处理功能,如果不用将对编程效率是个很大的损失。Keil C51扩展了标准C语言,很好地支持了8051特有的位处理功能。如上文提到的sbit关键字,除了定义引脚以外还可以定义所有的特殊功能寄存器中可以位寻址的变量。如定义
sbit spcialbit=0xe1;
这时spcialbit就代表了累加器的第一位ACC.1。
Keil C51也可以通过扩展关键字bit来定义位变量。如
bit bitval;
这时bitval的值是0或1,它的实际物理地址将位于8051内部20H~2FH的可位寻址区。
使用举例:
Bitval=spcialbit;//将ACC.1的值赋给了bitval
If(bitval)button=0;else button=1;
Button=! Bitval;//含义同上一句
C语言管理MCS-51单片机内部定时器
两个定时器进行初始化C语言函数,给定时器1设置初始值,并启动定时器1:
Void InitTimer1(void)
{
TMOD=0x15; /*初始化定时器1为定时器工作方式,即对由系统晶振决定的机器周期进行计数,模式1,16位计数,由TMOD的高4位决定。
初始化定时器0为定时器工作方式,即对T0(P3.4)引脚上的脉冲进行计数,模式1,16位计数,由TMOD的低4位决定*/
TH1=0;TL1=0;//定时器1设初始值
TR1=1;//位处理指令,启动定时器1
}
TMOD复位值00H
7 6 5 4 3 2 1 0 GATE1 C/T M1 M0 GATE0 C/T M1 M0 TCON复位值00H
7 6 5 4 3 2 1 0 TF1 TR1 TF0 TR0 IE0 IT1 IE0 IT0 如果要在运行中查询定时器1是否溢出,就必须用位处理指令查询TF1。下面的程序段用查询方法在LED口上输出10Hz的方波。
例7-2 用查询方法在LED口上输出10Hz的方波。
//文件名:TF1.c
//定时器查询.系统晶体频率11.0592MHz
#include reg51.h
Sbit LED=P1^3;
Void INIT-TMR1(void)
{ TMOD=0x11;
TH1=0x4C; //(65536-50000us/(12cyc/11.0592 MHz))/256
TL1=0; //(65536-50000us/(12cyc/11.0592 MHz))%256
TR1=1;}
Void main(void)
{
INIT-TMR1( );
While(1)
{
If(TF1= =1)
{ LED=~LED;
TF1=0;
TH1=0x4C;
TL1=0; //TL0在溢出时正好为0,可以不写
}
}
}
注意:注释中的定时器时间常数计算公式,这个方式在模式1,即16位定时或计数模式可用:
THX=(65536-定时时长[us]/(机器周期数/时钟频率(MHz))/256
TLX=(65536-定时时长[us]/(机器周期数/时钟频率(MHz))%256
在定时器重装载过程中,TL1=0可以不写,有利于提高定时精度。
再举一计算定时器常数的例子:
已知P89C51RD2的机器周期为6个时钟周期,晶体用12 MHz,要求产生10ms定时,计算如下
文档评论(0)