//-----------------------函数声明,变量定义--------------------------------------------------------
#include
sbit DQ=P1^0; // 将p1.0口模拟时钟输出
//--------------------------------------------------------------------------------------------------
// 函数名称: delay
// 入口参数: N
// 函数功能:延时子程序,实现(16*N+24)us的延时
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
//--------------------------------------------------------------------------------------------------
void delay(unsigned int N)
{
int i;
for(i=0;i
}
//--------------------------------------------------------------------------------------------------
// 函数名称: Reset
// 入口参数: 无
// 返回deceive_ready
// 函数功能:复位
//--------------------------------------------------------------------------------------------------
unsigned char Reset(void)
{
unsigned char deceive_ready;
DQ=0; //拉低DQ线
delay(29); //延时至少480us~960us
DQ=1; //将DQ线设置位逻辑高
delay(3); //延时等待deceive_ready响应
deceive_ready=DQ; //采样deceive_ready信号
delay(25); //等待时序结束
return(deceive_ready); //有deceive_ready信号时返回0,否则返回1
}
//--------------------------------------------------------------------------------------------------
// 函数名称:read_bit
// 入口参数: 无
// 返回接收的数据
// 函数功能:读一个bit子程序
//--------------------------------------------------------------------------------------------------
unsigned char read_bit(void)
{
unsigned char i;
DQ=0; //拉低DQ线开始时序
DQ=1; //升高DQ线 //延时至时序开始15us
for(i=0;i<3;i++); //延时15us
return(DQ); //返回DQ值
}
//--------------------------------------------------------------------------------------------------
// 函数名称: write_bit
// 入口参数: bitval
// 函数功能:写一个bit子程序
//--------------------------------------------------------------------------------------------------
void write_bit(unsigned char bitval)
{
DQ=0; //拉低DQ线开始时序
if(bitval==1)
DQ=1; //如果写逻辑为高
delay(5); //延时
DQ=1; //升高DQ线
}
//--------------------------------------------------------------------------------------------------
// 函数名称: write_byte
// 入口参数: val
// 函数功能:写一个byte子程序
//--------------------------------------------------------------------------------------------------
void write_byte(unsigned char val)
{
unsigned char i,temp;
for(i=0;i<8;i++)
{
temp=val>>i; //将val位右移i位赋值给比temp
temp=temp&0x01; //取temp最低位
write_bit(temp);
delay(5); //延时至时序结束
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: read_byte
// 返回接收的数据 value
// 函数功能:读一个byte子程序
//--------------------------------------------------------------------------------------------------
unsigned char read_byte(void)
{unsigned char i,m,receive_data;
m=1;receive_data=0; //初始化
for(i=0;i<8;i++)
{
if(read_bit())
{
receive_data=receive_data+(m<
} //每读一位数据据,左移一位
delay(6); //延时至时序结束
}
return(receive_data); //返回value
}
关键字:I-wire总线 单总线 51程序
引用地址:
I-wire总线(单总线)读写51程序
推荐阅读最新更新时间:2024-03-16 14:34
SLE4442卡_IC的51单片机驱动程序
整理了最初的实验草稿版,将端口宏定义,函数声明以及常用的函数声明建立头文件,感觉清楚多了,在不断地修改中凝练,在不停的实践中提高,满眼的思绪,在小小的Readme中划过一笔~~~~~~~~ char data_RST , ErrorCount ; void IC_RST(void) { uchar value,i,count; DATA_IN; //IC输入 RST_LOW; //复位时序 CLK_LOW; DATA_HIGH; DelayUs(5); RST_HIGH; DelayUs(5); CLK_HIGH; DelayUs(5); CLK_LOW; DelayUs(5); RST_LOW; DelayUs(2); for(
[单片机]
HX1838红外无线遥控模块51单片机程序
红外无线模块: 1.硬件:红外接收器+遥控器 2.连接方式:接收器的+、-分别连接在单片机的VCC、GND上面,S为信号输出端连接在单片机的IO口上面(例程里面连接在了P3^2引脚) 3.遥控器上面每一个按键对应的键码值已经在程序中给出,程序的内容是用遥控器控制单片机上面的流水灯 单片机源程序如下: #include reg52.h //包含单片机寄存器的头文件 #include intrins.h //包含_nop_()函数定义的头文件 #define uchar unsigned char #define uint unsigned int sbit IRIN=P3^2; //红外接收器数据线 sb
[单片机]
51单片机复习程序例举004--HD44780控制的1602LCD
1、在HD44780控制的1602LCD的显示屏上显示两条字符串 和 两个用户自定义的字符 /****************************************************************************** * 说明:AT89S52芯片,12M晶振 * 外设:HD44780控制的1602LCD:两行显示,每行最多显示40个预显示字符中的16个字符 * 11条控制指令 * 本程序:在HD44780控制的1602LCD上显示2行字符串,按键K1,显示一个用户自定义字符 * 循环按键,循环显示 ***************************
[单片机]
51单片机双机通信硬件电路图及C程序
双机通信的硬件电路 需要注意的是,两单片机要保证正确通信,主机的RXD连接从机的TXD,从机的RXD连接主机的TXD。 双机通信C语言程序 (1)主机程序 #include #include #define _READY_ 0x06//主机握手信号 #define _BUSY_ 0x15//从机忙应答 #define_OK_ 0x00//从机准备好 #define _SUCC_ 0x0f//数据传送成功 #define _ERR_ 0xf0//数据传送失败 unsigned charTable ={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; unsigned char Bu
[单片机]
初学51单片机——简单的流水灯程序
#include reg52.h #include intrins.h //调用库函数 #define uint unsigned int #define uchar unsigned char void delay(uint);//延时函数 uchar a,b; void main() { a=0xfe; while(1) { P1=a; delay(500); a=_crol_(a,1);//利用库函数实现流水灯的左移 } } void delay(uint z) { uint i,j; for(i=z;i 0;i--) for(j=110;j 0;j--); }
[单片机]
51单片机-最终按键程序
1.代码及解析 我们先贴出代码,下面再进行解析原理 u8 KEY_Scan(u8 mode,u16 TIMES) { static u8 key_up=1; //按键松开标志 static u16 times; if(mode)key_up=1; //如果mode等于1,支持连按 if(key_up&&(KEY4==0||KEY8==0||KEY12==0||KEY16==0))//只要在key_up等于1时,其中一个按键被按下就可以进入执行代码 { times++; //记录进入低电平的时间 if(times =TIMES)//抖动的时间已经过去 {
[单片机]
DS18B20单总线数据传输
纯单片机干不了大事,必须得配上各种外设,那么了解单片机与传感器之间的数据通信就显得必不可少了。常见的单片机数据通信方式有SPI,IIC,RS232,单总线等等。每种通信方式都有相应的时序图,分析时序图并完成代码的编写是单片机学习者的必修课。本文以DS18B20为例分析一下单总线数据传输。 DS18B20是单总线数据传输,因此对于时序的要求就非常的高,学会分析其时序图是非常有必要的。 1.初始化时序图分析: 首先是由总线控制器拉低总线,维持480us。在480us后释放总线,由上拉电阻讲总线拉高。等待5-60us后,DS18B20开始响应,会将数据总线拉低60-240us.之后便释放总线,由上拉电阻拉高总线
[单片机]
基于Small RTOS51的PS/2键盘驱动程序开发
引言
随着嵌入式系统的发展,嵌入式软件设计向软件平台靠近,单片机软件设计不再是单一线程结构方式,而是逐步采用多任务的设计思想。实时操作系统使得实时应用程序的设计、扩展和维护变得更容易,无需大的改动就可以增加新的功能。然而随着任务的增加,要求输入的数据也会增加,类型也呈多样化。如果仍然用矩阵式扫描键盘,势必浪费单片机巨大的资源,且增加了成本。若用PC机标准PS/2键盘取而代之,将可解决以上矛盾。本文介绍基于实时操作系统Small RTOS51的PS/2键盘驱动程序的设计,具有响应快,移植性强,占用资源少等优点。
1 驱动的设计
驱动的实现一般可用以下几种方法:① 使用任务编写;② 使用消息编写;③ 使用信号量编写。PS/
[嵌入式]