本文目录一览:
C语言编程的while语句问题~
你怎么判断它只执行了一次呢???
补充:首先不清楚你的芯片具体是什么型号的,从程序上看应该是PIC16或者pic18系列的。也不清楚晶振频率是多少。
我提出我的怀疑及其推论:首先我怀疑while不是没有循环,而是一直循环了,但是Vsrb_average[0]并没有被赋值超过50以上的数值。(你可以加一条语句,在wihile大括号里,但不在任何if语句内的:loop++;让一个自定义变量自加,运行一两秒后看loop的数数值肯定很大)
因此怀疑AD采集过程并不准确。而为什么AD采集不准确呢,一般设置好并开启AD后采样和保持需要时间的(PIC单片机的数据手册里也提到)但你的程序设置是T0定时溢出后在中断里执行AD采集。这时候问题来了,你的TO的option_org寄存器等于0B11001111,也就是说设置T0定时器使用内部指令周期时钟(就是用单片机晶振所输入的频率定时)但PSA=0,预分频器不用于T0,所以当你的晶振是4M的时候,定时器0从计数到溢出只需要256uS。也就是说程序从WHILE开始到采集AD信号这段时间才比256us大不了多少,这根本不符合PIC单片机规定的采集时间。所以采集到的数据很小,根本不足进入while循环内部的哪两个if语句(一个IF语句是判断[50,600]这个区间,另一个是判断大于680这个范围)。
但当你屏蔽掉T0的初始化程序后,注意,这时候0PTION_REG寄存器等于0B11111111,如果TRCKI这个引脚是有脉冲充输入的话,T0定时器是会自动计数的,当溢出之后是会自动置位T0IF的(虽然没有设置T0IE,但T0IF满足条件后是会置位的),而你的总中断开关在主函数里INTCON|=0XC0;所以当T1定时器溢出之后,程序会在中断子函数里进行对T0的操作。
还有你的程序有些逻辑错误,AD结果应该是10位的,但你接收AD结果的数组a[2]却是8位的,那就丢失了两个位了。
如果还有问题,给我留言。
C语言编程,要求有反代码,功能不限,20行以上,求高手帮忙啊
#include "stdafx.h"
#include stdio.h //身份证号码升级
int main()
{
int i,wi=0;
char sh[19],a[4];
int w[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char y[12]={"10x98765432"};
printf("请输入15位身份证号码:");
scanf("%s",sh);
printf("\n");
for(i=15;i=6;i--)
sh[i+2]=sh[i];
sh[6]='1';sh[7]='9';
printf("\n");
for(i=0;i17;i++)
wi+=(sh[i]-'0')*w[i];
sh[17]=y[wi%11];
sh[18]='\0';
printf("18位身份证号码是:%s\n",sh);
}
汇编:
int main()
{
000B6C26 inc ebp
000B6C27 cld
int i, wi = 0;
000B6C28 mov dword ptr [wi],0
char sh[19];
int w[17] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
000B6C2F mov dword ptr [w],7
000B6C36 mov dword ptr [ebp-7Ch],9
000B6C3D mov dword ptr [ebp-78h],0Ah
000B6C44 mov dword ptr [ebp-74h],5
000B6C4B mov dword ptr [ebp-70h],8
000B6C52 mov dword ptr [ebp-6Ch],4
000B6C59 mov dword ptr [ebp-68h],2
000B6C60 mov dword ptr [ebp-64h],1
000B6C67 mov dword ptr [ebp-60h],6
000B6C6E ?? ??
000B6C6F ?? ??
000B6C70 ?? ??
000B6C71 ?? ??
000B6C72 add byte ptr [eax],al
000B6C74 add bh,al
000B6C76 inc ebp
000B6C77 test al,7
000B6C79 add byte ptr [eax],al
000B6C7B add bh,al
000B6C7D inc ebp
000B6C7E lods byte ptr [esi]
char sh[19];
int w[17] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
000B6C7F or dword ptr [eax],eax
000B6C81 add byte ptr [eax],al
000B6C83 mov dword ptr [ebp-50h],0Ah
000B6C8A mov dword ptr [ebp-4Ch],5
000B6C91 mov dword ptr [ebp-48h],8
000B6C98 mov dword ptr [ebp-44h],4
000B6C9F mov dword ptr [ebp-40h],2
char y[12] = { "10x98765432" };
000B6CA6 mov eax,dword ptr ds:[000BED84h]
000B6CAB mov dword ptr [y],eax
000B6CB1 mov ecx,dword ptr ds:[0BED88h]
000B6CB7 mov dword ptr [ebp-90h],ecx
000B6CBD mov edx,dword ptr ds:[0BED8Ch]
char y[12] = { "10x98765432" };
000B6CC3 mov dword ptr [ebp-8Ch],edx
cout"请输入15位身份证号码:";
000B6CC9 push 0BED94h
000B6CCE mov eax,dword ptr ds:[000C20C0h]
000B6CD3 push eax
000B6CD4 call std::operatorstd::char_traitschar (0B1302h)
000B6CD9 add esp,8
cin sh;
000B6CDC lea eax,[sh]
000B6CDF push eax
000B6CE0 mov ecx,dword ptr ds:[0C20BCh]
000B6CE6 push ecx
000B6CE7 call std::operatorchar,std::char_traitschar (0B10E1h)
000B6CEC add esp,8
for (i = 15; i = 6; i--)
000B6CEF mov dword ptr [i],0Fh
000B6CF6 jmp main+101h (0B6D01h)
000B6CF8 mov eax,dword ptr [i]
000B6CFB sub eax,1
000B6CFE mov dword ptr [i],eax
000B6D01 cmp dword ptr [i],6
000B6D05 jl main+117h (0B6D17h)
sh[i + 2] = sh[i];
000B6D07 mov eax,dword ptr [i]
000B6D0A mov ecx,dword ptr [i]
000B6D0D mov dl,byte ptr sh[ecx]
000B6D11 mov byte ptr [ebp+eax-32h],dl
000B6D15 jmp main+0F8h (0B6CF8h)
sh[6] = '1'; sh[7] = '9';
000B6D17 mov eax,1
000B6D1C imul ecx,eax,6
000B6D1F mov byte ptr sh[ecx],31h
000B6D24 mov eax,1
000B6D29 imul ecx,eax,7
000B6D2C mov byte ptr sh[ecx],39h
printf("\n");
000B6D31 mov esi,esp
000B6D33 push 0BEDB0h
000B6D38 call dword ptr ds:[0C2220h]
000B6D3E add esp,4
000B6D41 cmp esi,esp
000B6D43 call __RTC_CheckEsp (0B1398h)
for (i = 0; i17; i++)
000B6D48 mov dword ptr [i],0
000B6D4F jmp main+15Ah (0B6D5Ah)
000B6D51 mov eax,dword ptr [i]
000B6D54 add eax,1
000B6D57 mov dword ptr [i],eax
000B6D5A cmp dword ptr [i],11h
000B6D5E jge main+17Bh (0B6D7Bh)
wi += (sh[i] - '0')*w[i];
000B6D60 mov eax,dword ptr [i]
000B6D63 movsx ecx,byte ptr sh[eax]
000B6D68 sub ecx,30h
000B6D6B mov edx,dword ptr [i]
000B6D6E imul ecx,dword ptr w[edx*4]
000B6D73 add ecx,dword ptr [wi]
000B6D76 mov dword ptr [wi],ecx
000B6D79 jmp main+151h (0B6D51h)
sh[17] = y[wi % 11];
000B6D7B mov eax,dword ptr [wi]
000B6D7E cdq
000B6D7F mov ecx,0Bh
000B6D84 idiv eax,ecx
000B6D86 mov eax,1
000B6D8B imul ecx,eax,11h
000B6D8E mov dl,byte ptr y[edx]
000B6D95 mov byte ptr sh[ecx],dl
sh[18] = '\0';
000B6D99 mov eax,1
sh[18] = '\0';
000B6D9E imul ecx,eax,12h
000B6DA1 mov dword ptr [ebp-160h],ecx
000B6DA7 cmp dword ptr [ebp-160h],13h
000B6DAE jae main+1B2h (0B6DB2h)
000B6DB0 jmp main+1B7h (0B6DB7h)
000B6DB2 call ___report_rangecheckfailure (0B1415h)
000B6DB7 mov edx,dword ptr [ebp-160h]
000B6DBD mov byte ptr sh[edx],0
cout "18位身份证号码是:" sh "\n";
000B6DC2 push 0BEDB0h
000B6DC7 lea eax,[sh]
000B6DCA push eax
000B6DCB push 0BEDB4h
000B6DD0 mov ecx,dword ptr ds:[0C20C0h]
000B6DD6 push ecx
000B6DD7 call std::operatorstd::char_traitschar (0B1302h)
000B6DDC add esp,8
000B6DDF push eax
000B6DE0 call std::operatorstd::char_traitschar (0B1302h)
000B6DE5 add esp,8
000B6DE8 push eax
000B6DE9 call std::operatorstd::char_traitschar (0B1302h)
000B6DEE add esp,8
}
000B6DF1 jmp main+1F5h (0B6DF5h)
000B6DF3 jmp main+1F7h (0B6DF7h)
000B6DF5 xor eax,eax
000B6DF7 push edx
000B6DF8 mov ecx,ebp
000B6DFA push eax
000B6DFB lea edx,ds:[0B6E28h]
000B6E01 call @_RTC_CheckStackVars@8 (0B1159h)
000B6E06 pop eax
000B6E07 pop edx
000B6E08 pop edi
000B6E09 pop esi
000B6E0A pop ebx
000B6E0B mov ecx,dword ptr [ebp-4]
000B6E0E xor ecx,ebp
000B6E10 call @__security_check_cookie@4 (0B1050h)
000B6E15 add esp,164h
000B6E1B cmp ebp,esp
000B6E1D call __RTC_CheckEsp (0B1398h)
000B6E22 mov esp,ebp
000B6E24 pop ebp
000B6E25 ret
000B6E26 mov edi,edi
000B6E28 add eax,dword ptr [eax]
000B6E2A add byte ptr [eax],al
000B6E2C xor byte ptr [esi+0Bh],ch
000B6E2F add ah,cl
000B6E31 ?? ??
000B6E32 ?? ??
000B6E33 call dword ptr [ebx]
000B6E35 add byte ptr [eax],al
000B6E37 add byte ptr [eax+6Eh],bl
000B6E3A or eax,dword ptr [eax]
000B6E3C cmp bh,0FFh
000B6E3F inc dword ptr [eax+eax]
000B6E43 add byte ptr [esi+6Eh],dl
000B6E46 or eax,dword ptr [eax]
000B6E48 ins byte ptr es:[edi],dx
000B6E49 ?? ??
000B6E4A ?? ??
000B6E4B dec dword ptr [eax+eax]
000B6E4E add byte ptr [eax],al
000B6E50 push esp
000B6E51 outs dx,byte ptr [esi]
000B6E52 or eax,dword ptr [eax]
000B6E54 jns main+256h (0B6E56h)
000B6E56 ja main+258h (0B6E58h)
000B6E58 jae _main+2C2h (0B6EC2h)
000B6E5A add ah,cl
c语言编写一个程序,在电脑上读取单片机用Wi-Fi返回的数值怎么做
这个涉及的就比较多了。通常单片机通过串口和WIFI模块通信,难点是网络通信部分。首先要确定服务端和客户端。
如果电脑做服务端就要写个程序监听一个端口(也有现成的网络调试助手),然后配置WIFI模块链接电脑IP的那个端口,就建立通信了。之后模块要定期发送心跳包,防止链路断开电脑无法主动请求单片机的数据。这种情况是单片机主动发数据,当然链路建立之后电脑也可以主动读。
如果电脑做客户端,就要先配置WIFI为服务端(前提是你的模块有这个功能),然后电脑连接WIFI的IP地址就能访问。这种情况是电脑主动读。