文档库 最新最全的文档下载
当前位置:文档库 › nRF905射频芯片无线通信C程序调试

nRF905射频芯片无线通信C程序调试

nRF905射频芯片无线通信C程序调试
nRF905射频芯片无线通信C程序调试

#include"c8051F310.h"

#include"nRF905.h"

#include"my_type.h"

#include "math.h"

sbit SCK0 = P1^0;

sbit MISO0 = P1^1;

sbit MOSI0 = P1^2;

sbit CSN = P1^3;// 905SPI使能

sbit PWR = P1^4;

sbit CE = P1^5;

sbit TXE = P1^6;

sbit CD = P1^7;

sbit AM = P2^0;

sbit DR = P2^1;

sbit uCK = P2^2;

sbit CS = P3^1;// 331SPI使能

sbit D1 = P3^3;

sbit K1 = P2^7;

#define LED1_ON() D1=0

#define LED1_OFF() D1=1

xdata UINT8 RECIEVE[4];

INT8 AX0;

INT8 A Y0;

INT8 AZ0;

UINT8 AX00;

UINT8 AY00;

UINT8 AZ00;

enum {UART_BUFFER_SIZE=4};

code TxAddress[4]={0xcc,0xcc,0xcc,0xcc};

UINT8 who,reg1,status,k=0;

UINT8 TxRxBuff[9];

UINT8 ConfigBuff[10];

UINT8 idata RFConfig[10]=

{

0x6b, //CH_NO,配置频段在433MHZ

0x2c, //输出功率为10db,重发,节电为正常模式

0x44, //地址宽度设置,为4字节

0x09,0x09, //接收发送有效数据长度,最大9字节

0xCC,0xCC,0xCC,0xCC, //接收地址

0x58 //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振

};

//*************************延时25ms*n*******************************************

void delay25ms(UINT8 n)

{

UINT8 i;

TMR2RLL = 0x9D;

TMR2RLH = 0x38;

TMR2L = 0x9D;

TMR2H = 0x38;

TMR2CN = 0x04;

for(i=0;i

{

while(!TF2H);

TF2H=0;

}

TR2=0;

}

//*************************延时500us*n*******************************************

void delay500us(UINT8 n)

{

UINT8 i;

TCON = 0x10;

TMOD = 0x02;

CKCON = 0x02;

for(i=0;i

{

while(!TF0);

TF0=0;

}

TR0=0;

}

//*************************延时50us*n*******************************************

void delay50us(UINT8 n)

{

UINT8 i;

TCON = 0x10;

TMOD = 0x02;

CKCON = 0x02;

TL0 = 0xE6;

TH0 = 0xE6;

for(i=0;i

{

while(!TF0);

TF0=0;

}

TR0=0;

}

//*************************SPI读子函数*******************************************

UINT8 SpiRead(void)

{

UINT8 i;

UINT8 data_buff=0;

for(i=0;i<8;i++)

{

data_buff<<=1;

SCK0=1;

if(MISO0) data_buff+=1;

SCK0=0;

}

return data_buff;

}

//*************************SPI写子函数*******************************************

void SpiWrite(UINT8 WriteData)

{

UINT8 i;

UINT8 data_buff;

data_buff=WriteData;

for(i=0;i<8;i++)

{

if((data_buff&0x80)!=0)

MOSI0=1;

else

MOSI0=0;

SCK0=1;

// Delay(1);

delay50us(1);

SCK0=0;

data_buff<<=1;

}

}

//*************************RF905引脚初始化*******************************************

void nRF905Init(void )

{

CSN=1; //SPI disable

SCK0=0; //SPI clock line init LOW

// DR=1; //Init DR for input

// AM=1; //Init AM for input

// CD=1; //Init CD for input

PWR=1; //nRF905 power on

CE=0; //Set nRF905 in standby mode

TXE=0; //Set radio in Rx mode

}

//*************************RF905初始化配置*******************************************

void Config905(void)

{

UINT8 i;

CSN=0; //SPI enable for write a spi command

SpiWrite(WC); //Write config command

for(i=0;i<10;i++)

{

SpiWrite(RFConfig[i]);

}

CSN=1; //Disable spi

}

//*************************读RF905配置寄存器*******************************************

void ReadConfig905(void)

{

UINT8 i;

CSN=0;

SpiWrite(RC);

for(i=0;i<10;i++)

{

ConfigBuff[i]=SpiRead();

}

CSN=1;

}

//*************************RF发射数据包*******************************************

void TxPacket(void)

{

UINT8 i;

CSN=0;

SpiWrite(WTP); //Write payload command

for(i=0;i<9;i++)

{

SpiWrite(TxRxBuff[i]); //Write Tx data

}

CSN=1; //SPI disable

delay50us(1);

//Delay(1); // Delay

CSN=0; // spi enable for write a spi command

SpiWrite(WTA); // write address command

for(i=0;i<4;i++) // write 4 byte address

{

SpiWrite(TxAddress[i]);

}

CSN=1;

//CE=1; //Set TRX_CE high ,start Tx data transmission

//Delay(10);

delay50us(8);

CE=0;

}

//*************************RF发射模式设置*******************************************

void SetTxMode(void)

{

CE=1;

//TXE=1;

// Delay(1); // delay for mode change(>=650us)

delay50us(1);

}

//*************************RF接收模式设置*******************************************

void SetRxMode(void)

{

CE=1;

TXE=0;

// Delay(1);

delay50us(1);

}

//*************************载波检测******************************************* UINT8 CheckCD(void) //Pin->检查是否已存在同频率载波

{

if (CD==1)

{

return 1;

}

else

{

return 0;

}

}

//*************************RF正式发射*******************************************

void TX(void)

{

SetTxMode(); // Set nRF905 in Tx mode

TxPacket(); // Send data by nRF905

CheckCD(); // 返回CD的当前电平

// SetRF_PA_PWR(unsigned char i); //设置发射功率

}

//*************************数据准备好检测(用于接收)************************************

UINT8 CheckDR(void)

{

if(DR==1 && CE==1 && TXE==0)

{

return 1;

}

else

{

return 0;

}

}

//*************************RF接收数据包*******************************************

void RxPacket(void)

{

UINT8 i;

// Delay(100);

delay50us(80);

CE=0;

CSN=0;

//Delay(1);

delay50us(1);

SpiWrite(RRP);

for(i=0;i<9;i++)

{

TxRxBuff[i]=SpiRead();

}

CSN=1;

// Delay(10);

delay50us(8);

CE=1;

}

//*************************RF正式接收*******************************************

void RX(void)

{

UINT16 i=50;

SetRxMode();

while(CheckDR()==0)//等待接收数据的出现

{

if((i--)<10)break;

}

//Delay(10);

delay50us(8);

RxPacket();

//Delay(10);

delay50us(8);

}

void Oscillator_Init(void)

{

OSCICN = 0x83;

}

void LED_Light(void)

{

LED1_ON();

//delay1ms(500);

delay25ms(20);

LED1_OFF();

}

////////////////////////UART0//////////////////////////

void Timer_Init()

{

TCON = 0x40;

TMOD = 0x20;

TH1 = 0x96;

}

void UART_Init()

{

SCON0 = 0x10;

}

void Port_IO_Init()

{

// P0.0 - SCK (SPI0), Push-Pull, Digital

// P0.1 - MISO (SPI0), Open-Drain, Digital

// P0.2 - MOSI (SPI0), Push-Pull, Digital

// P0.3 - NSS (SPI0), Push-Pull, Digital(片选线没有使用,从机仅有一片) // P0.4 - TX0 (UART0), Push-Pull, Digital

// P0.5 - RX0 (UART0), Open-Drain, Digital

// P0.6 - INT1, Open-Drain, Digital(中断1)

// P0.7 - INT2, Open-Drain, Digital(中断2)

// P1.0 - SCK0, Push-Pull, Digital

// P1.1 - MISO0, Open-Drain, Digital

// P1.2 - MOSI0, Push-Pull, Digital

// P1.3 - CSN, Push-Pull, Digital(905SPI使能)

// P1.4 - PWR, Push-Pull, Digital

// P1.5 - CE, Push-Pull, Digital

// P1.6 - TXE, Push-Pull, Digital

// P1.7 - CD, Open-Drain, Digital

// P2.0 - AM, Open-Drain, Digital

// P2.1 - DR, Open-Drain, Digital

// P2.2 - uCK, Push-Pull, Digital

// P2.3 - FIRE, Push-Pull, Digital

// P2.7 - K1, Open-Drain, Digital

// P3.1 - CS, Push-Pull, Digital(LSI331DLSPI使能)

// P3.3 - D1, Push-Pull, Digital(指示灯)

P0 |=0xE2;

P1 |=0x82;

P2 |=0x83;

P0MDOUT = 0x1D;

P1MDOUT = 0x7D;

P2MDOUT = 0x0C;

P3MDOUT = 0x0A;

XBR0 = 0x03;

XBR1 = 0x40;

}

void SPI_Init()

{

SPI0CFG = 0x40;//主机模式

SPI0CN = 0x09;//4线制单主机,SPI使能

SPI0CKR = 0x30;//SPI时钟为250KHz

}

//*************************中断初始化配置*******************************************

void Interrupts_Init()

{

IE = 0x90; //开启全局中断、UART0中断使能、SPI0中断禁止

}

//*************************LIS331_Write***************************************** **

void LIS331_Write (unsigned char address, unsigned char value)

{

CS = 0;

SPI0DA T = address;

while (!SPIF);

SPIF = 0;

SPI0DA T = value;

while (!SPIF);

SPIF = 0;

CS=1;

delay500us(2);

}

//*************************LIS331_Read***************************************** **

unsigned char LIS331_Read (unsigned char address)

{

CS = 0;

SPI0DA T = address;

while (!SPIF);

SPIF = 0;

SPI0DA T = address;

while (!SPIF);

SPIF = 0;

CS = 1;

delay500us(2);

return SPI0DA T;

}

void Init_Device(void)

{

Oscillator_Init();

Port_IO_Init();

nRF905Init();

Config905();

Timer_Init();

UART_Init();

SPI_Init();

Interrupts_Init();

}

UINT8 i;

void main(void)

{

PCA0MD &=(~0x40);//看门狗禁止

Init_Device();

LED_Light();

delay25ms(20);

ReadConfig905();

// LIS331_Write(0x20,0x47);

//who=LIS331_Read(0x8f);

// reg1=LIS331_Read(0xa0);//shoud return 0x47;

//status=LIS331_Read(0xa7);//shoud return status

while(1)

{

/*if(RECIEVE[0]==0xad)

{

if(RECIEVE[3]==RECIEVE[1]+RECIEVE[2])

{

AX0=LIS331_Read(0xA9);

AX00=abs(AX0);

A Y0=LIS331_Read(0xAB);

AY00=abs(AY0);

AZ0=LIS331_Read(0xAD);

AZ00=abs(AZ0);

TxRxBuff[0]=RECIEVE[0];

TxRxBuff[1]=RECIEVE[1];

TxRxBuff[2]=RECIEVE[2];

TxRxBuff[3]=RECIEVE[3];

TxRxBuff[4]=AX00;

TxRxBuff[5]=A Y00;

TxRxBuff[6]=AZ00;

TxRxBuff[7]=0xaa;

TxRxBuff[8]=0xbb;

TXE=1;

TX();

LED1_ON();

TxRxBuff[0]=0;

TxRxBuff[1]=0;

TxRxBuff[2]=0;

TxRxBuff[3]=0;

TxRxBuff[4]=0;

TxRxBuff[5]=0;

TxRxBuff[6]=0;

delay25ms(1);

TXE=0;

LED1_OFF();

delay25ms(4);

}

}*/

TxRxBuff[0]=9;

TxRxBuff[1]=8;

TxRxBuff[2]=7;

TxRxBuff[3]=6;

TxRxBuff[4]=5;

TxRxBuff[5]=4;

TxRxBuff[6]=3;

TxRxBuff[7]=2;

TxRxBuff[8]=1;

TXE=1;

TX();

LED1_ON();

TxRxBuff[0]=0;

TxRxBuff[1]=0;

TxRxBuff[2]=0;

TxRxBuff[3]=0;

TxRxBuff[4]=0;

TxRxBuff[5]=0;

TxRxBuff[6]=0;

TxRxBuff[7]=0;

TxRxBuff[8]=0;

delay25ms(1);

TXE=0;

LED1_OFF();

delay25ms(4);

}

}

//*************************UART0中断服务程序*******************************************

void UART0_ISR() interrupt 4

{

ES0=0;

RECIEVE[k]=SBUF0;

if(RECIEVE[0]!=0xad)//如果收到的第一个数据不是前导码则放弃本次接收。

{

RECIEVE[0]=0x00;

}

else

{

k++;

if(k>=UART_BUFFER_SIZE)

{

k=0;

}

}

RI0=0;

ES0=1;

}

C语言调试常见错误及修改方法(附习题)

1.调试 C 程序时常见的错误类型分析 一般情况下,错误主要分为两大类:一、语法错误。对于这种错误,用编译器很容易解决。所以,改错题的第一步是先编译,解决这类语法错误。下面总结了二级C 语言上机改错题中常见的语法错误: (1) 丢失分号,或分号误写成逗号。 (2) 关键字拼写错误,如本来小写变成大写。 (3) 语句格式错误,例如for 语句中多写或者少写分号。 (4) 表达式声明错误,例如:少了() (5) 函数类型说明错误。与main ()函数中不一致。 (6) 函数形参类型声明错误。例如:少* 等。 (7) 运算符书写错误,例如:/ 写成了。二、逻辑错误,或者叫语义错误,这和实现程序功能紧密相关,一般不能用编译器发现。对于逻辑错误可以按这样的步骤进行查找。 (1) 先读试题,看清题目的功能要求。 (2) 通读程序,看懂程序中算法的实现方法。 (3) 细看程序,发现常见错误点。 2.改错题的改错方式总结,当然这些总结只能对大部分改错行有效 1、若错误行是函数首部,可分为以下几种情况: A、该行最后若有分号则删除,中间若有分号则改成逗号 B、形参类型不一致的问题,特别是指针类型,若后面用到某形参时有指针运算则该形参必为指针类型;若形参是二维数组或指向m 个元素的指针变量,则第二维的长度必须与main 中对应数组的第二维长度相同 C、函数类型不一致的问题,若函数中没有return语句则函数类型为void,若有return语句则函数的类型必须与return 后变量的类型一致。 2、若错误行是if 或while 语句,则首先看有没有用小括号将整个表达式括起,若没有则加上小括号。 3、若错误行中有if、while 、for 则要特别注意条件表达式的错误问题: A、指针变量的应用,若表达式中有指针变量且没有指针运算符,则加上指针运算符 B、若条件表达式中只有一个等于号,则改成两个等于号,若为其它比较运算符则一般是进行逆转或加一个等于号 C、f or 中要用分号分隔表达式,而不是用逗号 4、语法错误 A、语句缺少分号,若错误行中有语句没有用分号结束,则加上分号。 B、大小写不对,若错误行中有大写字母则一般都改成小写字母。 5、指针变量的运用,若错误行中有指针变量,并且该变量名前没有指针运算符则一般都是加上指针运算符 6、若错误行为return 语句,则首先看是否是缺少分号若是则加上分号即可;否则就是return 后的变量或表达式错误(此时可通过看题意,来分析该返回哪一变量或表达式)

C语言程序设计实验实验指导书及答案

实验一熟悉C程序运行环境 班级学号姓名成绩 一、实验目的 1. 熟悉C语言Visual C++调试环境。 2. 掌握C程序的编辑、调试及运行。 二、实验内容 项目1. 调试并运行下面程序,并写出运行结果: #include <> int main() { printf(“Good morning!\n”); printf(“Hello,world!\n”); return 0; } 运行结果(注意,按照屏幕输出格式写): 项目2. 调试并运行下面程序,并写出运行结果: #include <> int main() { int a , b , sum; /*定义变量*/ a=23; b=56; /*为变量赋值*/ sum=a+b; /*计算两个变量的和*/ printf(“sum is %d\n”,sum); /*输出计算结果*/ return 0; } 运行结果:

项目3. 调试并运行下面程序,并写出运行结果: #include <> int max(int,int); int main() { int a , b , c; /*定义变量*/ a=23; b=56; /*为变量赋值*/ c=max(a,b); /*调用max函数,将得到的值赋给c*/ printf(“max is %d\n”,c); /*输出c的值*/ return 0; } int max(int x,int y) /*定义max函数,函数值为整型*/ { int z; /*定义变量*/ if(x>y) z=x; else z=y; return(z); /*将z的值返回*/ } 运行结果: 三、提高部分 1.试想,如果求10个数中的最大者,则程序该如何编写。 程序代码 运行结果:

linux下C语言使用编译与调试试验

实验四:LINUX 下C语言使用、编译与调试实验 一、目的: 1、练习并掌握Linux提供的vi编辑器来编译C程序 2、学会利用gcc、gdb编译、调试C程序 3、学会使用make工具 二、内容 1、编写C语言程序,用gcc编译并观察编译后的结果,运行生成的可执行文件。 2、利用gdb调试程序。 3、学习编写makefile,并进行编译。 三、操作 1、文件编辑器vi 进入vi,直接执行vi编辑程序。 例:# vitest.c 显示器出现vi的编辑窗口,同时vi会将文件复制一份至缓冲区(buffer)。vi先对缓冲区的文件进行编辑,保留在磁盘中的文件则不变。编辑完成后,使用者可决定是否要取代原来旧有的文件。 1) vi的工作模式 (1)输入模式 输入以下命令即可进入vi输入模式: a 在光标之后加入资料 A 在该行之末加入资料 i 在光标之前加入资料 I 在该行之首加入资料 o 新增一行于该行之下 O 新增一行于该行之上 (2)命令模式 在输入模式下,按ESC可切换到命令模式。命令模式下,可选用下列指令离开vi::q! 离开vi,并放弃刚在缓冲区内编辑的内容 :wq 将缓冲区内的资料写入磁盘中,并离开vi ZZ 同wq :x 同wq :w 将缓冲区内的资料写入磁盘中,但并不离开vi :q 离开vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:w配合使用 (3)命令模式下光标的移动

h 左移一个字符 j 下移一个字符 k 上移一个字符 l 右移一个字符 0(零)移至该行的行首 $ 移至该行的行尾 ^ 移至该行的第一个字符处 H 移至窗口的第一行 M 移至窗口中间那一行 L 移至窗口的最后一行 G 移至该文件的最后一行 W, w 下一个单词(W 忽略符号) B, b 上一个单词(B 忽略符号) (4) 命令模式下的编辑命令 dd 删除当前光标所在行 yy 复制当前光标所在行 p 将复制的内容粘贴在光标所在的位置后 P 将复制的内容粘贴在光标所在的位置前 x 删除当前光标字符 X 删除当前光标之前字符 u 撤消 ·重做 2、GNU C编译器 1) 使用gcc 通常后跟一些选项和文件名来使用gcc编译器。gcc命令的基本用法如下: gcc [options] [] 命令行选项指定的编译过程中的具体操作 2) gcc常用选项 当不用任何选项编译一个程序时,gcc将建立(假定编译成功)一个名为a.out的可执行文件。 选项含义: -o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE 没有指定,默认文件名是a.out. 例如,

C语言程序的创建与调试

目录 ?创建一个新的C语言的工程(查看) ?添加一个文件到一个空的工程中(查看) ?编写程序(查看) ?运行程序(查看) ?调试程序-设置断点(查看) ?调试程序-动态察看变量的值(查看) 创建一个新的C语言的工程 第一步,启动Microsoft Visual C++6.0 启动VC可以通过“开始”菜单,也可以通过桌面快捷方式,或者Quick Launch工具栏等方式。

启动之后,我们看到的是空白的VC开发环境。虽然上面的截图是英文版的VC,但是其中的菜单、窗口都和中文版的一一对应。 跟大多数的Windows应用程序一样,VC最上面是菜单,然后是工具栏,中央是工作区,最下面一行是状态栏。我们现在看到的工作区,左边是Workspace 窗口,右边是灰底的空白窗口。 第二步,创建一个工程 在VC中,一个源程序文件必须属于一个工程;所以我们首先来创建一个工程。

选择菜单: File -->New... 打开下面窗口: 在Projects Tab 页面中,我们看到可以创建许多种类型的工程;并且可以指定工程的名字,和存储位置。 事实上如果要开发简单的C 语言程序,我们只需要创建一种工程:Win32 Console Application,也就是Windows 32控制台程序,或者俗称“黑屏”程序。我们进行如下设置:顺序 选项操作说明1工程类型选择"Win32Console Application" 2Location C:\TEST\ 作为例子,我们暂且把该演示程序保存在C 盘根目录下面的TEST 文件夹中。如果该文 件夹不存在,您需要首先创建它。 该选项不需要手工输入,您可以单击在 “Locaction”右下方的“...”按钮, 来选择该文件夹。 注意: 虽然上面的截屏上显示的是 "C:\Test\DemoQuestion",但那是完成了第

上海理工大学c语言程序调试题复习.docx

5月17日程序调试题复习 1.程序调试题1 调试要求:下列程序包含3个错误,请按题中的功能要求,调试并修改该程序(在所修改语句后加/*******/字样的注释),使其运行能得到正确的结果。将结果(包括C_2_1.C文件和 C_2_1.EXE文件)保存到实验结果文件夹屮。 功能说明:程序从键盘输入5个字符串(每个字符串长度不超过80,且字符串屮不含有空格),程序找出其中最大的字符串放到max中,最后输出该最大的字符串。 如输入: BASIC Java C++ Pascal PHP 则输出:Pascal 带错误原程序(见素材\C_2_1.C): #include #include int main() { int i; char s[81], max[81]={'\0'}; for (i=0; i<5; i++) { gets(s); if (strcmp(s,max)) strcpy(max,s); } puts(max); getchar(); /*木句无错;暂停程序,按任意键继续*/ } 2.程序调试题2 调试要求:下列程序包含3个错误,请按题屮的功能要求,调试并修改该程序(在所修改语句后加/****?**/字样的注释),使其运行能得到正确的结果。将结果(包括C_2_2.C文件和 C_2_2.EXE文件)保存到实验结果文件夹中。 功能说明:函数aver的功能是计算n个整数去掉一个最大值和一个最小值后的平均值,程序 从键盘输入8个整数,通过调用函数aver计算这8个整数去掉一个最大值和一个最小值后的平均值,然后输出(保留一位小数)。 如输入:1 2345678 则输出:average=4.5 带错误原程序(见素材\C_2_2.C): #inelude

VC++6.0中如何能编译运行及调试C语言程序

VC++6.0中如何编译运行调试C语言程序1.启动VC++6.0 (如下图) 2.单个源文件的编译运行 例如下面的源代码 #include void main() { int i,sum=0; for(i=1;i<=10;i++) { sum=sum+i; } printf("sum=%d\n",sum); }

打开VC++6.0,如图1所示 (图1)选择“文件”→“新建”,打开如图2所示 (图2)

选择“文件”项,如图3所示 (图3) 选择“C++ Source File”项,并在“文件名”项目下输入“sum.c”如图4所示 (图4)

单击“确定”,打开如图5所示 (图5) 输入如上源代码,如图6所示 (图6) 选择按编译按钮调试程序,看看有没有错误,有的话改正,没有的话就可以再按连接按钮检查连接(多文件工程时常用,检查文件间是否正常连接)。

(图7) 在下端的输出窗口会有错误和警告的提示,如果没有错误选择“执行”(或按Ctrl+F5组合键)即可出现运行结果,如图8所示 (图8)

3.多个源文件的编译运行 以上是运行单个源文件的情况,但是在程序设计时,往往是由几个人各自独立编写不同的程序,显然这些程序是不能写在一起进行编译的,这时就需要建立项目工作区来完成几个独立程序的编译,具体方法如下。 首先建立两个文本文件,分别命名为“file1.c”和“file.c”,分别在两个文件中输入如下两个源代码,然后保存。 源代码1: #include void main() { void sum(); sum(); } 源代码2: #include void sum() { int i,sum=0; for(i=1;i<=10;i++) { sum=sum+i; } printf("sum=%d\n",sum); } 打开VC++6.0,选择“文件”→“新建”打开如图9所示

上海理工大学c语言程序调试题复习

5月17日程序调试题复习 1. 程序调试题1 调试要求:下列程序包含3个错误,请按题中的功能要求,调试并修改该程序(在所修改语句后加/*******/字样的注释),使其运行能得到正确的结果。将结果(包括C_2_1.C文件和C_2_1.EXE文件)保存到实验结果文件夹中。 功能说明:程序从键盘输入5个字符串(每个字符串长度不超过80,且字符串中不含有空格),程序找出其中最大的字符串放到max中,最后输出该最大的字符串。 如输入: BASIC Java C++ Pascal PHP 则输出:Pascal 带错误原程序(见素材\C_2_1.C): #include #include int main() { int i; char s[81], max[81]={'\0'}; for (i=0; i<5; i++) { gets(s); if (strcmp(s,max)) strcpy(max,s); } puts(max); getchar(); /*本句无错;暂停程序,按任意键继续 */ }

2. 程序调试题2 调试要求:下列程序包含3个错误,请按题中的功能要求,调试并修改该程序(在所修改语句后加/*******/字样的注释),使其运行能得到正确的结果。将结果(包括C_2_2.C文件和C_2_2.EXE文件)保存到实验结果文件夹中。 功能说明:函数aver的功能是计算n个整数去掉一个最大值和一个最小值后的平均值,程序从键盘输入8个整数,通过调用函数aver计算这8个整数去掉一个最大值和一个最小值后的平均值,然后输出(保留一位小数)。 如输入:1 2 3 4 5 6 7 8则输出:average=4.5 带错误原程序(见素材\C_2_2.C): #include float aver(int *a, int n) { int i, max, min; float s; s=max=min=a[0]; for (i=0; imax) max=a[i]; if (a[i]>min) min=a[i]; } return (s-max-min)/(n-2); } int main() { int b[8], i; for (i=0; i<8; i++) scanf("%d", b+i); printf("average=%.1f\n", aver(*b,8)); getchar(); /*本句无错;暂停程序,按任意键继续 */ } 3. 程序调试题3

C语言程序调试方法.

所谓程序调试是指对程序的查错和排错。 调试程序一般应经过以下几个步骤: 一、先进行人工检查,即静态检查。 在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。 为了更有效地进行人工检查,所编的程序应力求做到以下几点: ①应当采用结构化程序方法编程,以增加可读性; ②尽可能多加注释,以帮助理解每段程序的作用; ③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。 二、在人工检查无误后,再上机调试。 通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。 如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。 三、在改正语法错误(包括“错误(error)”和“警告(warning)”)后,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程ax2+bx+c=0,输入a、b、c的值分别为1、-2、1时,根x的值是1。这是容易判断的,若根不等于1,程序显然有错。但是,用“试验数据”时,程序运行结果正确,还不能保证程序完全正确。因为有可能输入另一组数据时运行结果不对。例如,用公式

C语言程序调试方法

C语言程序调试方法 所谓程序调试是指对程序的查错和排错。 调试程序一般应经过以下几个步骤: 一、先进行人工检查,即静态检查。 在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。 为了更有效地进行人工检查,所编的程序应力求做到以下几点: ①应当采用结构化程序方法编程,以增加可读性; ②尽可能多加注释,以帮助理解每段程序的作用; ③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。 二、在人工检查无误后,再上机调试。 通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。 如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。 三、在改正语法错误(包括“错误(error)”和“警告(warning)”)后,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程ax2+bx+c=0,输入a、b、c的值分别为1、-2、1时,根x的值是1。这是容易判断的,若根不等于1,程序显然有错。

C语言上机程序调试功能键及常见错误提示

C语言上机程序调试功能键及常见错误提示1.常用健 : 激活系统菜单 : 将光标在编辑窗口和、信息窗口之间切换 : 加载一个文件 + : 查看程序运行结果 : 得到有关编辑器在线帮助 + : 得到有关C语言的在线帮助 + : 终止正在运行的程序 2.块操作 KB: 定义块首 KK: 定义块尾 KV: 块移动 KC: 块复制 KY: 块删除 KH: 取消块定义 3.查找、替换和删除操作 QF: 查找字符串 QA: 查找并替换字符串 Option: G(全程), B(向文件头), N(直接替换) Y : 删除一行 QY: 删除从光标位置到行末的所有字符 4.编译中的常见错误 (1)警告类错误 ?‘XXX’declare but never used变量XXX已定义但从未用过。 ?‘XXX’is ass igned a value which is never used变量XXX已赋值但从未用过。 ?Code has no effect 程序中含有没有实际作用的代码。 ?Non-portable pointer conversion不适当的指针转换,可能是在应该使用指 针的地方用了一个非0的数值。 ?Possible use of ‘XXX’before definition表达式中使用了未赋值的变量?Redeclaration of ‘main’一个程序文件中主函数main不止一个。 ?Suspicious pointer conversion可疑的指针转换。通常是使用了基本类型不匹配的指针。 ?Unreachable code程序含有不能执行到的代码。 (2)错误或致命错误 ?Compound statement missing } in function main程序结尾缺少括号}。 ?“}”expected;“(”expected等复合语句或数组初始化的结尾缺少“)”;“(”。 ? Case outside of switch case不属于Switch结构,多由于switch结构中的 花括号不配对所致。 ?Case statement missing ‘:’ switch结构中的某个case之后缺少冒号。

仿真调试简单的C语言程序案例.

仿真调试简单的C语言程序案例 编写一个简单程序,要求输出“Hello,Keil C!”,这个程序可以按原来学习《C语言程序设计》的方法编写。 #include main() { printf(“Hello,Keil C!\n”); } 本程序很简单,主函数只用到了一个printf函数,但当按照上节介绍的步骤调试运行该程序的时候,并没有看到想要的输出结果,这是为什么呢? 如果这个程序在Turbo C中编译运行的话,肯定在屏幕上可以看到“Hello,Keil C!”,因为在Windows中,标准的输入/输出设备为键盘和显示器,当该程序在Windows 中运行时,printf()函数向显示设备输出实符串,但是在单片机的编译器Keil中,系统默认的输入/输出设置是串行口,所以这样的语句在Keil中并不能产生效果,于是要对上述程序进行修改。 SCON=0x52; //设置串行口控制寄存器SCON TMOD=0x20; //定时器1工作于方式2 TH1=0xE8; //11.0592MHz,1200波特率 TR1=1; //启动定时器1 许多教材把上述语句写在一个函数中,即串行口初始化函数serial_initial(),虽然目前对上述语句还不懂,但不要紧,以后学习了串行口的工作原理后就会明白。 对修改完的源程序进行编译,进入调试运行状态,还要打开串口输出窗口,其方法就是单击运行和调试工具条中的‘1#’串行窗口“”,或选择“view”下拉菜单 的“Serial Windows #1”选项,如图1所示,之后就会在主窗口中出现标题为“Serial #1”的子窗口,串口的输出就是在这个窗口中显示出来。为方便观察,可以选择

C语言程序设计实验指导书

C 语言程序设计 实 验 指 导 书 电子工程学院 2012-2

实验一 C程序的运行环境和编辑、调试、运行简单C程序 一、实验目的 1.了解 Turbo C 的基本操作方法,学会独立使用该系统。 2.掌握在该系统上如何编辑、编译、运行一个C程序。 二、实验内容及步骤 1.进入C的工作环境 1)在Windouws环境下:“开始”→“程序”→“MS-DOS” 屏幕上进入 MS-DOS窗口 2)在Dos环境下:键入命令c:\> cd c:\tc↙ c:\tc> tc↙ 屏幕上出现Turbo C的工作环境 2.熟悉Turbo C的工作环境 了解Edit窗口与Message窗口 了解主菜单的8个菜单项 File Edit Compile Project Option Debug break/watch 3.输入并运行一个简单的程序 File→New 输入源程序:

main() { printf("This is a C program.\n"); printf("OK\n"); } 按F9进行编译和连接,观察屏幕上显示的编译信息。如果出现出错信息,则应找出原因并改正。 按Run→Run(或按Ctrl+F9) 编译、连接、运行一起完成。 按Run→User screen(或按Alt+F5) 察看运行结果。 按任一键从用户屏切换回TC窗口。 4.输入并编辑第二个C程序 File→New 输入源程序: main ( ) { int a,b,sum; a=123; b=456; sum=a+b; printf("sum is %d\n", sum); }

编辑、运行、调试该程序。 5.编辑、运行、调试自己编写的程序(至少一个程序) 如:输入上底、下底和高,计算梯形面积。 观察屏幕上显示的编译信息。如果出现出错信息,则应找出原因并改正。 用File→Save (或F2)保存程序(程序名为a1.c) 三、实验报告要求 写明: 1.实验目的 2.实验内容与步骤 3.编写的程序(题目,经调试、运行后正确的程序) 4.编译过程中出现的错误信息。 5.总结讨论本次实验的结果和收获。

C语言程序的设计实验实验指导书及答案

实验一熟悉C程序运行环境 班级学号成绩 一、实验目的 1. 熟悉C语言Visual C++6.0调试环境。 2. 掌握C程序的编辑、调试及运行。 二、实验容 项目1. 调试并运行下面程序,并写出运行结果: #include int main() { printf(“Good morning!\n”); printf(“Hello,world!\n”); return 0; } 运行结果(注意,按照屏幕输出格式写): 项目2. 调试并运行下面程序,并写出运行结果: #include int main() { int a , b , sum; /*定义变量*/ a=23; b=56; /*为变量赋值*/ sum=a+b; /*计算两个变量的和*/ printf(“sum is %d\n”,sum); /*输出计算结果*/ return 0; } 运行结果:

项目3. 调试并运行下面程序,并写出运行结果: #include int max(int,int); int main() { int a , b , c; /*定义变量*/ a=23; b=56; /*为变量赋值*/ c=max(a,b); /*调用max函数,将得到的值赋给c*/ printf(“max is %d\n”,c); /*输出c的值*/ return 0; } int max(int x,int y) /*定义max函数,函数值为整型*/ { int z; /*定义变量*/ if(x>y) z=x; else z=y; return(z); /*将z的值返回*/ } 运行结果: 三、提高部分 1.试想,如果求10个数中的最大者,则程序该如何编写。 程序代码 运行结果:

C语言程序调试方法入门

调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。 一、断点 断点是调试器设置的一个代码位置。当程序运行到断点时,程序中断执行,回到调试器。断点是最常用的技巧。调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。 设置断点:可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上,然后按F9快捷键 弹出Breakpoints对话框,方法是按快捷键CTRL+B或ALT+F9,或者通过菜单Edit/Breakpoints打开。打开后点击Break at编辑框的右侧的箭头,选择合适的位置信息。 一般情况下,直接选择line xxx就足够了,如果想设置不是当前位置的断点,可以选择 Advanced,然后填写函数、行号和可执行文件信息。 去掉断点:把光标移动到给定断点所在的行,再次按F9就可以取消断点。同前面所述,打开Breakpoints对话框后,也可以按照界面提示去掉断点。 二、值 Watch VC支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。 1)观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。 2)VC提供一种被称为Watch的机制来观看变量和表达式的值。在断点状态下,在变量上单击右键,选择Quick Watch,就弹出一个对话框,显示这个变量的值。 3)单击Debug工具条上的Watch按钮,就出现一个Watch视图 (Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察变量或者表达式的值。注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致软件的逻辑被破坏。 三、Memory 由于指针指向的数组,Watch只能显示第一个元素的值。为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。在Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。 四、Varibles Debug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量,以红色显示。 五、寄存器 Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。 六、进程控制 VC允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F5、F10/F11和CTRL+F10。各个快捷键功能如下:

c语言中几种输出调试信息的方法

在调试程序时,输出调试信息是一种普遍、有效的方法。输出调试信息一般有以下五种方法: 方法一:直接使用屏幕打印函数printf。 该方法直接在需要输出调试信息的位置使用函数printf输出相应的调试信息,以及某些关键变量的值。我们通过以下求阶层的函数fact来看看该方法的调试程序过程。 #include int fact(int n) { int i,f=1; for( i=1; i<=n; i++) { f += i; } return f; } int main() { printf( "4!=%d/n", fact(4) ); return 0; } 程序1: 有bug的求阶层函数 程序1编译运行的结果如下: 4!=11 结果错误。为了找到结果错误的原因,我们在语句"f += i;"之后插入函数printf输出调试信息,如 程序2。 #include int fact(int n) { int i,f=1; for( i=1; i<=n; i++) { f += i; printf("i=%d ; f=%d/n", i, f); } return f; } int main() { printf( "4!=%d/n", fact(4) ); return 0; } 程序2: 加入函数printf输出调试信息的求阶层函数

再编译运行该程序,屏幕输出如下: i=1 ; f=2 i=2 ; f=4 i=3 ; f=7 i=4 ; f=11 4!=11 原来语句"f += i"错了,应该为"f *=i"。修改过来(见程序3),再编译运行,结果如下: i=1 ; f=1 i=2 ; f=2 i=3 ; f=6 i=4 ; f=24 4!=24 #include int fact(int n) { int i,f=1; for( i=1; i<=n; i++) { f *= i; printf("i=%d ; f=%d/n", i, f); } return f; } int main() { printf( "4!=%d/n", fact(4) ); return 0; } 程序3: 修改正确的求阶层函数 调试完成,bug找到,并修改正确。然后将加入的调试的函数printf 删除或注释掉。 该方法的缺点是(1)在正式发布的程序中需要去除或注释掉这些调试语句;(2)若程序又出现bug,则又需要重新插入函数printf输出调试信息,造成工作的重复。 方法二:自定义调试函数debug。 为了避免方法一的缺点,可以利用条件编译技术,如程序4自定义调试函数debug。当程序正式发布的编译时取消宏定义__DEBUG__,在正式发布的程序中就不会输出调试信息。若又出现bug,只要重新在编译程序时定义宏__DEBUG__即可恢复原来的调试信息输出。可以在编写程序时就有目的事先插入些调试语句,这将有益于调试程序。另外,可以根据需要编写函数debug,将调试信息输出到除屏幕以外的其它地方,如文件或syslog服务器等。 #include #ifdef __DEBUG__ #include void debug(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); }

c语言程序调试题

1.该程序功能:运行时输入n,输出n的所有质数因子(如n=13860,则输出2、2、3、3、5、7、11)。1.i=2;i++; 2.该程序功能:输入的一个小写字母,将字母循环后移5个位置后输出,如‘a’变成‘f’,‘w’变成‘b’。2.c<'v'c=c-'v'+'a'; 3.该程序功能:调用函数f用以求1元2次方程x*x+5*x-2=0 的实根return 0; f(a,b,c,&u1,&u2) 4.该程序功能:调用函数f计算代数多项式1.1+2.2*x+3.3*x*x+4.4*x*x*x+ 5.5*x*x*x*x,当x=1.7时的值。float x,float a[],int n return y; 5.该程序功能:运行时输入n,输出n各位数字之和(如n=1308则输出12,n=-3204则输出9)。 while(n!=0)n=n/10; 6.该程序功能:分别统计字符串中所有英文字母中的各元音字母个数。switch(tolower(a[i])) case 'u': n[4]++; 7.该程序功能:调用函数f,将1个整数首尾倒置,若程序输入12345,则输出54321;若程序输入-34567,则输出-76543。m=m/10;return -y; 8.该程序功能:输入整数n(n>0),求m使得2的m次方小于或等于n、2的m+1次方大于或等于n。!scanf("%d",&n)t=t*2; 9.该程序功能:运行时若输入a、n分别为3、6,则输出下列表达式的值:long s=0;t=t*10+1; 10.该程序功能:函数f将数组循环左移k个元素,数组x[7]调用函数f后的输出结果为:4 5 6 7 1 2 3 t=a[0]j=1;j=n),输出它们的最小公倍数。 while(scanf("%d%d",&m,&n),m<=0 || n<=0 || m

相关文档