c51单片机常见编程程序(c51单片机编程总结3)
学结文档有些乱,
1、c51单片机的DS18B20传感器温度显示编程要点
1、DS18B20的复位或者说初始化
DS18B20的复位,也是传感器的初始化,图是传感器的时序图,复位时序的编程步骤代码功能描述是DS18B20的1、2、3、4这四项要点。下面是程序的具体要点,和两种写作方式。
这个程序首先是用得比较直接的写法,DSPORT是与单片机引脚,默认情况下是高电平,根据上图描述1,i=70,和while(i--)是通过汇编指令一个指令所需要机器周期的延时综合,642us,然后有一个DSPORT引脚的高电平,接下来是一个while(DSPORT)的延时,当高电平延时过长,没有变为低电平时,就说明初始化失败。
下图是DS18B20的另一种写法,DDRA|=BIT(DR)相当于于单片机连接的正常高电平状态的赋值,PORTA&=~BIT(DR)取非变为低电平,然后延时函数拉低500毫秒,接下来PORTA|=BIT(DR)相当于高电平,然后是延时60us,接下来是输出态取反,也就是理论上的低电平,但是为了保险起见,用了两个while语句进行判断,确保DS18B20初始化的成功。
两种编程方式我更倾向于第二种复位方式,因为非常清晰的和时序对应。
2、DS18B20的写时序,
下图是DS18B20的写时序,电路图,
根据上图DS18B20的时序,下面是时序0和1的电平变化,定义局部变量i,DDRA|=BIT(DQ),是和单片机连接的初始态,一般为高电平。无论要传输0还是1,首先,连接线都要拉低为低电平,PORTA&=~BIT(DQ),即为拉低低电平。然后延时10us,即时序图的第1条,然后if语句判断接收的是1或是零,if的条件,Data&0x01判断传输的位是1还是0,是1就直接DDRA|=BIT(DQ),为高电平,或者为低电平PORTA&=~BIT(DQ),然后延时40us,然后释放总线,进行稍微延时,保持状态。代表完成一位写传输,
2.1另一种DS18B20写程序的方式。
这种方式是硬性规定引脚的电平,它是直接引脚拉低,然后应用i 的方式延时大约15us左右,这里是汇编指令的机器周期,程序表现不明显,下面的DSPORT=dat&0x01,代表一位是0或1,然后利用汇编指令的延时,语句延时,然后DSPORT=1,释放总线,
两种方式各有优劣,如果要理解第一种比较好理解。
3、DS18B20的读时序,
读时序和写时序类似,只要理解时序代表的意义,按时序意义写程序就好,
下图是读程序时序,首先右移一位,开始输出态DDRA|=BIT(DQ)即高电平,然后拉低电平PORTA&=~BIT(DQ),然后释放总线DDRA|=BIT(DQ),因为这个总线随机释放,可延续为低电平,虽然理论是高电平,然后为了进一步确定为输入态,进行一次电平的再确认,拉低电平,可能是高电平也可能是低电平,如果是高电平执行if语句,代表是读高电平,如果是低电平,跳过if语句,直接读0,并延时45us。
3.1另一种DS18B20读程序的方式。
下面这个程序,是严格按时序写的,明确了DS18B20引脚的时序电平变化,两个i 的语句,是执行了机器周期大约是六微秒。byte的移位,这里的i和while,也是为了延时,保证时序的读时间,这个程序没有对移位的0或1进一步判断,而上面程序进行了进一步判断。
2、Defined() 操作符
#if!define(LOCATION_H)#define_LOCATION_H
下划线仅仅是一种命名的规则或者习惯这个叫做条件编译,就是如果没有定义LOCATION_H就定义_LOCATION_H的意思
defined()函数检查某常量是否存在
若存在则返回true,否则返回false
PHP中define( )函数用来定义一个常量;
而defined( )函数用来检验常量是否存在,存在则返回true;否则返回false.
3、DS1302涓流充电计时钟芯片的编程要点
1、DS1302写入和读取时分秒的地址命令这里需要在程序中声明两个数组,这两个数组分别是读写数组的地址命令,第一行是读地址命令,第二行是写地址命令,根据秒分时日月周年的寄存器地址地位图,如下图,两个图是相似的,中间图是一字节的各位在读写时的各位电平设置,D0位是R/W位,当R时,位为1,W时,位为0,这样可知对应的读地址比写地址大1。
2.存储顺序是秒分时日月周年,存储格式是用BCD码
这里是初始时间线设置,用的是BCD码,不过是十六进制的表示方式。
3、Ds1302Write 函数功能 : 向DS1302命令(地址 数据)
CE或者rest,是一个意思,这里相当于片选信号,CE,在读、写数据时必须为高,该引脚有两个功能,第一是CE开始控制字访问移位寄存器的控制逻辑,其次,CE提供结束单字节或多字节数据传输的方法,但CE初始设置为0,有清空环境的意义,时钟线SCLK初始也为0,上升沿有效,然后CE为1,启动DS1302写命令,add&0x01代表从低位开始传输。sclk=1,sclk=0,一代表时钟线上升沿有效,sclk=0,代表为下一位传输提供低电平,保证高电平有效
这是程序的两种写法,下面的_nop_()函数更加标准,代表执行一条空指令,占执行一条指令的执行时间,延时一个指令周期。这是DS1302的写指令程序的两种写法的意义。主要还是根据时序图推理对应的写程序
4、Ds1302Read函数功能 : 读取一个地址的数据
单字节读,也是CE高电平有效,设置方式和写命令类似,看程序和时序图即可明白,最后CE=0,代表程序的读结束。dat = (dat>>1) | (dat1<<7); //dat1左移7位变成最高位,dat1右移一位变成次高位,循环操作就能够将数据完整的读出
5、Ds1302Init 函数功能 : 初始化DS1302.
这里主要看WP写保护的一行,对时钟/日历寄存器或RAM进行写操作之前,WP必须为零,当WP为高电平时,不能对其时钟/日历寄存器或RAM进行任何操作,0x8E是写保护寄存器的地址。
6、Ds1302ReadTime 函数功能 : 读取时钟信息
这个函数是读取时钟信息的,比较简单明了。
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com