大家好,今天来为大家分享BitCnt的一些知识点,和bitcnt翻译的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
本文目录
51单片机I2C总线读一个字节if(SDA==1)retc=retc+1;是什么意思求单片机程序:汇编语言数字钟翻译这段代码一个51单片机电子钟程序,求详细的解释啊急急急!!!51单片机I2C总线读一个字节if(SDA==1)retc=retc+1;是什么意思retc=0;//变量retc归零
retc=retc<<1;//变量向左移位
if(SDA==1)retc=retc+1;//这句话,其实就是接收一个位,因为上一句向左移位了,所以这句话就要接收下一位了,向左移位,最低位为0,如果接收管脚为0,那么就是0,如果为1,那么rec变量应该最低位变为1,程序里+1,其实就是变最低为1,以完成数据位的正确接收
求单片机程序:汇编语言数字钟用DS1302+单片机比较简单;DS1302程序(51汇编)
;推荐
;1.每次上电,必须把秒寄存器高位(第7位)设置为0,时钟才能走时。
;2.如果需要写入数据和时钟日历信息,必须把“写保护”寄存器设置成为0
;内存数据定义
BitCntdata3Ch;数据位计数器
ByteCntdata3Dh;数据字节计数器
Commanddata3Eh;命令字节地址
RcvDatDATA40H;接收数据缓冲区
XmtDatDATA50H;发送数据缓冲区
;端口位定义
IO_DATAbitP1.6;数据传送总线
SCLKbitP1.5;时钟控制总线
RSTbitP1.7;复位总线
RSBITP3.5
RWBITP3.6
ENBITP3.7
ORG0000H
ORG0013H
LCALLJKS
AJMPKS
;****************************;mainprogram
ORG0030H
KS:CLRRST
MOVSP,#2AH
;----LCD初始化----
CLREN;使能端为0,液晶执行命令
INIT_LCD:
MOVA,#38H;双列显示,字形5*7点阵
ACALLWCOM
ACALLDELAY1
MOVA,#38H;双列显示,字形5*7点阵
ACALLWCOM
ACALLDELAY1
MOVA,#38H;双列显示,字形5*7点阵
ACALLWCOM
ACALLDELAY1
MOVA,#0CH;开显示,关光标
ACALLWCOM
ACALLDELAY1
MOVA,#01H;清除LCD显示屏
ACALLWCOM
ACALLDELAY1
MOVA,#06H;地址加1
ACALLWCOM
ACALLDELAY1
;------------------------------------初始化1302-------------------------
SET1302:
LCALLWrite_Enable;写允许
LCALLOsc_Disable
LCALLWrite_Multiplebyte;初始化1302,将我们要设定的数据写入
LCALLRead_Multiplebyte;将我们设定的数据读出来
LCALLOsc_Enable
START:
ACALLLCD
LCALLRead_Multiplebyte
AJMPSTART
;---------------------LCD显示-------------------------
LCD:
MOVA,#11001000B
LCALLWCOM
MOVA,#0;显示时间
MOVA,42H
LCALLSSH2
MOVA,#00111010B
LCALLWDATA
MOVA,41H
LCALLSSH2
MOVA,#00111010B
LCALLWDATA
MOVA,40H
LCALLSSH2
MOVA,#11000000B
LCALLWCOM
MOVA,#0;显示日期字符
MOVA,46H
LCALLSSH2
MOVA,#00101101B
LCALLWDATA
MOVA,44H
LCALLSSH2
MOVA,#00101101B
LCALLWDATA
MOVA,43H
LCALLSSH2
RET
SSH2:
MOVB,#16
DIVAB
MOV58H,B
MOV59H,A
MOVA,59H
MOVDPTR,#TAB
MOVCA,@A+DPTR
ACALLWDATA
MOVA,58H
MOVDPTR,#TAB
MOVCA,@A+DPTR
ACALLWDATA
RET
;-----------------------------------------------------
;写指令、数据使能子程序
;-----------------------------------------------------
WCOM:;写指令使能
ACALLDELAY0
MOVP0,A
CLRRS
CLRRW
CLREN
CLREN
CLREN
SETBEN
RET
WDATA:;写数据使能
ACALLDELAY0
MOVP0,A
SETBRS;RS=H,RW=L,D0-D7=数据,E=高脉冲
CLRRW
CLREN
CLREN
CLREN
SETBEN
RET
;****判忙音****
DELAY0:
MOVP0,#0FFH
CLRRS
SETBRW
CLREN
NOP
SETBEN
JBP0.7,DELAY0
RET
TAB:DB00110000B,00110001B,00110010B,00110011B
DB00110100B,00110101B,00110110B,00110111B
DB00111000B,00111001B
;********************************************************************************************
;发送数据程序
;名称:Send_Byte
;描述:发送ByteCnt个字节给被控器DS1302
;命令字节地址在Command中
;所发送数据的字节数在ByteCnt中发送的数据在XmtDat缓冲区中
;********************************************************************************************
Send_Byte:
CLRRST;复位引脚为低电平所有数据传送终止
NOP
CLRSCLK;清时钟总线
NOP
SETBRST;复位引脚为高电平逻辑控制有效
NOP
MOVA,Command;准备发送命令字节
MOVBitCnt,#08h;传送位数为8
S_Byte0:
RRCA;将最低位传送给进位位C
MOVIO_DATA,C;位传送至数据总线
NOP
SETBSCLK;时钟上升沿发送数据有效
NOP
CLRSCLK;清时钟总线
DJNZBitCnt,S_Byte0;位传送未完毕则继续
NOP
S_Byte1:;准备发送数据
MOVA,@R0;传送数据过程与传送命令相同
MOVBitCnt,#08h
S_Byte2:
RRCA
MOVIO_DATA,C
NOP
SETBSCLK
NOP
CLRSCLK
DJNZBitCnt,S_Byte2
INCR0;发送数据的内存地址加1
DJNZByteCnt,S_Byte1;字节传送未完毕则继续
NOP
CLRRST;逻辑操作完毕清RST
RET
;***************************************************************************************
;接收数据程序;
;名称:Receive_Byte
;描述:从被控器DS1302接收ByteCnt个字节数据
;命令字节地址在Command中
;所接收数据的字节数在ByteCnt中接收的数据在RcvDat缓冲区中
;***********************************************************************************
Receive_Byte:
CLRRST;复位引脚为低电平所有数据传送终止
NOP
CLRSCLK;清时钟总线
NOP
SETBRST;复位引脚为高电平逻辑控制有效
MOVA,Command;准备发送命令字节
MOVBitCnt,#08h;传送位数为8
R_Byte0:
RRCA;将最低位传送给进位位C
MOVIO_DATA,C;位传送至数据总线
NOP
SETBSCLK;时钟上升沿发送数据有效
NOP
CLRSCLK;清时钟总线
DJNZBitCnt,R_Byte0;位传送未完毕则继续
NOP
R_Byte1:;准备接收数据
CLRA;清类加器
CLRC;清进位位C
MOVBitCnt,#08h;接收位数为8
R_Byte2:
NOP
MOVC,IO_DATA;数据总线上的数据传送给C
RRCA;从最低位接收数据
SETBSCLK;时钟总线置高
NOP
CLRSCLK;时钟下降沿接收数据有效
DJNZBitCnt,R_Byte2;位接收未完毕则继续
MOV@R1,A;接收到的完整数据字节放入接收内存缓冲区
INCR1;接收数据的内存地址加1
DJNZByteCnt,R_Byte1;字节接收未完毕则继续
NOP
CLRRST;逻辑操作完毕清RST
RET
;--写保护寄存器操作------------------------------------------
Write_Enable:
MOVCommand,#8Eh;命令字节为8E
MOVByteCnt,#1;单字节传送模式
MOVR0,#XmtDat;数据地址覆给R0
MOVXmtDat,#00h;数据内容为0写入允许
ACALLSend_Byte;调用写入数据子程序
RET
;当写保护寄存器的最高位为1时禁止数据写入寄存器---------------
Write_Disable:
MOVCommand,#8Eh;命令字节为8E
MOVByteCnt,#1;单字节传送模式
MOVR0,#XmtDat;数据地址覆给R0
MOVXmtDat,#80h;数据内容为80h禁止写入
ACALLSend_Byte;调用写入数据子程序
RET;返回调用本子程序处
;当把秒寄存器的第7位时钟停止位设置为0时起动时钟开始---------
Osc_Enable:
MOVCommand,#80h;命令字节为80
MOVByteCnt,#1;单字节传送模式
MOVR0,#XmtDat;数据地址覆给R0
MOVXmtDat,#00h;数据内容为0振荡器工作允许
ACALLSend_Byte;调用写入数据子程序
RET;返回调用本子程序处
;当把秒寄存器的第7位时钟停止位设置为1时时钟振荡器停止HT1380进入低功耗方式---------------
Osc_Disable:
MOVCommand,#80h;命令字节为80
MOVByteCnt,#1;单字节传送模式
MOVR0,#XmtDat;数据地址覆给R0
MOVXmtDat,#80h;数据内容为80h振荡器停止
ACALLSend_Byte;调用写入数据子程序
RET;返回调用本子程序处
;写入00年6月21日星期三13时59分59---------------------
Write_Multiplebyte:
MOVCommand,#0BEh;命令字节为BEh
MOVByteCnt,#8;多字节写入模式此模块为8个
MOVR0,#XmtDat;数据地址覆给R0
MOVXmtDat,#59h;秒单元内容为59h
MOVXmtDat+1,#59h;分单元内容为59h
MOVXmtDat+2,#13h;时单元内容为13h
MOVXmtDat+3,#21h;日期单元内容为21h
MOVXmtDat+4,#06h;月单元内容为06h
MOVXmtDat+5,#03h;星期单元内容为03h
MOVXmtDat+6,#0;年单元内容为00h
MOVXmtDat+7,#0;写保护单元内容为00h
ACALLSend_Byte;调用写入数据子程序
RET;返回调用本子程序处
;读出寄存器0-7的内容程序设置如下
Read_Multiplebyte:
MOVCommand,#0BFh;命令字节为BFh
MOVByteCnt,#8;多字节读出模式此模块为8个
MOVR1,#RcvDat;数据地址覆给R1
ACALLReceive_Byte;调用读出数据子程序
RET;返回调用本子程序处
DELAY1:;延时10MS
MOV21H,#75
D2:MOV22H,#100
DJNZ22H,$
DJNZ21H,D2
RET
;=============================================================================================
END
翻译这段代码简单来说,就是一个电机驱动+共阳数码管+5按键的小demo。
5按键控制正转、反转、停止、加速、减速。
数码管显示方向和占空比。
一个51单片机电子钟程序,求详细的解释啊急急急!!!#include<AT89X51.H>
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//定义显示用的段码
unsignedchardispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义显示用的位码
unsignedchardispbuf[8]={0,0,16,0,0,16,0,0};//定义显示缓冲区
unsignedchardispbitcnt;//定义显示的位
unsignedcharsecond;//定义秒
unsignedcharminite;//定义分钟
unsignedcharhour;//定义小时
unsignedinttcnt;//定义定时累加器
unsignedcharmstcnt;//定义毫秒累加器
unsignedchari,j;
voidmain(void)//主函数
{
TMOD=0x02;//设置定时器工作模式
TH0=0x06;//设置初值
TL0=0x06;
TR0=1;//开定时器
ET0=1;//开定时器中断
EA=1;//开总中断
while(1)
{
if(P0_0==0)//判断P00口的按键是否按下
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);//延时消抖
if(P0_0==0)//判断按键真的按下了
{
second++;//秒加1
if(second==60)//秒加到60?
{
second=0;//秒清零
}
dispbuf[0]=second;//取秒的个位放在显示缓冲
dispbuf[1]=second/10;//取秒的十位放在显示缓冲
while(P0_0==0);//等待,知道按键松开
}
}
if(P0_1==0)//p01的按键按下,设置分钟,请参考秒的程序,一样的
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
dispbuf[3]=minite;
dispbuf[4]=minite/10;
while(P0_1==0);
}
}
if(P0_2==0)//p02的按键按下,设置小时,请参考秒的程序,一样的
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[6]=hour;
dispbuf[7]=hour/10;
while(P0_2==0);
}
}
}
}
voidt0(void)interrupt1using0//定时器中断函数
{
mstcnt++;//累加器加一
if(mstcnt==8)//计时满8毫秒?
{
mstcnt=0;//累加器清零
P1=dispcode[dispbuf[dispbitcnt]];//送显示段码
P3=dispbitcode[dispbitcnt];//送显示位码
dispbitcnt++;//显示位加1
if(dispbitcnt==8)//8位都显示完了?
{
dispbitcnt=0;//从第一位开始显示
}
}
tcnt++;//累加器加一
if(tcnt==4000)//记满1秒
{
tcnt=0;//累加器清零
second++;//秒加一
if(second==60)//秒满60?
{
second=0;//秒清零
minite++;//分钟加一
if(minite==60)//分钟满60
{
minite=0;//分钟清零
hour++;//小时加1
if(hour==24)//小时满24
{
hour=0;//小时清零
}
}
}
dispbuf[0]=second;//将时分秒的个位与十位分开,装在显示区
dispbuf[1]=second/10;
dispbuf[3]=minite;
dispbuf[4]=minite/10;
dispbuf[6]=hour;
dispbuf[7]=hour/10;
}
}
其实这个程序不难,仔细想想,有不懂的再问我吧
关于BitCnt,bitcnt翻译的介绍到此结束,希望对大家有所帮助。
本文地址:http://www.cj8845.cn/13556.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 931614094@qq.com 举报,一经查实,本站将立刻删除。