❶ 請C語言高手來看看小弟的簡單程序怎麼錯這么多啊!求助!!!
你的程序編譯族桐不會報錯,但是計算出輪穗亮來的最大值和最小值不對,我給你改過了,你看看吧。
#include<stdio.h>
void abc(float x[],int y,float *sum,float *avg,float *max,float *min)
{
float *p;
int i;
*max=x[0];
*min=x[0];
p=x;
for(i=0;i<y;i++)
{
*sum=*sum+x[i];
if(*(p+i)>*max)
*max=*(p+i);
if(*(p+i)<*min)
*min=*(p+i);
}
*avg=*sum/y;
}
void main()
{
float num[80],he=0,pingjun,zuida,zuixiao;
int i,j;
printf("請輸入你要輸入數字的個數:\n");
scanf("%d",&j);
printf("請輸入%d個數字:\n",j);
for(i=0;i<j;i++) scanf("%f",&num[i]);
abc(num,j,&he,&pingjun,&zuida,&zuixiao);
printf("它們的和是:%.2f\n它們臘寬的平均值是:%.2f\n它們的最大值是:%.2f\n它們的最小值是:%.2f\n",he,pingjun,zuida,zuixiao);
}
❷ VC++6.0編譯C語言出錯
程序沒有錯誤,打出這種調試信息是正常現象,程序已經執行完畢,雀晌跟蹤一下即可。
參考:
'ntdll.dll', no matching symbolic information found
在運行程序的時候,會出現一系列的information found的提示 信息,這並不是程序代碼錯誤的原因,是調試本身的問題,如果在程或慎序最後,出現
The program 'C:\Documents and Settings\yytju\桌面\boost_vc\Debug\boost_vc.exe' has exited with code 0 (0x0)
類似於這樣的code是0的語句,則表明程序是對的.
但是,有一個問題就衫歲敬是這樣的話,表現形式是黑屏一閃,如果想看到結果,就在main最後一句之前加一個斷點,則可以看到結果了
❸ 嵌入式溫濕度感測器C語言代碼求幫忙注釋
#include "ioCC2430.h" //包含頭文件,相應的板子以及感測器一些信息
#include "hal.h"
#include <math.h>
//#include <intrins.h>
#include <stdio.h>
typedef union //定義聯合體,
{
unsigned int i;
float f;
} value; //定義聯合體類型名稱為value
#define noACK 0
#define ACK 1
#define STATUS_REG_W 0x06 //0x06 = 0000 0110
#define STATUS_REG_R 0x07 //0x07 = 0000 0111
#define MEASURE_TEMP 0x03 //0x03 = 0000 0011
#define MEASURE_HUMI 0x05 //0x05 = 0000 0101
#define RESET 0x1e //0x1e = 0001 1110
#define SDA P1_6 //定義SDA代表的是P1_6腳
#define SCL P1_7
#define begin P2_0
unsigned char d1,d2,d3,d4,d5,d6,d7; //定義無符號字元型變數
void Wait(unsigned int ms) //定義wait函數,主要用於軟體循環,延時作用
{
unsigned char g,k;
while(ms)
{
for(g = 0;g <= 167; g++)
{
for(k = 0;k <= 48; k++);
}
ms--;
}
}
void QWait() //1us的延時
{
asm("NOP"); //加入匯編操作語句,空操作,主要用於機器周期執行
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
void initUART(void) //初始化單片機的串口
{
IO_PER_LOC_USART0_AT_PORT0_PIN2345(); //具體函數的定義與用法,你得參考頭文件中的程序代碼了
IO_DIR_PORT_PIN(1, 6, IO_OUT);
IO_DIR_PORT_PIN(1, 7, IO_OUT);
//IO_IMODE_PORT_PIN(1, 6, IO_IMODE_TRI);
//IO_IMODE_PORT_PIN(1, 7, IO_IMODE_TRI);
IO_DIR_PORT_PIN(2, 0, IO_OUT);
IO_FUNC_PORT_PIN(2, 0, IO_FUNC_GIO);
//SET_MAIN_CLOCK_SOURCE(RC);
SET_MAIN_CLOCK_SOURCE(CRYSTAL);
UART_SETUP(0, 115200, HIGH_STOP); //設置傳輸數據的波特率115200
UTX0IF = 1;
U0CSR |= 0XC7; //U0CSR = U0CSR | 0x1010 0111 (進行位或操作)
IEN0 |= 0x84;
SDA = 1;
SCL = 0;
}
int putchar (int c) //定義輸入字元函數,給的參數是一個整型的數
{
if (c == ' ') //判斷參數c的值是否和' '的值相等
{
while (!UTX0IF); //執行的時候UTX0IF的值是0,此處不是很理解?
UTX0IF = 0; //給UTX0IF賦0
U0DBUF = 0x0d; //U0DBUF賦值0x0d = 0000 1011
}
while (!UTX0IF);
UTX0IF = 0;
return (U0DBUF = c); //如果c的值不是' '也就是換行符的時候,將c的值傳遞到U0DBUF寄存器中
}
char s_write_byte(unsigned char value) //定義寫位元組函數(8位)
{
unsigned char i,error = 0;
for (i = 0x80;i > 0;i /= 2) //i 賦初始值0x80 = 128, 執行判斷是i > 0,執行語句是i = i / 2; 即i = 128,64,32,16,8,4,2,1,0.5(0),8位
{
if (i & value)
SDA = 1;
else
SDA = 0;
SCL = 1; //此時SCL埠處,也就是p1_7引腳處是高電平
QWait(); //因為寫入需要時間,所以程序之中加入下面幾條語句
QWait();
QWait();
QWait();
QWait();
SCL = 0; //使能p1_7眼角處低電平,使的數據寫入(具體需要看單片機控制晶元的手冊
asm("NOP");
asm("NOP");
}
SDA = 1;
SCL = 1;
asm("NOP");
error = SDA;
QWait();
QWait();
QWait();
SDA = 1;
SCL = 0;
return error;
}
char s_read_byte(unsigned char ack) //讀取數據,按照位元組位的順序讀取(8位)128 = 1000 0000 ,64 = 0100 0000, 32 = 0010 0000 ,16 = 0001 0000, 8 = 0000 1000, 4 = 0000 0100 , 2 = 0000 0010, 1 = 0000 0001
{
unsigned char i,val = 0;
SDA= 1;
for(i = 0x80;i > 0;i /= 2) //同上
{
SCL = 1;
if (SDA) //判斷SDA處是否有高電平
val = (val | i); //進行或操作
else
val = (val | 0x00);
SCL = 0;
QWait();
QWait();
QWait();
QWait();
QWait();
}
SDA = !ack;
SCL = 1;
QWait();
QWait();
QWait();
QWait();
QWait();
SCL = 0;
SDA = 1;
return val; //返回讀取到的數據,一個位元組,八位
}
void s_transstart(void) //傳輸使能函數,就是給控制器引腳處相應電平,使對應模塊工作
{
SDA = 1;
SCL = 0;
QWait();
QWait();
SCL = 1;
QWait();
QWait();
SDA = 0;
QWait();
QWait();
SCL = 0;
QWait();
QWait();
QWait();
QWait();
QWait();
SCL = 1;
QWait();
QWait();
SDA = 1;
QWait();
QWait();
SCL = 0;
QWait();
QWait();
}
void s_connectionreset(void) //復位操作函數
{
unsigned char i;
SDA = 1;
SCL = 0;
for(i = 0;i < 9; i++)
{
SCL = 1;
QWait();
QWait();
SCL = 0;
QWait();
QWait();
}
s_transstart(); //調用開始函數
}
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) //函數,主要統計傳輸的數據個數
{
unsigned er = 0;
unsigned int i,j;
s_transstart();
switch(mode)
{
case 3 :er += s_write_byte(3);
break;
case 5 :er += s_write_byte(5);
break;
default :break;
}
for(i = 0;i < 65535;i++)
{
for(j = 0;j < 65535;j++)
{if(SDA == 0)
{
break;
}
}
if(SDA == 0)
{
break;
}
}
if(SDA)
{
er += 1;
}
*(p_value) = s_read_byte(ACK);
*(p_value + 1) = s_read_byte(ACK);
*p_checksum = s_read_byte(noACK);
d6 = *(p_value);
d7=*(p_value + 1);
return er;
}
void calc_sth11(float *p_humidity ,float *p_temperature)//計算溫度值
{
const float C1 =- 4.0;
const float C2 =+ 0.0405;
const float C3 =- 0.0000028;
const float T1 =+ 0.01;
const float T2 =+ 0.00008;
float rh =* p_humidity;
float t =* p_temperature;
float rh_lin;
float rh_true;
float t_C;
t_C = t * 0.01 - 44.0 ;
rh_lin = C3 * rh * rh + C2 * rh + C1;
rh_true = (t * 0.01 - 40.0 - 25) * (T1 + T2 * rh) + rh_lin;
if(rh_true > 100)
{
rh_true = 100;
}
if(rh_true < 0.1)
{
rh_true = 0.1;
}
*p_temperature = t_C;
*p_humidity = rh_true;
}
void main() //主函數
{
value humi_val,temp_val; //聲明兩個聯合體變數
unsigned char error,checksum; //聲明兩個無符號的字元型變數
initUART(); //初始化串口
P1INP |= 0xC0; //初始化P1引腳 , 0xC0 = 1010 0000 ,使P1_7和P1_5引腳為1
begin = 0;
s_connectionreset();
while(1) //無限循環操作
{
error = 0;
error += s_measure((unsigned char*) &humi_val.i,&checksum,5); //讀入串口的數據進行溫度的計算
d1 = d6;
d2 = d7;
error += s_measure((unsigned char*) &temp_val.i,&checksum,3);
d3 = d6;
d4 = d7;
if(error != 0)
s_connectionreset();
else
{
humi_val.f = (float)humi_val.i;
temp_val.f = (float)temp_val.i;
humi_val.f = d1 * 256 + d2;
temp_val.f = d3 * 256 + d4;
calc_sth11(&humi_val.f,&temp_val.f);
printf("temp:%5.1fC humi:%5.1f%% ",temp_val.f,humi_val.f);
// printf("t1:%x h1:%x ",d1,d2);
//printf("t2:%x h2:%x ",d3,d4);
}
Wait(150);
}
}
❹ 單片機C語言中0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,這些數是什麼意思,有什麼作用
0x表示十六進制的意思,就是後面兩位數是十六進制的數
❺ C語言 位運算
###位運算的邏輯:
1:(位與)運算符(&):雙目操作符,當兩個位進行相與時,只有兩者都為「1」時結果才為「1」(即:全真為真,一假為假),運算規則如下:
左運算量 右運算量 &運算結果
0 & 0 = 0
0 & 1 = 0
1 & 0 = 州明 0
1 & 1 = 1
運算:
例:
#include <stdio.h>
int main(int argc,char *crgv[]){
unsigned char x=0156, y=0xaf, z;
z=x&y;
printf("%d",z)
}
結果為:0x2e
運算過程:態燃0156(8進制)==0000 0110 1110(2進制);
進行 &(位與運算)
0xaf(16進制) ==0000 1010 1111(2進制);
結果:0000 0010 1110(2進制)==0x2e(十六進制);
2:位或運算符(|):
雙目操作符,當兩個 位 進行相或時,兩者中只要有一方為「1」,結果就為「1」(即:一真為真,兩假為假),運算規則如下:
左運算量 右運算量 (|) 運算結果
0 | 0 = 0
1 | 1 = 1
0 | 1 = 1
1 | 1 = 1
例:
#include <stdio.h>
int main(int argv,char *argc[]){
unsigned char x=027,y=0x75;
z=x|y;
}
運行過程:
027(8進制)=0001 0111(2進制)
進行 |(位或運算)
0x75(16進制)=0111 0101(2進制)
結果:0111 0111(2進制)=0x77(16進制)
3.異或運算(^):
當兩個位進行異或時,只要兩者相同,結果為「0」,否者結果為「1」,(即:同假異真)運算規則如下:
左運算量 右運算量 (^) 運算結果
0 ^ 0 = 0
1 ^ 1 帆跡虛 = 0
0 ^ 1 = 1
1 ^ 0 = 1
例:
#include
int main(int argv,char *argc[]){
unsigned(無符號) char x=25,y=0263,z;
z=x^y;
printf("%d\n",z);
}
運算過程:
25(十進制)=0001 1001(二進制)
運算 ^(異或運算)
0263(8進制)=1011 0011(二進制)
結果:1010 1010(二進制)=0252(8進制)
4:移位操作符(「<<」 或 ">>"):位移位運算的一般形式:<運算量><運算符><表達式>;
<運算量>必須為整型結果數值:
<運算符>為左移位(<<)或 右移位(>>)運算;
<表達式>也必須為整型結果數值;
移位操作就是把一個數值左移或右移若干位;假如左移n位,原來值最左邊的n位數被丟掉,右邊n衛補「0」 ;右移操作就是和左移操作移動方向相反;
符號位的處理方法:
(1):邏輯移位,不考慮符號問題,原數值右移n位後,左邊空出的n歌位置,用0填充;
(2):算術移位,原來值進行了右移操作後,需要保證符號位不變,因此,右移n位後,左邊空出的n個位置,用原數值的符號位填充。原來若是負數,則符號位為「1」,填充的位也是「1」;原來若是正數,則符號位為「0」,填充的位也是「0」,這樣保證移位後的數據與原數正負相同;
例:「1000 1001」將其右移兩位,邏輯移位的結果為「0010 0010」,算術移位為:「1110 0010」;
將其左移兩位,邏輯移位和算術移位的結果為:「0010 0100」;
(3)***補充:特定位清零(由「1」變成「0」)用 位與 操作;特定位變「1」(由「0」變成「1」)用 位或操作;
例:
a、請把0xd5的第2位進行清零操作
0xd5=1101 0101=>1101 0001
1111 1011
~0000 0100
=0000 0001<<2
~(0x01<<2)&0xd5
b、請把0xed的第3位進行清零操作
0xed=1110 1101=>1110 0101
1111 0111
~
0000 1000
= 0000 0001<<3
~(0x01<<3)&0xed
c、請把0x7d的第2-4位進行清零
0x7d=0111 1101=>0110 0001
1110 0011
~
0001 1100
=
0000 0111<<2
~(0x07)&0x7d
d、請把0x7d的第2位和第3位進行清零
0x7d=0111 1101=>0111 0001
1111 0011
~
0000 1100
0000 0011<<2
~(0x03<<2)&0x7d
e、請把0xc7的第4位進行置1
0xc7=1100 0111=>1101 0111
0001 0000
=0000 0001<<4
=~(0x01<<4)|0xc7
f、請把0x87的第3位進行置1
0x87=1000 0111=>1000 1111
0000 1000
~(0x01<<3)|0x87
g、請把0xc7的第3—5位置1
0xc7=1100 0111=>1111 1111
0011 1000
0000 0111<<3
~(0x07<<3)|0x87
❻ 單片機C語言中0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,有什麼作用
0x表示十六進制的意思,就是後面兩位數是十六進制的數
❼ C語言getc()函數是用來獲得文件流的一個一個字元,字元是一個位元組為什麼可以把中文給讀出來
這個問題。比較者渣復雜。
簡單的說一下吧。
第一個:漢字的編碼是有好幾種的。UTF-8,UNICODE之類的。所有仔者的漢字編碼都不止一個位元組。
有的編碼漢字是用2個位元組表示的。有的更多。
有的編碼方式中漢字的念嫌薯位元組數甚至不固定。有的漢字位元組2個,有的3個4個。
你能讀取出來的主要原因是因為讀取到固定的幾個位元組後,系統會翻譯一下顯示出漢字。
比如讀取的是一種編碼是2個位元組的漢字。系統讀取2個位元組後會翻譯,顯示在控制台上。
大概就是這個意思。如果要深入了解的話,那就必須要你自己去學了。
❽ 溫度顯示C程序修改
#include<reg52.h>
#include<ds1820.h>
#include"嘩搏disp.h"
#define date P0
//各數據口定義
sbit disp1=P2^7;
sbit disp2=P2^6;
sbit disp3=P2^5;
sbit disp4=P2^4;
sbit key1=P1^4;
sbit key2=P1^5;
sbit key3=P1^6;
sbit beerr=P3^7;
sbit jdx=P3^4;
sbit dj=P3^5;
unsigned char disp[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc7,0x89}; //數碼管顯示內碼
unsigned char disptemp[4]={0,2,1,4};
unsigned char dispnum=0;
char THtem=0,TLtem=0;
float temtemp;/****************************************************************
延時程序
*****************************************************************/
delay(unsigned int ms)
{
unsigned char i;
while(--ms)
for(i=0;i<200;i++);}
/**************************************************************
讀取溫度後顯示程序鉛蘆搏
***************************************************************/
display()
{
date=disp[disptemp[0]];
disp1=0;
disp2=1;
disp3=1;
disp4=1;
delay(3);
date=disp[disptemp[1]]&0x7f;
disp1=1;
disp2=0;
disp3=1;
disp4=1;
delay(3);
date=disp[disptemp[2]];
disp1=1;
disp2=1;
disp3=0;
disp4=1;
delay(3);
date=disp[disptemp[3]];
disp1=1;
disp2=1;
disp3=1;
disp4=0;
delay(3);
}/**************************************************************
讀取溫度後顯示程序
***************************************************************/
display2()
{
date=disp[disptemp[0]];
disp1=0;
disp2=1;
disp3=1;
disp4=1;
delay(3);
date=disp[disptemp[1]]&0x7f;
disp1=1;
disp2=0;
disp3=1;
disp4=1;
delay(3);
date=disp[disptemp[2]];
disp1=1;
disp2=1;
disp3=0;
disp4=1;
delay(3);
date=0xc7;
disp1=1;
disp2=1;
disp3=1;
disp4=0;
delay(3);
}
/**************************************************************
讀取溫度後顯示槐祥程序
***************************************************************/
display3()
{
date=disp[disptemp[0]];
disp1=0;
disp2=1;
disp3=1;
disp4=1;
delay(3);
date=disp[disptemp[1]]&0x7f;
disp1=1;
disp2=0;
disp3=1;
disp4=1;
delay(3);
date=disp[disptemp[2]];
disp1=1;
disp2=1;
disp3=0;
disp4=1;
delay(3);
date=0x89;
disp1=1;
disp2=1;
disp3=1;
disp4=0;
delay(3);
}
/***************************************************************
設置上下限時的溫度顯示程序
****************************************************************/
display1(dat1,dat2,dat3,dat4)
{
date=dat1;
disp1=0; //第一位數碼管顯示
disp2=1;
disp3=1;
disp4=1;
delay(3);
date=dat2;
disp1=1;
disp2=0; //第二位數碼管顯示
disp3=1;
disp4=1;
delay(3);
date=dat3;
disp1=1;
disp2=1; //第三位數碼管顯示
disp3=0;
disp4=1;
delay(3);
date=dat4;
disp1=1;
disp2=1;
disp3=1;
disp4=0; //第四位數碼管顯示
delay(3);
}
/*********************************************************
***************蜂鳴器*************************************
**********************************************************/
void beer()
{
unsigned char i;
beerr=!beerr;
for(i=0;i<60;i++);
}
/********************************************************
主程序
*********************************************************/
main()
{
bit i=0;
delay(1000); //開機延時
ReadTHTLTemperature(&TLtem,&THtem); //從DS18B20里讀取溫度上下限度
while(1){
if(key3==0){
delay(10);
if(key3==0){
dispnum++;
if(dispnum>=3)
dispnum=0;
P2=0XFF;
while(key3==0)beer();
WriteTHTLTemperature(&TLtem,&THtem); //當設置完溫度上下限後寫入DS18B20
}
}
if(key1==0){
delay(10);
if(key1==0){ if(dispnum==3||dispnum==4)
dispnum=0;
if(dispnum==1){ //設置溫度加
THtem++;
if(THtem>=100)
THtem=0;
} if(dispnum==2){
TLtem++;
if(TLtem>=100)
TLtem=0;
} P2=0XFF;
while(key1==0)beer();
}
}
if(key2==0){
delay(10);
if(key2==0){ i=!i; if(dispnum==3&&i==0)
dispnum=4;
if((dispnum==0||dispnum==4)&&i==1)
dispnum=3;
if(dispnum==1){
THtem--;
if(THtem<=0) //設置溫度減
THtem=99;
} if(dispnum==2){
TLtem--;
if(TLtem<=0)
TLtem=99;
}
P2=0XFF;
while(key2==0)beer();
}
}
if(dispnum==0){ //只顯示溫度狀態
temtemp=ReadTemperature();
if((temtemp>TLtem)&&(temtemp<THtem))
{
display();
}
temp_data_turn(temtemp);
if((temtemp>TLtem)&&(temtemp<THtem))
{
display();
jdx=0;
dj=0;
}
// display();
if(temtemp<TLtem)
{
jdx=1;
dj=0;
display2();
} //
if(temtemp>THtem)
{
jdx=0;
dj=1;
display3();
} //
}
if(dispnum==1||dispnum==4){ //數碼管顯示設置上限溫度 display1(0xf8,0x89,disp[THtem/10],disp[THtem%10]); }
if(dispnum==2||dispnum==3){ //數碼管顯示設置下限溫度
display1(0xf8,0xc7,disp[TLtem/10],disp[TLtem%10]);
}
}
}