文档库 最新最全的文档下载
当前位置:文档库 › CAN总线控制器 SJA1000源程序(c语言)

CAN总线控制器 SJA1000源程序(c语言)

CAN总线控制器 SJA1000源程序(c语言)
CAN总线控制器 SJA1000源程序(c语言)

CAN总线控制器sja1000源程序

SJA1000 是一种独立控制器用于移动目标和一般工业环境中的区域网络控制CAN 它是PHILIPS 半导体PCA82C200 CAN 控制器BasicCAN 的替代产品而且它增加了一种新的工作模式PeliCAN , 这种模式支持具有很多新特性的CAN 2.0B 协议。

1 特性

和PCA82C200 独立CAN 控制器引脚兼容

和PCA82C200 独立CAN 控制器电气兼容

PCA82C200 模式即默认的BasicCAN 模式

扩展的接收缓冲器64 字节先进先出FIFO

和CAN2.0B 协议兼容PCA82C200 兼容模式中的无源扩展帧

同时支持11 位和29 位识别码

位速率可达1Mbits/s

PeliCAN 模式扩展功能

--可读/写访问的错误计数器

--可编程的错误报警限制

--最近一次错误代码寄存器

--对每一个CAN 总线错误的中断

--具体控制位控制的仲裁丢失中断

--单次发送无重发

--只听模式无确认无活动的出错标

--支持热插拔软件位速率检测

--验收滤波器扩展4 字节代码4 字节屏蔽

--自身信息接收自接收请求

24MHz 时钟频率

对不同微处理器的接口

可编程的CAN 输出驱动器配置

增强的温度适应-40-+125

#include

#include

#include

//-----------------------沿袭引脚和变量----------------------------------------------

#define uchar unsigned char //宏定义

#define uint unsigned int //宏定义

void MCU_init(void);

/*P2口的管脚定义*/

sbit LED1 = P2^6;

sbit LED2 = P2^5;

sbit SJA_CS = P2^7; //SJA1000片选管脚,低电平有效

//sbit SJA_RST = P1^2;

/*P3口的管脚定义*/

sbit SJA_RD = P3^7;

sbit SJA_WR = P3^6;

//-----------------------定义寻址的基址--------------------------------------------------------

#define base_Adr 0x7F00

//-----------------------定义总线定时寄存器的值--------------------------------------------------------

#define SJA_BTR0 0x07 //该值需要用户根据需要的波特率进行计算,推荐使用周立功发布的波特率计算器

#define SJA_BTR1 0x2F

//-----------------------设置接收报文类型(标示符)--------------------------------------------------------

//该值需要用户根据实际需要重新配置

#define SJA_ACR 0x11 //验收代码寄存器的值

#define SJA_AMR 0xFF //验收屏蔽寄存器的值

//-----------------------设置输出时钟类型--------------------------------------------------------

//该值需要用户根据实际需要重新配置

#define SJA_OCR 0xaa //输出控制寄存器的值

#define SJA_CDR 0x40 //时钟分频寄存器的值

//-----------------------设置SJA中断,1为开中断-------------------------------------------------------- #define SJA_OIE 1 //溢出中断

#define SJA_EIE 1 //错误中断

#define SJA_TIE 1 //发送中断

#define SJA_RIE 1 //接收中断

//-----------------------定义地址指针,指向基址-------------------------------------------------------- unsigned char xdata *SJA_base_Adr = base_Adr;

//-----------------------定义硬件故障标志位--------------------------------------------------------

bit bdata connect_OK=0; //connect_OK=1设备连接正常

//connect_OK=0设备连接故障

//-----------------------定义硬件故障标志位--------------------------------------------------------

bit bdata SJA_workmode=1; //SJA_workmode=1SJA工作在工作模式

//SJA_workmode=0工作在复位模式

//-----------------------定义SJA1000读写缓冲区的数据结构--------------------------------------------------------

struct BASICCAN_BUFStruct{

unsigned char IDH8;

unsigned char IDL_R_DLC;

unsigned char Frame_Data[8];

}receive_BUF,send_BUF;

//------------------------------------------------------------------------------------------------------

// 函数类别供调用子函数

// 函数名称send_BUF_init

// 入口函数无

// 出口函数无

// 函数功能对MCU内公共变量结构send_BUF赋初值

//------------------------------------------------------------------------------------------------------

bit send_BUF_init(void)

{

//调用send_now()函数的时候,所发送的数据是在这里初始化的。请用户根据具体情况自己调整

bit setting_success=0;

send_BUF.IDH8 = 0x99;

send_BUF.IDL_R_DLC = 0xE8; //IDL_R_DLC。4即为RTR位,数据=0,远程=1;

send_BUF.Frame_Data[0] = 0x11;

send_BUF.Frame_Data[1] = 0x22;

send_BUF.Frame_Data[2] = 0x33;

send_BUF.Frame_Data[3] = 0x44;

send_BUF.Frame_Data[4] = 0x55;

send_BUF.Frame_Data[5] = 0x66;

send_BUF.Frame_Data[6] = 0x77;

send_BUF.Frame_Data[7] = 0x88;

setting_success = 1;

return(setting_success);

}

//------------------------------------------------------------------------------------------------------

// 函数类别延时

// 函数名称delay

// 入口函数无

// 出口函数无

// 函数功能延时

//------------------------------------------------------------------------------------------------------

void delay(unsigned char time)

{

while(time--);

}

//------------------------------------------------------------------------------------------------------

// 函数类别SJA1000基本操作

// 函数名称CANREG_write

// 入口函数SJAREG_ADR,setting

// 出口函数无

// 函数功能写SJA1000的寄存器

//------------------------------------------------------------------------------------------------------ void CANREG_write(unsigned char SJAREG_ADR, unsigned char setting)

{

*(SJA_base_Adr+SJAREG_ADR)=setting;

}

//------------------------------------------------------------------------------------------------------

// 函数类别SJA1000基本操作

// 函数名称CANREG_read

// 入口函数SJAREG_ADR

// 出口函数SJAREG_data

// 函数功能读SJA1000的寄存器

//------------------------------------------------------------------------------------------------------ unsigned char CANREG_read(unsigned char SJAREG_ADR)

{

unsigned char SJAREG_data;

SJAREG_data=*(SJA_base_Adr+SJAREG_ADR);

return(SJAREG_data);

}

//------------------------------------------------------------------------------------------------------

// 函数类别SJA1000基本操作

// 函数名称SJAconnect_judge

// 入口函数无

// 出口函数无

// 全局变量connect_OK

// 操作寄存器测试寄存器(地址09)

// 函数功能判断SJA1000与控制器连接是否正常

//------------------------------------------------------------------------------------------------------ void SJAconnect_judge(void)

{

CANREG_write(0x09,0xAA); //写AA到测试寄存器(地址09)if(CANREG_read(0x09)==0xAA)

{

connect_OK=1; //连接正常

}

else

{

connect_OK=0; //连接故障

}

}

//------------------------------------------------------------------------------------------------------

// 函数类别SJA1000基本操作

// 函数名称setting_SJA_resetmode

// 入口函数无

// 出口函数无

// 全局变量SJA_workmode

// 操作寄存器控制寄存器(地址00)

// 函数功能设置SJA工作在复位模式

//------------------------------------------------------------------------------------------------------ void setting_SJA_resetmode(void)

{

unsigned char CONTROL_REGdata;

CONTROL_REGdata=CANREG_read(0x00);

CONTROL_REGdata=CONTROL_REGdata|0x01;

CANREG_write(0x00,CONTROL_REGdata);

if((CANREG_read(0x00)&0x01)==1)

{

SJA_workmode=0; //置复位模式成功

}

else

{

SJA_workmode=1; //置复位模式失败

}

}

//------------------------------------------------------------------------------------------------------ // 函数类别SJA1000基本操作

// 函数名称setting_SJA_workingmode

// 入口函数无

// 出口函数无

// 全局变量SJA_workmode

// 操作寄存器控制寄存器(地址00)

// 函数功能设置SJA工作在正常工作模式

//------------------------------------------------------------------------------------------------------ void setting_SJA_workingmode(void)

{

unsigned char CONTROL_REGdata;

CONTROL_REGdata=CANREG_read(0x00);

CONTROL_REGdata=CONTROL_REGdata&0xFE;

CANREG_write(0x00,CONTROL_REGdata);

if((CANREG_read(0x00)&0x01)==0)

{

SJA_workmode=1; //置工作模式成功

}

else

{

SJA_workmode=0; //置工作模式失败

}

}

//------------------------------------------------------------------------------------------------------

// 函数类别SJA1000基本操作

// 函数名称setting_SJA_rate

// 入口函数SJA_BTR0,SJA_BTR1

// 出口函数setting_success

// 操作寄存器总线定时寄存器BTR1(地址07)和BTR0(地址06)

// 函数功能设置SJA波特率

// 特殊要求只能在复位工作模式下设置

//------------------------------------------------------------------------------------------------------

bit setting_SJA_rate(void)

{

bit setting_success;

while(SJA_workmode)

{

setting_SJA_resetmode(); //设置SJA工作在复位模式

}

CANREG_write(0x06,SJA_BTR0);

CANREG_write(0x07,SJA_BTR1);

if((CANREG_read(0x06)==SJA_BTR0)&(CANREG_read(0x07)==SJA_BTR1))

{

setting_success=1; //波特率设置成功

}

else

{

setting_success=0; //波特率设置失败

}

return(setting_success);

}

//------------------------------------------------------------------------------------------------------

// 函数类别SJA1000基本操作

// 函数名称setting_SJA_dataselect

// 入口函数SJA_ACR,SJA_AMR

// 出口函数setting_success

// 操作寄存器验收代码寄存器ACR(地址04)和验收屏蔽寄存器AMR(地址05)// 函数功能设置SJA接收数据类型

// 特殊要求只能在复位工作模式下设置

//------------------------------------------------------------------------------------------------------

bit setting_SJA_dataselect(void)

{

bit setting_success;

while(SJA_workmode)

{

setting_SJA_resetmode(); //设置SJA工作在复位模式

}

CANREG_write(0x04,SJA_ACR);

CANREG_write(0x05,SJA_AMR);

if((CANREG_read(0x04)==SJA_ACR)&(CANREG_read(0x05)==SJA_AMR))

{

setting_success=1; //滤波器设置成功

}

else

{

setting_success=0; //滤波器设置失败

}

return(setting_success);

}

//------------------------------------------------------------------------------------------------------

// 函数类别SJA1000基本操作

// 函数名称setting_SJA_CLK

// 入口函数SJA_OCR,SJA_CDR

// 出口函数setting_success

// 操作寄存器输出控制寄存器OCR(地址08)和时钟分频寄存器CDR(地址31)// 函数功能设置SJA输出始终类型

// 特殊要求只能在复位工作模式下设置

//------------------------------------------------------------------------------------------------------

bit setting_SJA_CLK(void)

{

bit setting_success;

while(SJA_workmode)

{

setting_SJA_resetmode(); //设置SJA工作在复位模式

}

CANREG_write(0x08,SJA_OCR);

CANREG_write(0x1f,SJA_CDR);

if((CANREG_read(0x08)==SJA_OCR)&(CANREG_read(0x1f)==SJA_CDR))

{

setting_success=1; //滤波器设置成功

}

else

{

setting_success=0; //滤波器设置失败}

return(setting_success);

}

//------------------------------------------------------------------------------------------------------

// 函数类别SJA1000基本操作

// 函数名称setting_SJA_interrupt

// 入口函数SJA_OIE,SJA_EIE,SJA_TIE,SJA_RIE

// 出口函数setting_success

// 操作寄存器控制寄存器(00)

// 函数功能设置SJA中断类型和中断状态

// 特殊要求只能在复位工作模式下设置

//------------------------------------------------------------------------------------------------------

bit setting_SJA_interrupt(void)

{

bit setting_success;

unsigned char CONT_buf,temp=0;

while(SJA_workmode)

{

setting_SJA_resetmode(); //设置SJA工作在复位模式

}

CONT_buf=CANREG_read(0x00);

temp=SJA_OIE*16+SJA_EIE*8+SJA_TIE*4+SJA_RIE*2;

CONT_buf=(temp&0x1E)|(CONT_buf&0x01);

CANREG_write(0x00,CONT_buf);

if(CANREG_read(0x00)==CONT_buf|0x20) //CR.5是保留位,无论如何设置,读此位的值总是逻辑1

{

setting_success=1; //滤波器设置成功

}

else

{

setting_success=0; //滤波器设置失败

}

return(setting_success);

}

//------------------------------------------------------------------------------------------------------

// 函数类别SJA1000基本操作

// 函数名称write_SJAsendBUF

// 入口函数无

// 出口函数setting_success

// 操作寄存器发送缓存器(10-19)状态寄存器02

// 函数功能写发送缓存器

// 特殊要求只能在工作模式下写

//------------------------------------------------------------------------------------------------------

bit write_SJAsendBUF(void)

{

bit setting_success=0;

unsigned char i;

while(SJA_workmode==0)

{

setting_SJA_workingmode(); //设置SJA在工作模式

}

if((CANREG_read(0x02)&0x10)==0)

{

if((CANREG_read(0x02)&0x04)!=0)

{

CANREG_write(0x0a,send_BUF.IDH8);

CANREG_write(0x0b,send_BUF.IDL_R_DLC);

}

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

{

CANREG_write(0x0c+i,send_BUF.Frame_Data[i]);

}

setting_success=1; //发送寄存器写成功

}

return(setting_success);

}

//------------------------------------------------------------------------------------------------------ // 函数类别SJA1000基本操作

// 函数名称read_SJAsendBUF

// 入口函数无

// 出口函数setting_success

// 操作寄存器接收缓存器(20-29)状态寄存器02

// 函数功能写发送缓存器

// 特殊要求只能在工作模式下写

//------------------------------------------------------------------------------------------------------ bit read_SJAreceiveBUF(void)

{

bit setting_success=0;

unsigned char i;

while(SJA_workmode==0)

{

setting_SJA_workingmode(); //设置SJA在工作模式

}

if((CANREG_read(0x02)&0x01)!=0)

{

if((CANREG_read(0x02)&0x10)==0)

{

receive_BUF.IDH8=CANREG_read(0x14);

receive_BUF.IDL_R_DLC=(CANREG_read(0x15));

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

{

receive_BUF.Frame_Data[i]=CANREG_read(0x16+i);

}

}

setting_success=1; //接收寄存器读成功

}

return(setting_success);

}

//------------------------------------------------------------------------------------------------------ // 函数类别供调用子程序

// 函数名称SJA1000_init

// 入口函数无

// 出口函数无

// 操作寄存器1)控制寄存器(地址00)

// 2)收代码寄存器ACR(地址04)

// 3)验收屏蔽寄存器AMR(地址05)

// 4)总线定时寄存器BTR0(地址06)

// 5)总线定时寄存器BTR1(地址07)

// 6)输出控制寄存器OCR(地址08)

// 7)测试寄存器(地址09)

// 8)时钟分频寄存器CDR(地址31)

// 9)中断使能寄存器

// 函数功能SJA1000初始化设置

// 特殊要求在复位模式进行,初始化结束进入工作状态

//------------------------------------------------------------------------------------------------------ void SJA1000_init(void)

{

while(connect_OK==0)

{

SJAconnect_judge(); //检测设备连接

}

while(SJA_workmode)

{

setting_SJA_resetmode(); //置SJA1000为复位模式

}

while(setting_SJA_rate()==0); //设置总线波特率

while(setting_SJA_dataselect()==0); //设置SJA接收数据的格式(标示位)while(setting_SJA_CLK()==0); //设置SJA输出时钟的形式

while(setting_SJA_interrupt()==0); //设置SJA的中断使能

while(!SJA_workmode)

{

setting_SJA_workingmode(); //进入工作模式

}

}

//------------------------------------------------------------------------------------------------------

// 函数类别中断处理函数

// 函数名称send_interrupt

// 入口函数无

// 出口函数无

// 操作寄存器

// 函数功能接收中断处理函数

//------------------------------------------------------------------------------------------------------

void send_now(void)

{

unsigned char state;

// unsigned char CMR_REGdata;

do

{

state = CANREG_read(0x02); //SR为SJA1000的状态寄存器

}

while(( state & 0x10 )|(!(state & 0x08))|(!(state & 0x04)));//查询SJA1000是否处于接收状态,发送完毕状态,或者发送缓存器被锁;

while(write_SJAsendBUF()==0); //写入缓存器

// CMR_REGdata = CANREG_read(0x01); //CMR是只写寄存器,不可读,读出值总是1111 1111

// CMR_REGdata = CMR_REGdata | 0x01;

CANREG_write(0x01,0x01); //简单置位发送位即可

}

//------------------------------------------------------------------------------------------------------

// 函数类别发送中断处理函数

// 函数名称receive_interrupt

// 入口函数

// 出口函数

// 操作寄存器

// 函数功能发送中断处理函数

//------------------------------------------------------------------------------------------------------

void receive_now(void)

{

while(read_SJAreceiveBUF()==0);

CANREG_write(0x01,0x04); //向CMR写入0x04,释放接收缓冲区

}

//------------------------------------------------------------------------------------------------------

// 函数类别中断函数

// 函数名称SJA_INTR

// 入口函数无

// 出口函数无

// 操作寄存器中断寄存器(地址03)

// 函数功能中断分析,判断是什么中断,调用相应的中断处理函数

//------------------------------------------------------------------------------------------------------

void SJA_INTR(void) interrupt 0 //CanBus接口芯片产生中断(INTR0)

{

//这里仅简单区分了接收中断和发送中断,对于其余中断,均简单重启SJA1000,另外,IR的高三位保留位读出值总是1.

unsigned char sta;

EA = 0; //关闭总中断

EX0 = 0; //关闭外部中断

sta = CANREG_read(0x03); //读中断寄存器IR

if(sta == 0xe2) //发送中断处理

{

LED1=0; //如果有信息发出,则指示灯亮

}

else if(sta == 0xe1) //接收中断,接收数据

{

LED2=0; //如果接收到中断,则LED2指示灯亮

receive_now();

}

else

MCU_init();

EX0 = 1;

EA = 1;

}

void MCU_init(void)

{

SJA_CS = 0;

EX0 = 1;

IT0 = 0;

EA = 1;

}

void main() //主程序

{

MCU_init();

SJA1000_init();

while(send_BUF_init()==0);

send_now(); //待发送信息之后,进入死循环,接下来就是等待中断了while(1);

}

代码如下:

/*************定义地址指针,指向基址***********/

unsigned char xdata *SJA_base_Adr = SJA_BaseAdr;

/*************定义SJA1000读写缓冲区的数据结构***********/

struct BASICCAN_BUFStruct{

unsigned char IDH8;

unsigned char IDL_R_DLC;

unsigned char Frame_Data[2];

}receive_BUF,send_BUF;

/****************************************************************

*函数功能:写SJA1000的寄存器

*入口参数:地址SJAREG_ADR,数据setting

*出口参数:无

****************************************************************/

void Write_SJA1000(unsigned char SJAREG_ADR, unsigned char setting)

{

*(SJA_base_Adr+SJAREG_ADR)=setting;

}

/****************************************************************

*函数功能:读SJA1000的寄存器

*入口参数:地址SJAREG_ADR,数据setting

*出口参数:无

****************************************************************/

unsigned char Read_SJA1000(unsigned char SJAREG_ADR)

{

unsigned char SJAREG_data;

SJAREG_data=*(SJA_base_Adr+SJAREG_ADR);

return(SJAREG_data);

}

/****************************************************************

*函数功能:测试SJA1000是否正常连接

*入口参数:无

*出口参数:connect_OK

****************************************************************/

bit Judge_SJA1000_connect(void)

{

bit connect_OK=0;

Write_SJA1000(REG_TEST,0xAA); //写AA到测试寄存器(地址09)

if(Read_SJA1000(0x09)==0xAA)

{

connect_OK=1; //连接正常

}

else

{

connect_OK=0; //连接故障

}

return(connect_OK);

}

/****************************************************************

*函数功能:设置SJA1000为工作模式

*入口参数:无

*出口参数:SJA_mode

****************************************************************/

bit Setting_SJA1000_workingmode(void)

{

bit SJA_mode;

unsigned char CONTROL_REGdata;

CONTROL_REGdata=Read_SJA1000(REG_CONTROL);

CONTROL_REGdata&=0xFE;

Write_SJA1000(REG_CONTROL,CONTROL_REGdata);

if((Read_SJA1000(REG_CONTROL)&0x01)!=0x01)

{

SJA_mode=1; //置工作模式成功

}

else

{

SJA_mode=0; //置工作模式失败

}

return(SJA_mode);

}

/****************************************************************

*函数功能:设置SJA1000为复位模式

*入口参数:无

*出口参数:SJA_mode

****************************************************************/

bit Setting_SJA1000_resetmode(void)

{

bit SJA_mode;

unsigned char CONTROL_REGdata;

CONTROL_REGdata=Read_SJA1000(REG_CONTROL);

CONTROL_REGdata|=0x01;

Write_SJA1000(REG_CONTROL,CONTROL_REGdata);

if((Read_SJA1000(REG_CONTROL)&0x01)==0x01)

{

SJA_mode=1; //置复位模式成功

}

else

{

SJA_mode=0; //置复位模式失败

}

return(SJA_mode);

}

/****************************************************************

*函数功能:设置SJA1000波特率

*入口参数:无

*出口参数:setting_success

****************************************************************/

bit Setting_SJA1000_rate(void)

{

bit setting_success;

while(Setting_SJA1000_resetmode()==0)

{

Setting_SJA1000_resetmode(); //设置SJA工作在复位模式

}

Write_SJA1000(REG_BTR0,SJA_BTR0);

Write_SJA1000(REG_BTR1,SJA_BTR1);

if((Read_SJA1000(REG_BTR0)==SJA_BTR0)&(Read_SJA1000(REG_BTR1)==SJA_BTR1)) {

setting_success=1; //波特率设置成功

}

else

{

setting_success=0; //波特率设置失败

}

return(setting_success);

}

/****************************************************************

*函数功能:设置SJA1000的滤波寄存器和屏蔽寄存器

*入口参数:无

*出口参数:setting_success

****************************************************************/

bit Setting_SJA1000_dataselect(void)

{

bit setting_success;

while(Setting_SJA1000_resetmode()==0)

{

Setting_SJA1000_resetmode(); //设置SJA工作在复位模式

}

Write_SJA1000(REG_ACR,SJA_ACR);

Write_SJA1000(REG_AMR,SJA_AMR);

if((Read_SJA1000(REG_ACR)==SJA_ACR)&(Read_SJA1000(REG_AMR)==SJA_AMR)) {

setting_success=1; //滤波器设置成功

}

else

{

setting_success=0; //滤波器设置失败

}

return(setting_success);

}

/****************************************************************

*函数功能:设置SJA1000的时钟分频器

*入口参数:无

*出口参数:setting_success

****************************************************************/

bit Setting_SJA1000_CDR(void)

{

bit setting_success;

while(Setting_SJA1000_resetmode()==0)

{

Setting_SJA1000_resetmode(); //设置SJA工作在复位模式

}

Write_SJA1000(REG_CDR,SJA_CDR);

if(Read_SJA1000(REG_CDR)==SJA_CDR)

{

setting_success=1; //滤波器设置成功

}

else

{

setting_success=0; //滤波器设置失败

}

return(setting_success);

}

/****************************************************************

*函数功能:设置SJA1000的输出控制寄存器

*入口参数:无

*出口参数:setting_success

****************************************************************/

bit Setting_SJA1000_OCR(void)

{

bit setting_success;

while(Setting_SJA1000_resetmode()==0)

{

Setting_SJA1000_resetmode(); //设置SJA工作在复位模式}

Write_SJA1000(REG_OCR,SJA_OCR);

if(Read_SJA1000(REG_OCR)==SJA_OCR)

{

setting_success=1; //滤波器设置成功

}

else

{

setting_success=0; //滤波器设置失败

}

return(setting_success);

}

/****************************************************************

*函数功能:初始化SJA1000

*入口参数:无

*出口参数:setting_success

****************************************************************/

void Initial_SJA1000(void)

{

while(Judge_SJA1000_connect==0);

do

{

Setting_SJA1000_resetmode();

}

while(Setting_SJA1000_resetmode()==0);

while(Setting_SJA1000_CDR()==0);

while(Setting_SJA1000_rate()==0);

while(Setting_SJA1000_OCR()==0);

while(Setting_SJA1000_dataselect()==0)

do

{

Setting_SJA1000_workingmode();

}

while(Setting_SJA1000_workingmode()==0);

}

/****************************************************************

*函数功能:初始化发送数据

*入口参数:无

*出口参数:setting_success,指示初始化是否成功

****************************************************************/

bit Initial_transmitter_BUF(void)

{

bit setting_success=0;

send_BUF.IDH8 = 0x30;

send_BUF.IDL_R_DLC = 0x22; //IDL_R_DLC。4即为RTR位,数据=0,远程=1; send_BUF.Frame_Data[0] = 0x10;

send_BUF.Frame_Data[1] = 0x00;

setting_success = 1;

return(setting_success);

}

/****************************************************************

*函数功能:对SJA1000发送数据

*入口参数:无

*出口参数:无

****************************************************************/

void Transmitter_SJA1000(void)

{

unsigned char state;

unsigned char i;

do

{

Setting_SJA1000_workingmode();

}

while(Setting_SJA1000_workingmode()==0);

while(Initial_transmitter_BUF()==0); //初始化发送数据

do

{

state = Read_SJA1000(REG_STATUS); //REG_STATUS为SJA1000的状态寄存器}

//查询SJA1000是否处于接收状态,发送完毕状态,或者发送缓存器被锁;

while( ((state&0x10)==0x10) & ((state&0x08)!=0x08) & ((state&0x04)!=0x04) );

Write_SJA1000(REG_TxBuffer1,send_BUF.IDH8);

Write_SJA1000(REG_TxBuffer2,send_BUF.IDL_R_DLC);

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

{

Write_SJA1000(REG_TxBuffer3+i,send_BUF.Frame_Data[i]);

}

Write_SJA1000(REG_COMMAND,TR_CMD);

do

{

state = Read_SJA1000(REG_STATUS); //REG_STATUS为SJA1000的状态寄存器}

while( (state&0x08)!=0x08); //查询SJA1000是否发送完毕状态

}

/***************************************************

***************************************************/

void main(void)

{

unsigned char i;

Initial_SJA1000();

delay1ms(1);

while(1)

{

if((P1_0==0)|(P1_1==0)|(P1_2==0))

{

delay1ms(5);

if((P1_0==0)|(P1_1==0)|(P1_2==0))

{

while((P1_0==0)|(P1_1==0)|(P1_2==0)); for(i=0;i<100;i++)

{

Transmitter_SJA1000();

}

}

}

}

}

大一上期C语言实验报告1熟悉实验环境

成都工业学院·计算机工程学院 《程序设计基础》实验报告 1.实验目的 (1)熟悉C语言运行环境,了解和使用Visual6.0++集成开发环境(2)熟悉Visual6.0++环境的功能键和常用的功能菜单命令 (3)掌握C语言程序的书写格式和C语言程序的结构 (4)掌握C语言上机步骤,以及编辑、编译和运行一个C语言程序的方法 (5)熟悉Visual6.0++环境下的程序调试方法 2.实验内容 (1)按照实验步骤编辑、编译、运行第一个”Hello World”程序(2)利用实验指导中的第二个程序熟悉调试工具,在已知x,y值的情况下,计算出x和y的和、差、积、商,并显示出来(3)编写一个程序,输入a、b、c三个值,输出它们的和与平均值c 3.源程序 (1)#include void main() {printf(”Hello World”);} (2)#include void main() {int x=5,y=2; int s,d,p,q; s=x+y; d=x-y; p=x*y; q=x/y; printf(“和:%d差:%d积%d商:%d“,s,d,p,q);}

(3)#include void main() {int a,b,c.sum; float ave; Printf(“Please enter the a,b,c:”); scanf(“%d%d%d”,&a,&b,&c); sum=a+b+c; ave=(float)sum/3; printf(“sum=%d,ave=%f\n”,sum,ave);} 4.运行结果 (1) (2) (3)输入18、46、69测试得出答案如下

C语言实验报告《函数》

C语言实验报告《函数》 C语言实验报告《函数》 学号: __________ 姓名: __________ 班级: __________ 日期: __________ 指导教师: __________ 成绩: __________ 实验四函数 一、实验目的 1、掌握函数定义、调用和声明的方法 2、掌握实参和形参之间的传递方式 3、函数的嵌套调用 二、实验内容 1、写一个函数,将两个字符串连接。(习题 8. 6) 2、编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。(习题 8.9)

3、请将实验三中的实验内容三改正后,再改写成函数形式(排序部分)。物理实验报告·化学实验报告·生物实验报告·实验报告格式·实验报告模板 三、实验步骤与过程 四、程序调试记录 一、实验目的 1.观察植物细胞有丝分裂的过程,识别有丝分裂的不同时期。 初步掌握制作洋葱根尖有丝分裂装片的技能。 3.初步掌握绘制生物图的方法。 二、实验原理在植物体中,有丝分裂常见于根尖、茎尖等分生区细胞,高等植物细胞有丝分裂的过程,分为分裂间期和分裂期的前期、中期、后期、末期。可以用高倍显微镜观察植物细胞的有丝分裂的过程,根据各个时期细胞内染色体(或染色质)的变化情况,识别该细胞处于有丝分裂的哪个时期,细胞核内的染色体容易被碱性染料着色。 三、材料用具洋葱根尖、显微镜、载玻片、盖玻片、滴管、镊子、培养皿、铅笔、质量分数为15%的盐酸、体积分数为95%的酒精、质量分数为0.01gml的龙胆紫(或紫药水) 四、实验过程(见书P39) 1.洋葱根尖的培养(提前3—4天) 2.解离: 5min 3.漂洗: 10min 4.染色: 5min

c语言课程设计机房机位预定系统绝对正确,附源代码

1 设计目的 机房机位预定系统 2 任务概述 20台机器,编号1到20,从早八点到晚八点。两小时一个时间段,每次可预定一个时间段。功能要求: (1)系统以菜单方式工作 (2)查询,根据输入时间,输出机位信息。 (3)机位预定,根据输入的时间查询是否有空机位,若有则预约,若无则提供最近的时间段,另:若用户在非空时间上机,则将用户信息列入等待列表。 (4)退出预定,根据输入的时间,机器号撤销该事件的预定! (5)查询是否有等待信息,若有则提供最优解决方案(等待时间尽量短),若无则显示提示信息。 ......... 3 模块划分 4 主要函数说明及其N-S图 1.主函数: int main() { Menu(); /*当前状态函数*/ } void Menu() /*主界面*/ { int n,w; do { puts("\t\t****************机房机位预约系统*******************\n"); puts("\t\t*************************菜单

***************************\n"); puts("\t\t\t 1.查询某时间段机位状态"); /*查询某时间段机位状态*/ puts("\t\t\t 2.预定空机位"); /*预定空机位*/ puts("\t\t\t 3.取消预订"); /*取消预订*/ puts("\t\t\t 4.查询等待信息"); /*查询等待信息*/ puts("\t\t\t 5.退出"); /*退出*/ puts("\t\t********************************************************\n"); printf("选择菜单号(1-5):"); scanf("%d",&n); if(n<1||n>5) {w=1;getchar();} else w=0; }while(w==1); switch(n) { case 1:Situation();break; case 2:Book();break; case 3:Cancel();break; case 4:SearchWaiting();break; case 5:exit(0);break; } getch(); } 2.机位查询: void Situation() { int time; printf("输在 (8-20)范围内的时间:"); scanf("%d",&time); if(time<8||time>20) {printf("\t时间输入错误!\n"); printf("输入在 (8-20)范围内的时间:"); scanf("%d",&time); } detail(time); /*函数调用*/ getchar(); Menu();} 3.机位预定:

C语言课程设计报告——贪吃蛇源程序

C 语言课程设计(小游戏贪吃蛇的程序设计报告) 设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一. 概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C语言技术为基础,使用Turbo C++3、0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1、1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正就是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的与那个发,技术与工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法与步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习与将来实际软件开发打下坚实的基础。 1、2 设计的任务与需要的知识点 1、2、1 课程设计主要完成的任务 1)、通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解与掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题与解决问题的能力。 1、2、2需要掌握与运用的知识点 1、2、3本次课程设计需要掌握与运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐与动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。 8) 结构化,模块化的设计方法。

C语言实验报告参考答案 原

C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述 四、程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 答案: #include main() { printf("The dress is long\n"); printf("The shoes are big\n"); printf("The trousers are black\n"); } 2.编写程序: (1) a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 (2)a=160,b=46,c=18,d=170, 编写求(a+b)/(b-c)*(c-d)的程序。 答案: (1) #include main() {

int a,b,c,x,y; a=150; b=20; c=45; x=a/b; y=a/c; printf("a/b的商=%d\n",x); printf("a/c的商=%d\n",y); x=a%b; y=a%c; printf("a/b的余数=%d\n",x); printf("a/c的余数=%d\n",y); } (2) #include main() { int a,b,c,d; float x; a=160; b=46; c=18;

d=170; x=(a+b)/(b-c)*(c-d); printf("(a+b)/(b-c)*(c-d)=%f\n",x); } 3. 设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b 时,将0赋给c。(提示:用条件运算符) 答案: #include main() { int a,b,c; a=0; b=-10; c= (a>b) ? b:a; printf("c = %d\n",c); } 五、调试和测试结果 1.编译、连接无错,运行后屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 2、(1) 编译、连接无错,运行后屏幕上显示以下结果: a/b的商=7

c语言实验报告

C语言实验报告 说明 1,所有程序均用VC6.0编译运行,文件名命名为姓名+日期,因为实验存在补做,所以并不是按照日期先后排列的。 2,为了使截图清晰,手动将运行窗口由“黑底白字”改为了“白底黑字”。 实验2 数据类型、运算符和表达式 一、实验目的: (1)掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量、以及对它们赋值的方法。 (2)学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。 (3)掌握C语言的输入和输出函数的使用 (4)进一步熟悉C程序的编辑、编译、连接和运行的过程。 三、程序调试与问题解决: (1)输人并运行下面的程序 #include void main() { char c1,c2; c1='a'; c2='b'; printf("%c %c\n",c1,c2); } ○1运行此程序。 ○2在上面printf语句的下面再增加一个printf语句。

printf("%d %d\n",c1,c2); 再运行,并分析结果。 输出结果如图,编译成功,无错误。 ○3将第3行改为 int c1,c2; 再运行,并分析结果。 ○4再将第4、5行改为 c1=a; c2=b; 再运行,并分析结果。 a,b没有定义,编译报错。 ○5再将第4、5行改为 c1=‘’a‘’; c2=‘’b‘’; 再运行,并分析结果。 ○6再将第4、5行改为 c1=300; c2=400; 再运行,并分析结果。 以字符型输出时,输出的将是300,400对应的字符。 (2)输人并运行教材第3章习题3. 6给出的程序 #include main () { char c1='a',c2='b',c3='c',c4='\101',c5='\116';

C语言实验报告参考答案

长沙理工大学2010C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述 四、程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 答案: #include<> main() { printf("The dress is long\n"); printf("The shoes are big\n"); printf("The trousers are black\n"); } 2.改错题(将正确程序写在指定位置) 正确的程序为: #include <> main() { printf("商品名称价格\n"); printf("TCL电视机¥7600\n"); printf("美的空调¥2000\n"); printf("SunRose键盘¥\n"); } 2.编写程序: a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 答案: #include<> main() { int a,b,c,x,y; a=150; b=20; c=45;

x=a/b; y=a/c; printf("a/b的商=%d\n",x); printf("a/c的商=%d\n",y); x=a%b; y=a%c; printf("a/b的余数=%d\n",x); printf("a/c的余数=%d\n",y); } 4. 设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b时,将a赋给c。(提示:用条件运算符) 答案: #include<> main() { int a,b,c; a=0; b=-10; c= (a>b) ? b:a; printf("c = %d\n",c); } 五、调试和测试结果 1.编译、连接无错,运行后屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 3、编译、连接无错,运行后屏幕上显示以下结果: a/b的商=7 a/c的商=3 a/b的余数=10 a/c的余数=15 4. 编译、连接无错,运行后屏幕上显示以下结果: c =-10 实验二顺序结构程序设计 四、程序清单 1.键盘输入与屏幕输出练习 问题1 D 。 问题2 改printf("%c,%c,%d\n",a,b,c);这条语句

游戏C语言实验报告

嘉应学院计算机学院 实验报告 课程名称: C程序设计 开课学期: 2015—2016学年第1学期 班级:计算机1505 指导老师:陈广明 设计题目:游戏2048 学生姓名(学号):第3组:钟瞻宇

目录 一、实验目的和要求 .................................................................................................................................................... 二、实验环境、内容和方法 ........................................................................................................................................ 三、程序设计 ................................................................................................................................................................ 四、源代码 .................................................................................................................................................................... 五、调试与运行结果.................................................................................................................................................... 六、总结........................................................................................................................................................................

C语言源代码

剪刀石头布源代码 #include #include main() { int d,x; { printf("请输入:1是剪刀,2是石头,3是布"); scanf("%d",&d); x=rand()%3; if(d==x) printf("双方平局"); else if((d==1&&x==2)||(d==2&&x==3)||(d==3&&x==1)) printf("你赢了"); else printf("电脑赢了"); } }

简单计算器 #include main() { int a,b,d=0; char c; while(d==0) { printf("请开始计算,请输入需要运算的数字和运算法则,数字符号数字:"); scanf("%d%c%d",&a,&c,&b); switch(c) { case'+': printf("%d+%d=%d\n",a,b,a+b); break; case'-': printf("%d-%d=%d\n",a,b,a-b); break; case'*': printf("%d*%d=%d\n",a,b,a*b); break; case'/': if(0==b) printf("除法被除数不能为零!\n") ; else printf("%d/%d=%d\n",a,b,a/b); break; } } }

加油站加油问题 #include int main() { double a = 3.25, b = 3.00, c= 2.75; double d = 0.05, e = 0.10, m; int x,y,z; printf("请输入您要的加油量:"); scanf("%d",&x); printf("请输入您要的汽油种类,1-a型汽油售价3.25元/千克,2-b型汽油售价3.00元/千克,3-c型汽油售价2.75元/千克:"); scanf("%d",&y); printf("请输入您要的服务类型,1-自己加服务优惠0.05,2-协助加服务优惠0.10:"); scanf("%d",&z); switch(y) { case 1: y = a;break; case 2: y = b;break; case 3: y = c;break; } if(z == 1) m = (1 - d) * y * x; else if(z == 2) m = (1 - e) * y * x; printf("您需要支付:%f 元,谢谢惠顾,欢迎下次再来",m); return 0; }

2010C语言实验报告参考答案

2010C语言实验报告参考答案

长沙理工大学2010C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述四、程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 答案: #include main() { printf("The dress is long\n"); printf("The shoes are big\n"); printf("The trousers are black\n"); } 2.改错题(将正确程序写在指定位置) 正确的程序为: #include main() {

printf("商品名称价格\n"); printf("TCL电视机¥7600\n"); printf("美的空调¥2000\n"); printf("SunRose键盘¥50.5\n"); } 2.编写程序: a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 答案: #include main() { int a,b,c,x,y; a=150; b=20; c=45; x=a/b; y=a/c; printf("a/b的商=%d\n",x); printf("a/c的商=%d\n",y);

x=a%b; y=a%c; printf("a/b的余数=%d\n",x); printf("a/c的余数=%d\n",y); } 4. 设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b时,将a赋给c。(提示:用条件运算符) 答案: #include main() { int a,b,c; a=0; b=-10; c= (a>b) ? b:a;

哈工大(威海)c语言实验报告册答案

实验1简单判定性问题求解 一、实验学时 完成本实验需4学时。 二、实验目的 1、阅读程序题 (1)掌握C语言数据类型,熟悉如何定义一个整型、字符型的变量,以及对它们赋值的方法; (2)掌握不同的类型数据之间赋值的规律; (3)掌握数据在内存中的存储方式; (4)学会输入、输出函数的基本格式和使用方法; (5)学会使用有关算术运算符、逻辑运算符、关系运算符,以及包含这些运算符的表达式。 2、编程题 (1)如何运用if-else判定性结构进行程序设计; (2)如何运用switch判定性结构进行程序设计。 3、调试题 (1)熟悉C程序的编辑、编译、连接和运行的过程。 三、实验指导 为了达到最佳的实验效果,以下提供几条适于编程的指导意见,可供参考。 1、阅读程序题应先运用自己在课堂所学的知识,推导出结果,在上机时输入计算机,印证自己推导的结果,注意观察数据在内存中的存储方式、含不同种运算符表达式的输出结果。 2、编程题必须首先画出流程图,并反复思考判断程序设计的正确性,完成程序的设计。要注意简单判定性问题的结构选择。 3、调试题应明确程序的调试、测试是一项非常烦琐的工作,也是非常重要的工作。对于初学者来说应该建立良好的习惯,在调试程序的时候,应该尽可能考虑到程序运行时各种可能情况。

四、实验内容 1、阅读程序题 (1)main( ) { /*定义字符型变量*/ char c1,c2; /*向字符变量赋以整数*/ c1=97; c2=98; printf("%c %c\n",c1,c2); /*以字符形式输出*/ printf("%d %d\n",c1,c2); /*以整数形式输出*/ } 思考:可否改成int c1,c2;输出结果是?相同 (2)main() { int a=7,b=5; printf("%d\n",b=b/a); } 思考:若将printf语句中%d变为%f,可否输出分式的值?可以(3)main() { int a=9; a+=a-=a+a; /*包含复合的赋值运算符的赋值表达式*/ printf("%d\n",a); } 思考:赋值表达式a+=a-=a+a的求解步骤? 第一步:a=a-(a+a)=-9 第二步a=a+a=18 (4)main() { int k=-1; printf("%d,%u\n",k,k);

C语言实验报告

实验一进制转换 一、实验要求 采用模块化程序设计完成进制转换。由键盘输入一个十进制正整数,然后将该数转换成指定的进制数(二、八、十六) 形式输出。指定的进制由用户输入。 二、实验目的 1、熟悉C 环境的安装、使用。 2、承上启下,复习《C 程序设计》等基础课程的知识。 3、掌握C 语言编程的方法。 三、预备知识 1、VC6.0的安装与使用。 2、C 程序设计基础知识。 四、实验内容 采用模块化程序设计完成进制转换。 五、程序框图 六、程序清单 1. 编写主函数:输入需转换的数与转换的进制 2. 编写子函数 (1)函数转换为除16进制以外的进制转换算数编程,使用while 循环实现计算进制的转换,并输出转换后的数字; (2)函数转换为16进制,用while 函数实现16进制转换的计算并输出16进制转换后的数据; 3. 编写数组,关于16进制的一系列字符 4. 编写主函数加入do while 使函数可以循环。

七、实验步骤 #include char num[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; void fun(int n, int m) { int i=-1, a[100]; if(m!=16) { while(n) { a[i++]=n%m; n=n/m; } while(i!=-1) printf("%d",a[--i]); printf("\n"); } else { while(n) { a[++i]=num[n%16]; n/=16; } while(i!=-1) printf("%c",a[i--]); printf("\n"); } } int main() { int a, c; char cIn = 0; do { printf("\n输入正整数,转换的进制:"); scanf("%d %d",&a,&c); fun(a,c); printf("Go on? (Y/N):"); cIn = getchar( ); if(cIn == 'N' || cIn == 'n') return 0; } while(1);fun(a,c);

C语言课程设计俄罗斯方块源代码

1、新建“.h”头文件,将“头文件” 代码粘贴至其中, 2、新建“.c”源文件,将“源代码” 代码粘贴到其中。 3、新建空白工程,将头文件和源代码 添加进去,调试使用。 //头文件 //1.自定义枚举类型,定义7种形态的游戏方块 typedef enum tetris_shape { ZShape=0, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape }shape; //2.函数声明 //(1)操作方块函数 int maxX();//取得当前方块的最大x坐标 int minX();//取得当前方块的最小x坐标 void turn_left();//当前方块逆时针旋转90度 void turn_right(); int out_of_table(); void transform(); int leftable(); int rightable(); int downable(); void move_left(); void move_right(); //(2)操作游戏桌面的函数 int add_to_table();

void remove_full(); //(3)控制游戏函数 void new_game(); void run_game(); void next_shape(); int random(int seed); //(4)绘图函数 void paint(); void draw_table(); //(5)其他功能函数 void key_down(WPARAM wParam); void resize(); void initialize(); void finalize(); //(6)回调函数,用来处理Windows消息 LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM); //源代码 //1.文件包含 #include #include #include #include"tetris.h" //2.常量定义 #define APP_NAME "TETRIS" #define APP_TITLE "Tetris Game" #define GAMEOVER "GAME OVER" #define SHAPE_COUNT 7 #define BLOCK_COUNT 4 #define MAX_SPEED 5 #define COLUMS 10 #define ROWS 20 #define RED RGB(255,0,0)

C语言实验报告参考源代码

实验5三种基本结构的综合应用 4.一个素数(设为p)依次从最高位去掉一位,二位,三位,……,若得到的各数仍都是素数(注:除1和它本身外,不能被其它整数整除的正整数称为素数,1不是素数,2是素数),且数p的各位数字均不为零,则称该数p为逆向超级素数。例如,617,17,7都是素数,因此617是逆向超级素数,尽管503,03,3都是素数,但它不是逆向超级素数,因为它包含有零。试求[100,999]之内的所有逆向超级素数的个数。 #include "stdio.h" main() {int i,j,k,m,p,q,n=0; for(i=100;i<=999;i++) {for(j=2;j=i) /*三位数是素数时*/ {k=i%100; /*去掉百位数字*/ if(k>=10) /*十位数字不是0时*/ {for(m=2;m=k) /*两位数是素数时*/ {p=i%10; /*p为个位数字*/ for(q=2;q=p)n++;}}}} printf("%d\n",n);} Key:57 5.求[2,400]中相差为10的相邻素数对的对数。 #include "stdio.h" main() {int i,j,k,m,p,q,n=0; for(i=2;i<=400;i++) {for(j=2;j=i) /*i是素数时*/ {for(k=i+1;k=k)break;} /*k是素数时终止if语句的外层循环*/ if(k>=i+10) /*[i+1,i+9]不是素数时*/ {for(q=2;q

C语言实验报告(四)

C语言实验报告(四) 一、实验目的 1.掌握C语言中函数和模块 2.掌握怎样定义函数,如何调用或使用函数,如何声明函数 3.掌握函数的参数,了解在函数调用时,参数是如何传递的 4.在使用函数的过程中怎样确定函数的参数 5.如何使用局部变量和全局变量 二、实验内容 1. 偶数判断 描述: 编写一个用户自定义函数,该函数有一个整型参数,函数的功能是:当这个整型数的值是偶数时,函数的返回值为0,当这个整型数的值是奇数时,返回值为1 。编写一个程序,从键盘输入m个整数,分别调用用户自定义函数来判断这m个整数的奇偶性。 输入: 第一行为一个整数m,表示要判断m个整数的奇偶性;紧接着是m行,每行一个整数。 输出:有m行,分别对应输入的第2到第m+1行的整数的奇偶性样例输入: 2 1 6 样例输出: 奇数 偶数

·程序代码: #include"stdio.h" int isEven(int a) { if(a%2==0) return 1; else return 0; } int main() { int m,i,b; scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d",&b); if(isEven(b)==1) printf("偶数\n"); else printf("奇数\n"); } return 0; } 2.温度转换 描述: 编写一个用户自定义函数,函数的功能是:将华氏温度转F换为摄氏温度C。转换公式为:C=5*(F-32)/9。编写一个程序,输出指定范围的华氏温度与摄氏温度的对照表,其中华氏温度步长为4。 输入: 两个空格隔开的整数n,m(且0

c语言课程设计报告学生成绩信息管理系统源代码

实验报告 一、问题陈述及其需求分析 (一)问题陈述 学生信息管理系统是对学生信息的基本管理,其中包括以下及模块: (1)增加一个学生的信息(需输入要增加学生的所有信息); (2)统计本班学生总人数及男女生人数。 (3)分别按照学号查找学生的信息;若找到则输出该学生全部信息,否则输出查找不到的提示信息。 (4)按学号对所有学生信息排序,并输出结果; (5)删除一个学生的信息(需指定要删除学生的学号);同时显示删除后的结果。( 二) 功能需求分析 学生信息管理系统设计 学生信息包括:学号,姓名,性别,出生年月,电话 使之提供以下功能: 1、系统以菜单方式工作 2、建立链表并显示 3、插入新的学生信息 4、删除某学号的学生信息 5、查找某学号的学生信息 6、对学生信息排序 7、统计学生人数 8、输出学生信息 二总体设计 (一)模块 依据程序的数据结构,描述该程序的层次结构,如下图:

1、建立链表并显示 void createlist(struct stucode **r); 2、插入新的学生信息 void insert(struct stucode **r); 3、删除某学号的学生信息 void del(struct stucode **r); 4、查找某学号的学生信息 void search1(struct stucode *r); 5、对学生信息排序 void sort(struct stucode **r); 6、统计学生人数 void search2(struct stucode *r); 7、输出学生信息 void out(struct stucode *r); 1 建立链表并显示 2 添加学生信息 3 删除学生信息 息 4 按学号查找学生信 5 对学生信息排序 6统计学生人数 7输出学员信息 8 学生信息写入文件 0退出 main() 菜单函数

C语言实验报告范文

实验名称:指针及其应用日期:得分:指导老师: 专业:班次:姓名:学号: 实验目的 (1)掌握变量的指针及其基本用法。 (2)掌握一维数组的指针及其基本用法。 (3)掌握指针变量作为函数的参数时,参数的传递过程及其用法。一.实验内容( 1)运行以下程序,并从中了解变量的指针和指针变量的概念。 (2)运行以下程序,观察 &a[0] 、&a[i] 和 p 的变化,然后回答以下问题: 1.程序的功能是什么? 2.在开始进入循环体之前, p 指向谁? 3.循环每增加一次, p 的值(地址)增加多少?它指向谁? 4.退出循环后, p 指向谁? 5.你是否初步掌握了通过指针变量引用数组元素的方法?( 3)先分析以下程序的运行结果,然后上机验证,并通过此例掌握通过指针变量引用数组元素的各种方法。 ( 4)编写函数,将 n 个数按原来的顺序的逆序排列(要求用指针实现),然后编写主函数完成: ①输入 10 个数; ②调用此函数进行重排; ③输出重排后的结果。 二.分析与讨论 ( 1)指针的定义方法,指针和变量的关系。 定义方法: 数据类型 * 指针变量名 ; 如定义一个指向 int 型变量的指针—— int *p; 则我们可以继续写如下代码—— int a = 4; p = &a; printf("%d", *p); 在这里,我们定义了一个变量a,我们把它理解为内存空间连续的 4个字节(int 型占用 4字节),则这 4个字节的空间保存着一个数 4。&是取地址符号,即把变量a的地址(即这4个字节的首地址)赋给指针p (记住指针p的类型和变量a的类型要保持一致,否则的话,要进行类型转换)。这样子,指针p就保 存着变量a的地址。我们如果把指针p当做内存空间里面另外一个连续的 4个字节,那么这4个字节保存的数就是变量a的地址。printf("%d",*p)和 printf("%d",a)的结果是一样的。这里的*是取变量符号(与&刚好作用相反,通过变量的地址找到变量),与定义时 int *p 的*号作用不同(定义时的 *表示该变量是个指针变量,而非是取它指向的变量)。 ( 2)数组和指针的关系。 指针与数组是 C 语言中很重要的两个概念,它们之间有着密切的关系,利用这种

C语言课程设计---学生选课系统加源代码

C程序设计课程设计 题目:学生选课系统专业班级:通信工程1班姓名: 学号: 指导教师: 成绩:

摘要 学生选课系统是一个教育单位不可缺少的重要系统组成部分,它对于学校的决策者、管理者管理、查看课程来说都有至关重要,所以学生选课管理系统应该能够为广大学、师生提供充足的信息和快捷的课程选择过程,有助于学生选好每一门课程,此系统系统选课方便、快捷,用简单的界面来展示学生的选课信息,应用简单明了、存储量大、可靠性高、保密性好、寿命长、成本低等优点,可以极大的提高对学生信息管理的效率。利用C语言开发,实现了简单的学生课程信息的录入、修改、查询、删除等操作,并且能够利用文件系统长久的保留原始数据。

目录 一、需求分析 (1) 二、总体设计 (1) 三、详细设计 (2) 1、数据定义...................................................... 错误!未定义书签。 2、算法流程图 (2) 四、编码 (6) 五、调试 (7) 六、设计总结 (10) 致谢 (11) 参考文献 (12) 附录 (13)

一、需求分析 语言文字描述系统要做什么 数据结构可用结构体,包括课程和选修两个结构体,其中课程结构体成员结构体成员包括课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期。选修结构体成员包括学号,课程编号,该结构体的建立主要是为了查询某门课程学生选修情况。 二、总体设计 系统由哪几个功能模块构成,给出功能模块图。C 中模块化的工具是函数 根据上面的需求分析,可以将这个系统的设计分为如下七大模块: 选课模块、按学分查找模块、按编号查找模块、查看课程模块、查看选课情况模块、课程输入模块、完成选择模块。 菜单选择模块 录入学生信息 学生选课 系统信息查看及储存 退出系统 完成选择模块 学生信息 管 理 录入课程信息 课程 管理

C语言课程设计报告——贪吃蛇源程序

C 语言课程设计 (小游戏贪吃蛇的程序设计报告)

设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点 3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试 1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一.概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C 语言技术为基础,使用Turbo C++3.0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1.1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的和那个发,技术和工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法和步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习和将来实际软件开发打下坚实的基础。 1.2 设计的任务和需要的知识点 1.2.1 课程设计主要完成的任务 1). 通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解和掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题和解决问题的能力。 1.2.2需要掌握和运用的知识点 1.2.3本次课程设计需要掌握和运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐和动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。

相关文档
相关文档 最新文档