关闭窗口.docx
《关闭窗口.docx》由会员分享,可在线阅读,更多相关《关闭窗口.docx(61页珍藏版)》请在冰豆网上搜索。
关闭窗口
文章编号:
346----加入日期:
02-9-15
『关闭窗口』
实时时钟芯片DS1302的C51程序列子
实时时钟模DS1302程序列子
/*********************************************************************/
/*实时时钟模块时钟芯片型号:
DS1302*/
/*/
/*********************************************************************/
sbitT_CLK=P2^7;/*实时时钟时钟线引脚*/
sbitT_IO=P1^4;/*实时时钟数据线引脚*/
sbitT_RST=P1^5;/*实时时钟复位线引脚*/
/********************************************************************
*
*名称:
v_RTInputByte
*说明:
*功能:
往DS1302写入1Byte数据
*调用:
*输入:
ucDa写入的数据
*返回值:
无
***********************************************************************/
voidv_RTInputByte(ucharucDa)
{
uchari;
ACC=ucDa;
for(i=8;i>0;i--)
{
T_IO=ACC0;/*相当于汇编中的RRC*/
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
/********************************************************************
*
*名称:
ucharuc_RTOutputByte
*说明:
*功能:
从DS1302读取1Byte数据
*调用:
*输入:
*返回值:
ACC
***********************************************************************/
ucharuc_RTOutputByte(void)
{
uchari;
for(i=8;i>0;i--)
{
ACC=ACC>>1;/*相当于汇编中的RRC*/
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
/********************************************************************
*
*名称:
v_W1302
*说明:
先写地址,后写命令/数据
*功能:
往DS1302写入数据
*调用:
v_RTInputByte()
*输入:
ucAddr:
DS1302地址,ucDa:
要写的数据
*返回值:
无
***********************************************************************/
voidv_W1302(ucharucAddr,ucharucDa)
{
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(ucAddr);/*地址,命令*/
v_RTInputByte(ucDa);/*写1Byte数据*/
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
*名称:
uc_R1302
*说明:
先写地址,后读命令/数据
*功能:
读取DS1302某地址的数据
*调用:
v_RTInputByte(),uc_RTOutputByte()
*输入:
ucAddr:
DS1302地址
*返回值:
ucDa:
读取的数据
***********************************************************************/
ucharuc_R1302(ucharucAddr)
{
ucharucDa;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(ucAddr);/*地址,命令*/
ucDa=uc_RTOutputByte();/*读1Byte数据*/
T_CLK=1;
T_RST=0;
return(ucDa);
}
/********************************************************************
*
*名称:
v_BurstW1302T
*说明:
先写地址,后写数据(时钟多字节方式)
*功能:
往DS1302写入时钟数据(多字节方式)
*调用:
v_RTInputByte()
*输入:
pSecDa:
时钟数据地址格式为:
秒分时日月星期年控制
*8Byte(BCD码)1B1B1B1B1B1B1B1B
*返回值:
无
***********************************************************************/
voidv_BurstW1302T(uchar*pSecDa)
{
uchari;
v_W1302(0x8e,0x00);/*控制命令,WP=0,写操作?
*/
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbe);/*0xbe:
时钟多字节写命令*/
for(i=8;i>0;i--)/*8Byte=7Byte时钟数据+1Byte控制*/
{
v_RTInputByte(*pSecDa);/*写1Byte数据*/
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
*名称:
v_BurstR1302T
*说明:
先写地址,后读命令/数据(时钟多字节方式)
*功能:
读取DS1302时钟数据
*调用:
v_RTInputByte(),uc_RTOutputByte()
*输入:
pSecDa:
时钟数据地址格式为:
秒分时日月星期年
*7Byte(BCD码)1B1B1B1B1B1B1B
*返回值:
ucDa:
读取的数据
***********************************************************************/
voidv_BurstR1302T(uchar*pSecDa)
{
uchari;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbf);/*0xbf:
时钟多字节读命令*/
for(i=8;i>0;i--)
{
*pSecDa=uc_RTOutputByte();/*读1Byte数据*/
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
*名称:
v_BurstW1302R
*说明:
先写地址,后写数据(寄存器多字节方式)
*功能:
往DS1302寄存器数写入数据(多字节方式)
*调用:
v_RTInputByte()
*输入:
pReDa:
寄存器数据地址
*返回值:
无
***********************************************************************/
voidv_BurstW1302R(uchar*pReDa)
{
uchari;
v_W1302(0x8e,0x00);/*控制命令,WP=0,写操作?
*/
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xfe);/*0xbe:
时钟多字节写命令*/
for(i=31;i>0;i--)/*31Byte寄存器数据*/
{
v_RTInputByte(*pReDa);/*写1Byte数据*/
pReDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
*名称:
uc_BurstR1302R
*说明:
先写地址,后读命令/数据(寄存器多字节方式)
*功能:
读取DS1302寄存器数据
*调用:
v_RTInputByte(),uc_RTOutputByte()
*输入:
pReDa:
寄存器数据地址
*返回值:
无
***********************************************************************/
voidv_BurstR1302R(uchar*pReDa)
{
uchari;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xff);/*0xbf:
时钟多字节读命令*/
for(i=31;i>0;i--)/*31Byte寄存器数据*/
{
*pReDa=uc_RTOutputByte();/*读1Byte数据*/
pReDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*
*名称:
v_Set1302
*说明:
*功能:
设置初始时间
*调用:
v_W1302()
*输入:
pSecDa:
初始时间地址。
初始时间格式为:
秒分时日月星期年
*7Byte(BCD码)1B1B1B1B1B1B1B
*返回值:
无
***********************************************************************/
voidv_Set1302(uchar*pSecDa)
{
uchari;
ucharucAddr=0x80;
v_W1302(0x8e,0x00);/*控制命令,WP=0,写操作?
*/
for(i=7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa);/*秒分时日月星期年*/
pSecDa++;
ucAddr+=2;
}
v_W1302(0x8e,0x80);/*控制命令,WP=1,写保护?
*/
}
/********************************************************************
*
*名称:
v_Get1302
*说明:
*功能:
读取DS1302当前时间
*调用:
uc_R1302()
*输入:
ucCurtime:
保存当前时间地址。
当前时间格式为:
秒分时日月星期年
*7Byte(BCD码)1B1B1B1B1B1B1B
*返回值:
无
***********************************************************************/
voidv_Get1302(ucharucCurtime[])
{
uchari;
ucharucAddr=0x81;
for(i=0;i<7;i++)
{
ucCurtime[i]=uc_R1302(ucAddr);/*格式为:
秒分时日月
星期年*/
ucAddr+=2;
}
}
对于PDF文件,建议您用“右键/目标另存为”下载到本地查看。
欢迎您到51虾坛欢迎您对本文提出您的见解。
如果本文侵犯了您的权益,请及时通知版主删除,谢谢!
文章编号:
322----加入日期:
02-9-30
『关闭窗口』
DS1820,一线数据传输,仅三条腿的单芯片温度测量,C51程序.
//芯片资料请到查找
//DS1820C51子程序
//这里以11.0592M晶体为例,不同的晶体速度可能需要调整延时的时间
//sbitDQ=P2^1;//根据实际情况定义端口
typedefunsignedcharbyte;
typedefunsignedint word;
//延时
voiddelay(worduseconds)
{
for(;useconds>0;useconds--);
}
//复位
byteow_reset(void)
{
bytepresence;
DQ=0;//pullDQlinelow
delay(29);//leaveitlowfor480us
DQ=1;//allowlinetoreturnhigh
delay(3);//waitforpresence
presence=DQ;//getpresencesignal
delay(25);//waitforendoftimeslot
return(presence);//presencesignalreturned
} //0=presence,1=nopart
//从1-wire总线上读取一个字节
byteread_byte(void)
{
bytei;
bytevalue=0;
for(i=8;i>0;i--)
{
value>>=1;
DQ=0;//pullDQlowtostarttimeslot
DQ=1;//thenreturnhigh
delay
(1); //for(i=0;i<3;i++);
if(DQ)value|=0x80;
delay(6);//waitforrestoftimeslot
}
return(value);
}
//向1-WIRE总线上写一个字节
voidwrite_byte(charval)
{
bytei;
for(i=8;i>0;i--)//writesbyte,onebitatatime
{
DQ=0;//pullDQlowtostarttimeslot
DQ=val&0x01;
delay(5);//holdvalueforremainderoftimeslot
DQ=1;
val=val/2;
}
delay(5);
}
//读取温度
charRead_Temperature(void)
{
union{
bytec[2];
intx;
}temp;
ow_reset();
write_byte(0xCC);//SkipROM
write_byte(0xBE);//ReadScratchPad
temp.c[1]=read_byte();
temp.c[0]=read_byte();
ow_reset();
write_byte(0xCC);//SkipROM
write_byte(0x44);//StartConversion
returntemp.x/2;
}
对于PDF文件,建议您用“右键/目标另存为”下载到本地查看。
欢迎您到51虾坛欢迎您对本文提出您的见解。
如果本文侵犯了您的权益,请及时通知版主删除,谢谢!
文章编号:
320----加入日期:
02-9-30
『关闭窗口』
keilc6.20c直接嵌入汇编的方法!
(C51BBS网友cuiwei)
上此站以来,得到大家的很多的帮助,感谢大家!
特此奉上"点心"一块供大家品尝。
希望
能增加你营养。
//
#ifdefASM
unsignedlongshiftR1(registerunsignedlong);
#else
externunsignedlongshiftR1(registerunsignedlong);
#endif
//endofasm.h
//
#defineASM
#include
#include
#pragmaOT(4,speed)
unsignedlong shiftR1(registerunsignedlong x)
{
#pragmaasm
clrc
mova,r4
rrca
movr4,a
mova,r5
rrca
movr5,a
mova,r6
rrca
movr6,a
mova,r7
rrca
movr7,a
#pragmaendasm
return(x);
}
//endofasm.c
将此源文件加入要编译的工程文件,
将光标指向此文件,选择右键菜单“optionforfile'asm.c'”,
将属性单“properties”中的“GenerateAssemblerSRCFile”“AssembleSRCFile”
两项设置成黑体的“√”将“LinkPublicOnly”的“√”去掉,再编译即可。
用此方法可以在c源代码的任意位置用#pragmaasm和#pragmaendasm嵌入汇编语句。
但要注意的是在直接使用形参时要小心,在不同的优化级别下产生的汇编代码有所不同,
可以察看对应的.lst文件看一看,得到正确的优化级别后,#pragmaOT(x,speed)锁定
优化级别(这里的值是0-9)。
如有别的问题给我发个邮件。
对于PDF文件,建议您用“右键/目标另存为”下载到本地查看。
欢迎您到51虾坛欢迎您对本文提出您的见解。
如果本文侵犯了您的权益,请及时通知版主删除,谢谢!
文章编号:
301----加入日期:
02-4-10
『关闭窗口』
CRC16-STANDARD的快速算法,51汇编。
本人在赤壁车站的系统设计中就利用CRC16-STANDARD算法,以保证信息的真确发送,该系统采用了485半双工通讯本人在赤壁车站的系统设计中就利用CRC16-STANDARD算法,以保证信息的真确发送,该系统采用了485半双工通讯。
效果很好!
(注:
CRC16算法包括有好几种算法,如:
CRC16_STANDARD
CRC16-NORMAL,大家小心了)
CRC16-STANDARD的快速算法
;入口:
R0-原CRC结果高位R1-原CRC结果低位R2-下个参与计算的字节值
;(最开始可设置R0=0,R1=0,R2=第一字节值)
;出口:
R0-CRC结果高位R1-CRC结果低位
影响:
A,DPH,DPL
CRC16:
PUSHDPH
PUSHDPL
PUSHACC
MOVA,R1
XRLA,R2
MOVDPH,#20h
MOVDPL,A
CLRA
MOVCA,@A+DPTR
XRLA,R0
MOVR1,A
INCDPH
CLRA
MOVCA,@A+DPTR
MOVR0,A
POPACC
POPDPL
POPDPh
RET
NOP
NOP
LJMPMAIN
ORG2000H;(根据你的实际情况而定)
CRCTABLE:
DB
000H,0C1H,081H,040H,001H,0C0H,080H,041H,001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB
001H,0C0H,080H,041H,000H,0C1H,081H,040H,000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB
001H,0C0H,080H,041H,000H,0C1H,081H,040H,000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB
000H,0C1H,081H,040H,001H,0C0H,080H,041H,001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB
001H,0C0H,080H,041H,000H,0C1H,081H,040H,000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB
000H,0C1H,081H,040H,001H,0C0H,080H,041H,001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB
000H,0C1H,081H,040H,001H,0C0H,080H,041H,001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB
001H,0C0H,080H,041H,000H,0C1H,081H,040H,000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB
001H,0C0H,080H,041H,000H,0C1H,081H,040H,000H,0C1H,081H,040H,001H,0C0H,080H,041H
DB
000H,0C1H,081H,040H,001H,0C0H,080H,041H,001H,0C0H,080H,041H,000H,0C1H,081H,040H
DB
00