谁能帮我解释一下这段程序的意思?最好每一句特别是开头那几句有什么作用?万分感谢

作者&投稿:爰琰 (若有异议请与网页底部的电邮联系)
谁能帮我解释一下这段程序?最好是逐条的。~

P2.0~P2.2为通道选择线,P2.6为IC选择线;P1.0为转换结束信号线;P0.0~P0.8为数据线;P2口被配置为第二功能,即地址线的高8位(低8位忽略),所以通道选择线的地址范围为C0FFH~C7FFH,采集的数据存放在30H开始的外部ram中。
详细解释:
ORG 0030H; 定位程序在ROM中的开始存储地址为30H
MOV R1, #30H; R1=30H
MOV R2, #8H; R2=8

MOV TL0, #0H; 定时器0的低8位为0
MOV TH0, #0B8H; 定时器0的高8位为B8H
MOV TMOD, #1H; 定时器0的工作方式为1,功能为定时器方式, 软件控制
CLR ET0; 禁止定时器0的中断
SETB TR0; 启动定时器0

MOV SCON, #40H; 设定串口为工作方式1,不允许接受
MOV DPTR, #0C0FF; 设置DPTR为C0FFH——ADC0809的通道选择地址
LOOP:
MOV A, R2; A=R2=8H
SUBB A, R1; A=A-R1
JNZ LOOP2; A!=0,则跳转到LOOP2处执行
MOV R1,#0H; R1=0;
MOV DPTR, #0COFF; DPTR=C0FF;
MOV R1, #OH;
MOV DPTR, #0C0FF;
LOOP1:
JNB TFO, LOOP1; 如果TF0!=1,则等待(循环执行本指令)
CLR TF0; TF0=0
MOV TL0, #0H; 定时器0的低8位为0
MOV TH0, #0B8H; 定时器0的高8位为B8H

LOOP2:
MOVX @DPTR, A; (DPTR)=A;实际是一条空操作,目的只是为了选择转 换器AD0809的通道0并开始经行AD转换

LOOP3:
JB P1.0,LOOP3; 判断P1.0是否为高;实际是判断AD转换是否开始(开始转换则EOC输出高电平)
LOOP4:
JNB P1.0,LOOP4; 判断P1.0是否为低;实际是判断AD转化是否结束(转换结束,则EOC输出为低电平)

MOVX A, @DOTR; A=(DPTR);读取转换后的数据
MOV @R1,A; (R1)=A;将转换后的数据存入到R1指示的地址中
INC DPH; DPH++;即选择下一个转换通道
INC R1; R1++;
LJMP LOOP; 调到LOOP开始执行程序
END

30H-8H=28H=40;所以一共转换40次,每个ADC0809有8个通道,所以我估计在每个通道前还有5个选择开关——DPH最后要加40,也就是P2.3~P2.5应该是5选1的地址线。

可以加分吗?
Option Explicit '使用变量必须先定义Private L(7) As Integer '定义数组LPrivate Jd(7) As Double '数组JDPrivate zj As Double '定义zj 为双精度型Private Sub Form_Load() '窗体载入事件Dim i As Integer '定义 i 为整数For i = 1 To 7 '循环开始 Me.Circle (4000, 4000), i * 500 '以下几句 是根据Shape1(i - 1).Top = 4000 - 90 '变量 i 值 Shape1(i - 1).Left = 4000 + i * 500 - 90 '在画图形L(i) = i * 500Jd(i) = 0 '以下几句 是设置 滚动(状态)条 属性HScroll1(i - 1).Max = 1000HScroll1(i - 1).Min = 100HScroll1(i - 1).Value = 100HScroll1(i - 1).SmallChange = 5HScroll1(i - 1).LargeChange = 100Next izj = 10 / 180 * 3.141592654 'zj 赋值End SubPrivate Sub HScroll1_Change(Index As Integer)'当 滚动条 值改变时Timer1(Index).Interval = 1100 - HScroll1(Index).Value'设置 绘图 时间 间隔End SubPrivate Sub Timer1_Timer(Index As Integer)'以下都是绘图的代码Jd(Index + 1) = Jd(Index + 1) + zjShape1(Index).Left = 4000 + L(Index + 1) * Cos(Jd(Index + 1)) - 90Shape1(Index).Top = 4000 - L(Index + 1) * Sin(Jd(Index + 1)) - 90End Sub

小弟只有10年VC++经验,帮你解读一下哦: 满意的话麻烦给我分.

如下代码是为了实现: 接收串口过来的数据! 首先初始化一个泛型类型接受容器, 接收串口接口发来的数据,然后显示在界面上的edit控件上!

VARIANT variant_inp; 用VARIANT 泛型变量类型 定义一个数组变量variant_inp; 泛型就是任何类型都可以放进去的意思. 作为缓冲池使用很适合.

COleSafeArray safearray_inp; 用COleSafeArray用OLE安全数据容器类 定义一个对象名字是 safearray inp 因为VARIANT虽然可以放任何类型数据到这个数组中,但该类型没有丰富的处理成员函数,说白了他是结构体不是类, 所以 需要做个转换, 转为COleSafeArray类型的数组类即可. 他具有非常丰富的成员函数.

那么, 你会问为什么不直接让safearray_inp=m_ctrlComm.GetInput(); 读缓冲区,而要经过一个中间变量呢?
variant_inp=m_ctrlComm.GetInput(); 读缓冲区
safearray_inp=variant_inp; VARIANT转换成COleSafeArray型变量

VARIANT和COleSafeArray 是什么关系呢?

原因是:

这中间有调用不同的重载=运算符,m_ctrlComm.GetInput(); 的数据可以转化为variant_inp,有默认的转化方式,而safearray_inp=variant_inp则是另一个转化方式,如果直接转,可能数据不对。
VARIANT和COleSafeArray 一个是结构体,一个是类,各自的数据构造不一样。

long k=0; 初始化一个长整型变量 k=0;
int len; 定义长度len,整数型.

BYTE rxdata[2048]; 定义接受数据的数组,2k大小,2048字节. 为BYTE类型,也即unsigned char类型.
CString strtemp; 定义一个CString类型的字符串strtemp;
if(m_ctrlComm.GetCommEvent()) 如果控制通信对象m_ctlComm有get的事件发生,
{

------------------------
这里应该加switch(ret) , 将上面getcommevent赋值给ret.

case 2: 事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); 控制通信器对象得到输入数据流. 如果GetCommEvent返回2,说明有字符到达了, 接收缓冲区内有字符
safearray_inp=variant_inp; 将variant inp转换为COleSafeArray 类型,付给safearry inp. 因为COleSafeArray提供了丰富的函数处理.符合我们的需要.

len=safearray_inp.GetOneDimSize(); 获取输入安全数组的长度len
for(k=0;k<len;k++) 做个循环,
{
safearray_inp.GetElement(&k,rxdata+k); 从输入的安全数组到rxdata进行数据拷贝. 一次一个字节拷贝.
}
for(k=0;k<len;k++) 做个循环. 读取len长度的所有字节.
{
BYTE bt=*(char*)(rxdata+k); 内存 rxdata 起始地址+k字节偏移的指针 取值,得到 一个字节.
strtemp.Format("%c",bt); strtemp赋值为bt,也就是一个字符.
m_strEditRXData+=strtemp; m_strEdit这个CEdit控件显示一直加长.
}
}
UpdateData(FALSE); 将内存变量数据更新到界面.

====================
参考:

VARIANT

  

C++、BASIC、Java、Pascal、Script......计算机语言多种多样,而它们各自又都有自己的数据类型,COM
产生目的,其中之一就是要跨语言(注3)。而 VARIANT
数据类型就具有跨语言的特性,同时它可以表示(存储)任意类型的数据。从C语言的角度来讲,VARIANT
其实是一个结构,结构中用一个域(vt)表示------该变量到底表示的是什么类型数据,同时真正的数据则存贮在 union
空间中。结构的定义太长了(虽然长,但其实很简单)大家去看 MSDN 的描述吧,这里给出如何使用的简单示例:

学生:我想用 VARIANT 表示一个4字节长的整数,如何做?
老师:VARIANT v; v.vt=VT_I4; v.lVal=100;

学生:我想用 VARIANT 表示布尔值“真”,如何做?
老师:VARIANT v; v.vt=VT_BOOL; v.boolVal=VARIANT_TRUE;
学生:这么麻烦?我能不能 v.boolVal=true; 这样写?
老师:不可以!因为
 

类型
字节长度
假值
真值

bool
1(char)
0(false)
1(true)

BOOL
4(int)
0(FALSE)
1(TRUE)

VT_BOOL
2(short int)
0(VARIANT_FALSE)
-1(VARIANT_TRUE)

  所以如果你 v.boolVal=true 这样赋值,那么将来 if(VARIANT_TRUE==v.boolVal)
的时候会出问题(-1 !=
1)。但是你注意观察,任何布尔类型的“假”都是0,因此作为一个好习惯,在做布尔判断的时候,不要和“真值”相比较,而要与“假值”做比较。
学生:谢谢老师,你太牛了。我对老师的敬仰如滔滔江水,连绵不绝......

学生:我想用 VARIANT 保存字符串,如何做?
老师:VARIANT v; v.vt=VT_BSTR; v.bstrVal=SysAllocString(L"Hello,你好");

学生:哦......我明白了。可是这么操作真够麻烦的,有没有简单一些的方法?
老师:有呀,你可以使用现成的包装类 CComVariant、COleVariant、_variant_t。比如上面三个问题就可以这样书写:CComVariant v1(100),v2(true),v3("Hello,你好"); 简单了吧?!(注4)

学生:老师,我再问最后一个问题,我如何用 VARIANT 保存一个数组?
老师:这个问题很复杂,我现在不能告诉你,我现在告诉你怕你印象不深......(注5)
学生:~!@#$%^&*()......晕!

VARIANT 数据类型在文件OAIDL.IDL中定义如下:

struct tagVARIANT {
  union {

  struct __tagVARIANT {

  VARTYPE vt;

  WORD wReserved1;

  WORD wReserved2;

  WORD wReserved3;

  union {

  ULONGLONG ullVal;

  LONGLONG llVal;

  LONG lVal;

  BYTE bVal;

  SHORT iVal;

  FLOAT fltVal;

  DOUBLE dblVal;

  VARIANT_BOOL boolVal;

  _VARIANT_BOOL bool;

  SCODE scode;

  CY cyVal;

  DATE date;

  BSTR bstrVal;

  IUnknown * punkVal;

  IDispatch * pdispVal;

  SAFEARRAY * parray;

  BYTE * pbVal;

  SHORT * piVal;

  LONG * plVal;

  LONGLONG * pllVal;

  FLOAT * pfltVal;

  DOUBLE * pdblVal;

  VARIANT_BOOL *pboolVal;

  _VARIANT_BOOL *pbool;

  SCODE * pscode;

  CY * pcyVal;

  DATE * pdate;

  BSTR * pbstrVal;

  IUnknown ** ppunkVal;

  IDispatch ** ppdispVal;

  SAFEARRAY ** pparray;

  VARIANT * pvarVal;

  PVOID byref;

  CHAR cVal;

  USHORT uiVal;

  ULONG ulVal;

  INT intVal;

  UINT uintVal;

  DECIMAL * pdecVal;

  CHAR * pcVal;

  USHORT * puiVal;

  ULONG * pulVal;

  ULONGLONG * pullVal;

  INT * pintVal;

  UINT * puintVal;

  struct __tagBRECORD {

  PVOID pvRecord;

  IRecordInfo * pRecInfo;

  } __VARIANT_NAME_4;

  } __VARIANT_NAME_3;

  } __VARIANT_NAME_2;

  DECIMAL decVal;

  } __VARIANT_NAME_1;
  };


哪位大神能帮我解释这段古文,万分感谢。张岱《冷泉亭》?
这几句原文出自张岱的散文集《西湖梦寻》中的《冷泉亭》一则。大致翻译:(当初)我(指作者张岱)住在西湖(边上),多数时间是住在西湖上的客船(把船)作为临时住所,(所以几乎)天天晚上都能看见西湖上的明月,现在又避开尘世的喧嚣、居住到(西湖附近)的灵隐寺里,夜晚(独自)坐在冷泉亭里面,又...

能帮我解释一下这两句话吗?
少来沉稳老来狂,是前人的经验。少年时代,活力有余而经验不足,正所谓壮志凌云而少不更事,行动的时候最好注意三思而行,可以避免犯下一些抱恨终生的错误,故而沉稳是少年成就大事业的一个需要自己留心培养的关键性格特质。当人生步入老年,对于大部分人来说,人生经验具足而心态沉闷,不再奢望高远的目标...

请帮我解释一下这段简单的JAVASCRIPT中一句话的意思
var regex=\/one(\\d{3})two(\\d{3})three(\\d{3})\/;是将正则表达式 赋给一个变量 regex : \/...\/;要匹配的正则表达式是:one(\\d{3})two(\\d{3})three(\\d{3})其中:"\\d" : 表示数字0-9,类似于[0-9];而重复次数用”{}”表示,例如:(\\d){2}表示重复前面的项,共2项,...

谁能帮我分析一下这段文字?
她没有解释,我们以前学的课文都会说因为学习因为玩之类的很累,但是她没有说原因!因为她心慌了!紧接着问你给我打这么多电话干嘛!大家都知道美国是一个很有礼貌的国家,一般都会问有什么可以帮助你的或者道歉,但是linda是直接问的!说明她彻底慌了,怕mary发现她昨晚杀了人!mary或许是发现linda的...

谁能帮我解释一下这段程序?最好是逐条的。
INC DPH; DPH++;即选择下一个转换通道 INC R1; R1++;LJMP LOOP; 调到LOOP开始执行程序 END 30H-8H=28H=40;所以一共转换40次,每个ADC0809有8个通道,所以我估计在每个通道前还有5个选择开关——DPH最后要加40,也就是P2.3~P2.5应该是5选1的地址线。

谁能帮我解释一下这段程序,是WT588D语音芯片的三线发码子程序
。8位数据发送完后需要把片选、数据端、时钟端置高。完成后需要延时20MS在判断忙信号,芯片放音时忙信号脚输出低电平,空闲时输出高电平。在忙信号端输出低电平时表示语音没有播放完成需要等待,置高后在发送下一个地址数据放音,不太清楚你If(dat==1)的意义。

帮我解释一下这段好吗,谢谢
剪一段旖旎时光,放任在流年里消散,独留落寞过往,随西风飘荡。 谱一曲摇曳情殇,流离于指尖的墨香,空守尘封惆怅,唱离人愁肠。- 红颜劫,相思冢 节时月,林里风。明竹深处溪洁明,卷叶初沉,波尾涟涟,皎洁三分能几回,浅饮暖醅丝竹摇。画雨残宵花落惹了伊人恼。沉风吟,残月冷话语苍凉,莫...

谁能帮我解释下这段英文的意思
我不想每天都待在家里,因为我害怕孤独。我害怕没有人和我聊天。为什么你总是大发脾气?我不知道我有什么过错。害怕只有我自己。所以,我需要朋友,你知道吗?我需要自由,你知道吗?需要属于我自己的房间,你知道吗?我不想和你争吵。真的。但我总是让你一次又一次的失望。我不能忍受。我不是一个...

谁能帮我解释一下这段歌词的意思吗?
你好,这段话并不是歌词,是西式婚礼中神父宣读的结婚誓词,原文如下:神父对新娘说:(新娘名),你是否愿意这个男子成为你的丈夫与他缔结婚约?无论疾病还是健康,无论贫穷还是富有,或任何其他理由,都爱他,照顾他,尊重他,接纳他,永远对他忠贞不渝直至生命尽头?新娘回答: 我愿意。神父又问新郎:...

有谁能帮我翻译这段文言文
东周想种水稻,西周不放水,东周为此而忧虑,苏子就对东周君说:“请让我去西周说服放水,可以吗?”于是去拜见西周君,说:“您的主意打错了!如果不放水,反而使东周有了致富的机会。现在东周的百姓都种麦子,没有种其他东西。您如果想坑害他们,不如突然一下子给他们放水,去破坏他们的庄稼。放下...

诏安县17587264833: 大侠,请帮我解释一下这段程序的意思,最好能具体一些,谢谢 -
枕尤一干: ZB = InStr(XY, "|") 在XY中查找"|"的位置 X = Clng(Left(XY, ZB - 1)) 取XY左边(ZB-1)个字符,即"|"前面的部分,并转换成Long类型 Y = Clng(Right(XY, Len(XY) - ZB)) 取XY右边(Len(XY) - ZB)个字符,即"|"后面的部分,并转换成Long类型 Len(XY)是XY的长度.

诏安县17587264833: 谁能解释下这段程序 的意思 最好每句带注释 -
枕尤一干: int max(int a[],int size)这个函数 就是说数组a里的数依次和max做比较,如果大于max,则max数值更新为当前比较的数值.最后出来的就是最大的数了.比如你的数组为 {2,45,12,6,23,98,13,3}; i=0时 a[0]>max(这个时候max=0) 条件成立所以 max = 2 i=1 a[1]>max(这个时候max=2) 条件成立所以 max = 45....依次下去,所有数组里的数据都比较完,最后就得出了最大的那个数.

诏安县17587264833: 帮我解释一下这段程序是什么意思 -
枕尤一干: 以前学过C 申明变量i,a,b,c,d num数组,count初始化=0 while条件(输出(整数,数组[count值]等于1时)) count++自增

诏安县17587264833: 求高手解释一下这段程序 -
枕尤一干: if(c>='a'&&c<='z'||c>='A'&&c<='Z') 如果字符是介于小写字符a,z或者大写字符A,Z之间.if(c==' ') 如果字符是空格 if(c>='0'&&c<='9') 如果字符是0-9这些数字.最后一个else,当然就是其它的字符了. 统计你输入的字符里这些字符包含的个数.

诏安县17587264833: c语言 帮我解释一下这段程序啊(越详细越好)!!!谢谢 -
枕尤一干: 这段程序的作用是输出1到500以内的质数 main()//主函数 { int i,j; for(i=1;i<=500;i++)//分别判断从1到500的数 { for(j=2;j<i;j++)//看i能否被小于它本身且大于1的数整除 { if(i%j==0) break;//如果能整除,说明不是质数,就直接跳出 } if(j>=i) printf("%d ",i);//如果i是质数,就不能被整除,上面的循环会进行到j==i而跳出循环,这里就要输出i,如果i不是质数,那上面的循环就会早早跳出,就会j<i,那么就不会输出i了 } getch();//暂停一个给你看结果 }

诏安县17587264833: 谁可以解释一下这段程序
枕尤一干: LD#success:L2.0是在局部变量表中做的,可以被主程序或其他子程序调用.

诏安县17587264833: 请问这段程序是什么意思,请各位高手指点一下?越详细越好.O(∩ - ∩)O谢谢 -
枕尤一干: 单纯看程序没啥意思逐行解释吧:void main(){ uchar k,t,Key_State; P0 = 0xff; P1 = 0xff while(1) { t = P1;;//t=(11111111)2...

诏安县17587264833: 谁知道这段程序是什么意思 -
枕尤一干: 我大概给你猜一下吧,应该是走芯机(纵切机)的程序,VZSHZ也许是副主轴的Z向坐标吧,Z=10应该就是在加工前,先把料送到需要加工的位置(表示第一主轴的Z坐标),Z=192.5-1.35也许只是为了程序清楚,本来需要的值是192.5,避让1.35以免干涉.

诏安县17587264833: 请问这段程序是啥意思,谁能帮忙详细解释下,刚学单片机跟C语言 -
枕尤一干: 严格意义上来说,这还不是正式程序代码部分呢,只是宏定义和变量定义部分.下面给出详细讲解: // 这三行应该是定义程序需要包含的库文件,也就是说程序中 // 会用到这些库文件中的函数,但你的代码中缺了可文件名. // 举例说,如果你的...

诏安县17587264833: 能高手解释下这段程序的意思 -
枕尤一干: 很简单. /* 参数:data是输入数据流 databytes是输入数据流的长度(字节) current是当前读取的位置,读完还要更新它 */ uint32_t Blowfish_stream2word(const uint8_t *data, uint16_t databytes, uint16_t *current) { uint8_t i; uint16_t j; uint32_t ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网