文档库 最新最全的文档下载
当前位置:文档库 › 几个C小程序

几个C小程序

几个C小程序
几个C小程序

第13章几个C语言编程应用实例

13.1 TMS320LF2407与图形液晶显示模块接口及应用

源程序代码:

(1)所需的复位和中断向量定义文件“vectors.asm”

.title "vectors.asm"

.ref _c_int0,_nothing

.sect ".vectors"

reset: b _c_int0

int1: b _nothing

int2: b _nothing

int3: b _nothing

int4: b _nothing

int5: b _nothing

int6: b _nothing

(2)主程序

// 该程序利用C语言实现液晶的显示,字库以字的形式存储.该程序执行后,实验板上的液

*晶片上显示两行相同的"DSP 实验板"字母和汉字字样液晶要求每次送一个字节的

*(8位)数据,而为了节约存储空间,液晶的显示字库在DSP中以字(16位)的形式存储,但在

*下面的程序中可以通过巧妙简单的方法解决这个问题,详细方法见程序

#include "register.h"

const int char1[8]={0x0fc04,0x004fc,0x0f80c,0x000f0,0x0f08,0x0080f,0x0070c,0x00003};// "D"

const int char2[8]={0x03c18,0x04464,0x09cc4,0x00018,0x00e06,0x00808,0x00f08,0x0007};// "S" const int char3[8]={0x0fc04,0x044fc,0x07c44,0x00038,0x00f08,0x0080f,0x00000,0x00000};// "P" const int char4[16]={0x00c10,0x04404,0x0948c,0x00635,0x004f4,0x00404,0x01404,0x0000c,0x08202,0x04282,0x02342,0x00e12,0x00a03,0x02212,0x0c342,0x00002};// "实"

const int char5[16]={0x0fa02,0x00202,0x042ff,0x05020,0x0434c,0x0504c,0x06020,0x00020,0x03110,0x04911,0x07f89,0x05c42,0x04f40,0x05860,0x06047,0x00040};// "验"

const int char6[16]={0x01010,0x0ffd0,0x01090,0x0fc00,0x0a424,0x02224,0x062a3,0x00000,0x00304,0x0ff00,0x02140,0x04718,0x01320,0x0160c,0x06021,0x00020};// "板"

// 屏蔽中断子程序

void inline disable()

{

asm(" setc INTM");

}

// 系统初始化子程序

272

void initial()

{

asm(" setc SXM");// 符号位扩展有效

asm(" clrc OVM");// 累加器中结果正常溢出

asm(" clrc CNF");// B0被配置为数据存储空间

*SCSR1=0x81FE;// CLKIN=6M,CLKOUT=4*CLKIN=24M

*WDCR=0x0E8;// 不使能看门狗,因为SCSR2中的WDOVERRIDE即

// WD保护位复的缺省值为1,故可以用软件禁止看门狗*IMR=0X00;// 中断禁止

*IFR=0x0FFFF;// 清除全部中断标志,"写1清0"

*MCRC=*MCRC&0X0FBFF;// IOPF2口为通用的IO口

*PFDA TDIR=(*PFDA TDIR|0X0400)&0XFFFB;// 不使能74HC273芯片

*MCRA=*MCRA&0X000F;// 配置IOPA[4-7],IOPB[0-7]为一般I/O口功能

*PADA TDIR=(*PADA TDIR|0X0F000)&0X0FF0F;

// IOPA[4-7]为输出,且全部为0

disable() ;// 总中断禁止

}

// 读液晶显示器状态子程序,形参E代表处理的液晶的边(E1或E2边)

void LCDSTA1(E)

int E;

{

int E1FLAG;

*PBDA TDIR=*PBDA TDIR&0X00FF;// IOPB口为输入口

while(1)

{

if(E==1)

*PADA TDIR=(*PADA TDIR|0X00A0)&0X0FFAF;

// E1=1,E2=0,R/W=1,A0=0,以便读晶的状态

else *PADA TDIR=(*PADA TDIR|0X0060)&0X0FF6F;

// E1=0,E2=1,R/W=1,A0=0,以便液晶的状态

E1FLAG=*PBDA TDIR&0X0080;

if(E1FLAG==0x0000) break;// 若液晶空闲,则停止等待

}

}

// 对液晶显示器发指令子程序,形参E代表处理的液晶的边(E1或E2边)

void TRANS1(TRANS,E) // 该函数采用形参和实参的方式传递数值,TRANS为一个形参

int TRANS,E;

{

273

LCDSTA1(E);// 判断液晶是否为忙

*PBDA TDIR=*PBDA TDIR|0XFF00;// IOPB口为输出口

if(E==1) *PADA TDIR=(*PADA TDIR|0X0080)&0X0FF8F;

// E1=1,E2=0,R/W=0,A0=0,以便写入令字else *PADA TDIR=(*PADA TDIR|0X0040)&0X0FF4F;

// E1=0,E2=1,R/W=0,A0=0,以便入命令字*PBDA TDIR=(*PBDA TDIR&0X0FF00)|TRANS;

// 需要写入的命令字送入数据线

if(E==1) *PADA TDIR=*PADA TDIR&0X0FF7F;// E1=0,写入指令

else *PADA TDIR=*PADA TDIR&0X0FFBF;// E2=0,写入指令

}

// 对液晶显示器写数据子程序,注意在此子程序里面列地址没有加1,需要用户在外

// 对其进行操作,形参E代表处理的液晶的边(E1或E2边)

void WRITE1(WRITE,CLMADD,E) // WRITE代表需要写入的数据,CLMADD代表要的列地址

int WRITE,CLMADD,E;

{

TRANS1(CLMADD,E);// 设置列地址

LCDSTA1(E);// 查询液晶是否为空闲

*PBDA TDIR=*PBDA TDIR|0XFF00;// IOPB口为输出口

if(E==1) *PADA TDIR=(*PADA TDIR|0X0090)&0X0FF9F;

// E1=1,E2=0,R/W=0,A0=1,以便写入要显示的数据else *PADA TDIR=(*PADA TDIR|0X0050)&0X0FF5F;

// E1=0,E2=1,R/W=0,A0=1,以便要显示的数据*PBDA TDIR=(*PBDA TDIR&0X0FF00)|WRITE;

// 需要写入的数据送入数据线

if(E==1) *PADA TDIR=*PADA TDIR&0X0FF7F;// E1=0,写入数据

else *PADA TDIR=*PADA TDIR&0X0FFBF;// E2=0,写入数据

}

// 开E1显示子程序,形参E代表处理的液晶的边(E1或E2边)

void DISP1(E)

int E;

{

int E1FLAG;

while(1)

{

TRANS1(0X0AF,E);// 送出控制命令

LCDSTA1(E);// 判断液晶是否为空闲

*PBDA TDIR=*PBDA TDIR&0X00FF;// IOPB口为输入口

274

if(E==1) *PADA TDIR=(*PADA TDIR|0X00A0)&0X0FFAF;

// E1=1,E2=0,R/W=1,A0=0,以便读晶的状态

else *PADA TDIR=(*PADA TDIR|0X0060)&0X0FF6F;

// E1=0,E2=1,R/W=1,A0=0,以便液晶的状态

E1FLAG=*PBDA TDIR&0X0020;

if(E1FLAG==0) break;// 如果液晶没被打开,则继续打开

}

}

// E1边清屏子程序,形参E代表处理的液晶的边(E1或E2边)

void CLEAR1( int E)

{

int PAGEADD,PAGENUM,CLMADD,CLMSUM;// 定义所需要的局部变量

for(PAGENUM=0X04,PAGEADD=0x0B8;PAGENUM>0;PAGENUM--,PAGEADD++)

{

TRANS1(PAGEADD,E);// 设置相应的页地址

for(CLMSUM=0X00;CLMSUM<0X3E;CLMSUM++)

{

LCDSTA1(E);// 判断液晶是否为空闲

WRITE1(0X00,CLMSUM,E);// 向相应的列送0以清屏

}

}

}

// 关E1显示子程序,形参E代表处理的液晶的边(E1或E2边)

void DISOFF1(int E)

{

int E1FLAG;

while(1) {

TRANS1(0X0AE,E);// 发出控制命令

LCDSTA1(E);// 判断液晶是否为空闲

*PBDA TDIR=*PBDA TDIR&0X00FF;// IOPB口为输入口

if(E==1) *PADA TDIR=(*PADA TDIR|0X00A0)&0X0FFAF;

// E1=1,E2=0,R/W=1,A0=0,以便读晶的状态else *PADA TDIR=(*PADA TDIR|0X0060)&0X0FF6F;// E1=0,E2=1,R/W=1,A0=0,以便

// 液晶的状态

E1FLAG=*PBDA TDIR&0X0020;

if(E1FLAG==1) break;// 如果液晶没有被关闭,则继续关

}

}

275

// LCD的E1边初始化子程序,形参E代表处理的液晶的边(E1或E2边)

void LCD1INIT(int E)

{

DISOFF1(E);// 关显示E1

TRANS1(0X0A4,E);// 静态显示驱动

TRANS1(0X0A9,E);// 占空比为1/32

TRANS1(0X0E2,E);// 复位

TRANS1(0X0A0,E);// ADC选择正常输出

CLEAR1(E);// 清屏

LCDSTA1(E);// 判断液晶是否为空闲

DISP1(E);// 开显示

}

// 汉字显示子程序,入口为存储汉字库的数组的首地址,页地址和起始列地址

// 和选中的E1或E2的边数

DISPLA Y1(ARRA Y,E,PAGADD,CLMADD)

int *ARRA Y,PAGADD,CLMADD,E;// 定义所需要的局部变量

{

int K,TEMP;

TRANS1(0X0C0,E);// 从第0行开始显示

TRANS1(PAGADD,E);// 送需要显示的页地址

for(K=0;K<8;K++,CLMADD++,ARRA Y++)

{

TEMP=*ARRA Y&0X00FF;

WRITE1(TEMP,CLMADD,E);// 送需要显示的数据字节

CLMADD++;

TEMP=(*ARRA Y&0X0FF00)>>8;

WRITE1(TEMP,CLMADD,E);// 送需要显示的数据字节

}

CLMADD=CLMADD-16;// 恢复列地址

PAGADD=PAGADD+1;// 页地址加1

TRANS1(PAGADD,E);

for(;K<16;K++,CLMADD++,ARRA Y++)

{

TEMP=*ARRA Y&0X00FF;

WRITE1(TEMP,CLMADD,E);// 送需要显示的数据字节

CLMADD++;

TEMP=(*ARRA Y&0X0FF00)>>8;

WRITE1(TEMP,CLMADD,E);// 送需要显示的数据字节

276

}

}

// 数字和字母显示子程序,入口为存储字母或数字库的数组的首地址,页地址和

// 始列地址和选中的E1或E2的边数

DISPLA Y2(ARRA Y,E,PAGADD,CLMADD)

int *ARRA Y,PAGADD,CLMADD,E;// 定义所需要的局部变量

{

int K,TEMP;

TRANS1(0X0C0,E);// 从第0行开始显示

TRANS1(PAGADD,E);// 送需要显示的页地址

for(K=0;K<4;K++,CLMADD++,ARRA Y++)

{

TEMP=*ARRA Y&0X00FF;

WRITE1(TEMP,CLMADD,E);// 送需要显示的数据字节

CLMADD++;

TEMP=(*ARRA Y&0X0FF00)>>8;

WRITE1(TEMP,CLMADD,E);// 送需要显示的数据字节

}

CLMADD=CLMADD-8;// 恢复列地址

PAGADD=PAGADD+1;// 页地址加1

TRANS1(PAGADD,E);

for(;K<8;K++,CLMADD++,ARRA Y++)

{

TEMP=*ARRA Y&0X00FF;

WRITE1(TEMP,CLMADD,E);// 送需要显示的数据字节

CLMADD++;

TEMP=(*ARRA Y&0X0FF00)>>8;

WRITE1(TEMP,CLMADD,E);// 送需要显示的数据字节

}

}

// 主程序

main()

{

initial();// 系统初始化

// 显示第一行"DSP 实验板"

LCD1INIT(1);// LCD的E1边初始化

LCD1INIT(2);// LCD的E2边初始化

DISPLA Y2(char1,1,0x0BA,00);// 调用字母和数字显示子程序

277

DISPLA Y2(char2,1,0x0BA,8);// 调用字母和数字显示子程序

DISPLA Y2(char3,1,0x0BA,17);// 调用字母和数字显示子程序

DISPLA Y1(char4,2,0x0BA,0);// 调用汉字显示子程序

DISPLA Y1(char5,2,0x0BA,15);// 调用汉字显示子程序

DISPLA Y1(char6,2,0x0BA,30);// 调用汉字显示子程序

// 显示第行行"DSP 实验板"

DISPLA Y2(char1,1,0x0B8,00);// 调用字母和数字显示子程序

DISPLA Y2(char2,1,0x0B8,8);// 调用字母和数字显示子程序

DISPLA Y2(char3,1,0x0B8,17);// 调用字母和数字显示子程序

DISPLA Y1(char4,2,0x0B8,0);// 调用汉字显示子程序

DISPLA Y1(char5,2,0x0B8,15);// 调用汉字显示子程序

DISPLA Y1(char6,2,0x0B8,30);// 调用汉字显示子程序

}

// 如若因干扰引起中断的误执行,则执行此中断服务程序

void interrupt nothing()

{

return;

}

13.2 串行EEPROM的接口编程

13.2.3 24LC256的应用编程

// 该程序实现DSP2407与EEPROM芯片24LC256的接口编程

#include "register.h"

int source[4]={4,3,2,1};

int result[4];

int n,control;

// 系统初始化子程序

void sysinitial()

{

asm( " setc INTM ");// 关闭总中断

asm( " clrc SXM ") ;// 抑制符号扩展

asm( " clrc OVM ") ;// 累加器结果正常溢出

asm( " clrc CNF ") ;// B0被配置为数据空间

*SCSR1=0X81FE;// CLKIN=6M,CLKOUT=24M

*WDCR=0X0E8;// 不使能看门狗

*IMR=0X00;// 禁止所有中断

WSGR=0x0FFFF;// 不使能所有的等待状态

278

void ioinitial()

{

*MCRB=*MCRB&0X0F6;// 选择定义IOPD0,IOPC3,IOPC0为通用I/O口

*PCDA TDIR=*PCDA TDIR|0X0800;// IOPC3为输出

*PDDA TDIR=*PDDA TDIR|0X0100;// IOPD0为输出,且写允许

}

// 启动I2C总线子程序

void I2CStart()

{

int k;

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

*PCDA TDIR=*PCDA TDIR|0X0100;// IOPC0(SDA为输出)

*PCDA TDIR=*PCDA TDIR|0X0009;// SDA=SCL=1

for(k=8;k>=0;k--) { k=k;} // 软件延时600ns

*PCDA TDIR=*PCDA TDIR&0x0FFFE;// SDA=0

for(k=8;k>=0;k--) { k=k;} // 软件延时600ns

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

for(k=18;k>=0;k--) { k=k;} // 软件延时1400ns

*PCDA TDIR=*PCDA TDIR|0X0001;// SDA=1

}

// 向I2C总线写入数据子程序

void I2CSendByte(int data)

{

int flag,sz,k;// 定义局部寄存器

*PCDA TDIR=*PCDA TDIR|0X0100;// 设置IOPC0为输出口

for(flag=0x0080;flag!=0x00;flag=flag/2)

{

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

for(k=0x06;k>=0;k--) { k=k;}

sz=data&flag;// 屏蔽掉相应的位

if(sz==0) *PCDA TDIR=*PCDA TDIR&0X0FFFE;// 如果相应的位为0,则SDA=0

else *PCDA TDIR=*PCDA TDIR|0x0001;// 如果相应的位为1,则SDA=1

*PCDA TDIR=*PCDA TDIR|0X0008;// SCL=1,在SCL=1期间数据线上的状态必须保持不变

for(k=0x016;k>=0;k--) { k=k;}

}

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

279

int I2CRECACK()

{

int k;

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

for(k=16;k>=0;k--) { k=k;} // 软件延时600ns

*PCDA TDIR=*PCDA TDIR|0X0008;// SCL=1,在SCL=1期间数据线上的状态必须保

// 持不变

for(k=3;k>=0;k--) { k=k;} // 软件延时600ns

*PCDA TDIR=*PCDA TDIR&0x0FEFF;// IOPC0(SDA为输入)

for(k=3;k>=0;k--) { k=k;} // 软件延时600ns

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

k=*PCDA TDIR&0X01;// k值存储应答位,若K=0,则表示操作成功;

// 若k=1,则表示操作失败

return(k);

}

// 从I2C总线读取数据

int I2CRecByte()

{

int k=0;

int flag;

int sz;

*PCDA TDIR=*PCDA TDIR&0x0FEFF;// IOPC0(SDA为输入)

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

for(flag=0x0080;flag!=0x00;flag=flag/2)

{

*PCDA TDIR=*PCDA TDIR|0X0008;// SCL=1

sz=*PCDA TDIR&flag;// 取得应该读取的相应位

if(sz==flag) k=k|flag;// 若读取的相应位为1,则k值的相应位置1

*PCDA TDIR=*PCDA TDIR&0X0FFF7; // SCL=0

}

return(k);

}

// 对I2C总线产生应答

void I2CAck()

{

int k;

280

*PCDA TDIR=*PCDA TDIR|0X0100;// 设置IOPC0为输出口

*PCDA TDIR=*PCDA TDIR&0x0FFFE;// SDA=0

for(k=3;k>0;k--) { k=k;} // 软件延时

*PCDA TDIR=*PCDA TDIR|0X0008;// SCL=1

for(k=7;k>0;k--) { k=k;} // 软件延时

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

*PCDA TDIR=*PCDA TDIR|0X0001;// SDA=1,数据线恢复为1,但此时SCL=0,SDA在

// 后来可以改变

}

// 不对I2C总线产生应答

void I2CNoAck()

{

*PCDA TDIR=*PCDA TDIR|0X0100;// 设置IOPC0为输出口

*PCDA TDIR=*PCDA TDIR|0X0001;// SDA=1

*PCDA TDIR=*PCDA TDIR|0X0008;// SCL=1

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

}

// 停止I2C总线

void I2CStop()

{

int k;

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

*PCDA TDIR=*PCDA TDIR|0X0100;// 设置IOPC0为输出口

*PCDA TDIR=*PCDA TDIR&0x0FFFE;// SDA=0

*PCDA TDIR=*PCDA TDIR|0X0008;// SCL=1

for(k=7;k>0;k--) { k=k;} // 软件延时

*PCDA TDIR=*PCDA TDIR|0x0001;// SDA=1

for(k=7;k>0;k--) { k=k;} // 软件延时

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

}

// 读数据子程序

int read(array,control,n)

int *array,control,n;

{

int dat;

I2CStart();// 设置I2C总线的开始状态

I2CSendByte(control);// 送出控制字节(R/W=1)

dat=I2CRECACK();// 检查应答位

281

if(dat==0){

for(;n!=1;n--,array++) {

dat=I2CRecByte();// 读取一个字节的数据

I2CAck();// 产生应答信号

*array=dat;// 把读取的数据存入数组

}

dat=I2CRecByte();// 接收最后一个字节的数据

I2CNoAck();// 不产生应答信号

*array=dat;// 把读取的数据存入数组

dat=0x00;// dat值赋0,表示前面的操作成功

}

return(dat);

}

// 写数据子程序

int write(array,control,n)

int *array,control,n;

{

int dat;

*PDDA TDIR=*PDDA TDIR&0X0FFFE;// 设置写允许,WP=0

for(;n!=0;n--,array++) {

I2CSendByte(*array);// 写出一个字节数据

dat=I2CRECACK();

if(dat==1) break;// 如果无应答位,则写数据失败,终止写操作}

*PDDA TDIR=*PDDA TDIR|0X0001;// 写操作完成,设置写保护:WP=1

return(dat);

}

// 通用读写24LC256子程序,入口参数为输入/输出缓冲区首地址array,

// 24LC256的块内地址adress,控制字节control,需要读写的字节数n

int EEPROM(array,adress,control,n)

int *array,adress,control,n;

{

int dat;

I2CStart();// 设置I2C总线的开始状态

dat=control&0x0FFFE;// 清除控制字节的第0位

I2CSendByte(dat);// 送出控制字节(R/W=0)

dat=I2CRECACK();// 检查应答位

if(dat==0) {

282

dat=adress&0x0FF00;

dat=dat>>8;// dat=24LC256的块内地址的高字节

I2CSendByte(dat);// 送出24LC256的块内地址的高字节

dat=I2CRECACK();// 检查应答位

if(dat==0) {

dat=adress&0x00FF;

I2CSendByte(dat);// 送出24LC256的块内地址的低字节

dat=I2CRECACK();// 检查应答位

if(dat==0) {

dat=control&0x0001;

switch(dat) {

case 1 :dat=read(array,control,n);break;// 调用读数据子程序

case 0 :dat=write(array,control,n);break;// 调用写数据子程序

}

}

}

}

I2CStop();

return(dat);// 返回一个状态字,以确定操作是否成功

}

// 主程序

main()

{

int k;

sysinitial();// 系统初始化

ioinitial();// io端口初始化

while(1) {

k=EEPROM(source,0x0000,0x00A0,4);

if(k==0) break;

} // 如果写入成功,则终止写操作,否则继续写

for(k=0x20;k>0;k--) { k=k;}

while(1) {

k=EEPROM(result,0x00,0x00A1,4);

if(k==0) break;// 如果读出成功,则终止读操作,否则继续读}

}

// 直接返回中断服务子程序

void interrupt nothing()

283

{

return;

}

13.3 I2C串行日历时钟与TMS320LF2407的接口及应用

源程序代码:

// 该程序实现对I2C总线日历时钟芯片PCF8583的读写操作

#include "register.h"

// 系统初始化子程序

void sysinit()

{

asm( " setc INTM ");// 关闭总中断

asm( " clrc SXM ") ;// 抑制符号扩展

asm( " clrc OVM ") ;// 累加器结果正常溢出

asm( " clrc CNF ") ;// B0被配置为数据空间

*SCSR1=0X81FE;// CLKIN=6M,CLKOUT=24M

*WDCR=0X0E8 ;// 不使能看门狗

*IMR=0X00;// 禁止所有中断

*IFR=0X0FFFF;// 清除所有的中断标志

WSGR=0x0FFFF;// 不使能所有的等待状态

}

// 输入输出口初始化子程序

void IOINIT()

{

*MCRB=*MCRB&0X0FFD7;// 配置IOPC3和IOPC5为一般的I/O口方式

*PCDA TDIR=*PCDA TDIR|0X02828;// 配置IOPC3和IOPC5为输出方式,且SCL=SDA=1

}

// 软件延时子程序

void delay()

{

int i;

for(i=0X07D;i--;) { i=i;}

}

// 启动I2C总线子程序

void START()

{

*PCDA TDIR=*PCDA TDIR|0X028;// SDA=SCL=1

delay( );// 软件延时,以使时序匹配

284

*PCDA TDIR=*PCDA TDIR&0X0FFDF;// SDA=0

delay();// 软件延时,以使时序匹配

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

delay();// 软件延时,以使时序匹配

}

// 发送字节子程序

void TRANSMIT(TRAN)

int TRAN;

{

int flag,sz;// 定义需要的局部变量

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

delay();// 软件延时,以使时序匹配

for(flag=0x0080;flag!=0x00;flag=flag/2) {

sz=TRAN&flag;// 屏蔽掉不需要的位

if(sz==0) *PCDA TDIR=*PCDA TDIR&0X0FFDF;// 如果相应的位为0,则SDA=0

else *PCDA TDIR=*PCDA TDIR|0X020;// 如果相应的位为1,则SDA=1

delay();// 软件延时,以使时序匹配

*PCDA TDIR=*PCDA TDIR|0X08;// SCL=1

delay();// 软件延时,以使时序匹配

*PCDA TDIR=*PCDA TDIR&0X0FFF7; // SCL=0

delay();// 软件延时,以使时序匹配

}

}

// 从机(即PCF8583芯片)应答子程序。返回值为0时,代表操作成功;返回值为1时,代表操作失败

int SLA VE_ACK()

{

int sz,k=0;// 定义所需要的局部变量

*PCDA TDIR=*PCDA TDIR|0X0020;// SDA=1

delay();// 软件延时,以使时序匹配

*PCDA TDIR=*PCDA TDIR&0X0DFFF;// 设置IOPC5(SDA)为输入

delay();// 软件延时,以使时序匹配

*PCDA TDIR=*PCDA TDIR|0X08;// SCL=1

delay();// 软件延时,以使时序匹配

sz=*PCDA TDIR&0X0020;// 检测数据位

if(sz==0X0020) k=1;// 如果数据位为1,则证明失败,则令k=1

else k=0;// 如果数据位为0,则证明成功,则保持k=0不变

*PCDA TDIR=*PCDA TDIR|0X2000;// 设置IOPC5(SDA)为输出

*PCDA TDIR=*PCDA TDIR&0X0FFD7;// SCL=SDA=0

285

return(k);

}

// I2C停止子程序

void STOP()

{

*PCDA TDIR=*PCDA TDIR&0X0FFDF;// SDA=0

delay();

*PCDA TDIR=*PCDA TDIR|0X0008;// SCL=1

delay( );// 软件延时,以使时序匹配

*PCDA TDIR=*PCDA TDIR|0X0020;// SDA=1

}

// 字节写子程序,即向I2C器件写1个字节的数据,入口为地址BYTE_ADDR和需要写入的字节

// 内容T_DA TA。返回值为0时,代表操作成功;返回值为1时,代表操作失败

int BYTE_WR(BYTE_ADDR,T_DA TA)

int BYTE_ADDR,T_DA TA;

{

int k;

START();// 启动I2C总线

TRANSMIT(0X0A0);// 送写控制字

k=SLA VE_ACK();// 从机(即PCF8583芯片)应答

if(k==0) TRANSMIT(BYTE_ADDR);// 送出地址

if(k==0) k=SLA VE_ACK();// 从机(即PCF8583芯片)应答

if(k==0) TRANSMIT(T_DA TA);// 送出需要保存的数据

if(k==0) k=SLA VE_ACK();// 从机(即PCF8583芯片)应答

if(k==0) STOP();// 设置停止状态

return(k);

}

// 接收一个字节子程序,出口为接收到的数据R_DA TA

int RECEIVE()

{

int R_DA TA=0,sz,i;

*PCDA TDIR=*PCDA TDIR&0X0DFFF;// 设置IOPC5(SDA)为输入

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

delay();// 软件延时,以使时序匹配

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

R_DA TA=R_DA TA<<1;// R_DA TA左移一位

*PCDA TDIR=*PCDA TDIR|0X0008;// SCL=1

delay();// 软件延时,以使时序匹配

286

sz=*PCDA TDIR&0X0020;// 取得相应的数据位

if(sz==0) R_DA TA=R_DA TA&0XFFFE;// 如果数据位为0,则R_DA TA最低位清0

else R_DA TA=R_DA TA|0x0001;// 如果数据位为1,则R_DA TA最低位置1

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

delay();// 软件延时,以使时序匹配

}

*PCDA TDIR=*PCDA TDIR|0X2000;// 设置IOPC5(SDA)为输出

return(R_DA TA);// 返回接收的字节

}

// 主机无应答信号子程序

void NO_ACK()

{

*PCDA TDIR=*PCDA TDIR|0X0008;// SCL=1

delay();// 软件延时,以使时序匹配

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

}

// 主机应答子程序

void MASTER_ACK()

{

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

*PCDA TDIR=*PCDA TDIR&0X0FFDF;// SDA=0

*PCDA TDIR=*PCDA TDIR|0X0008;// SCL=1

delay();// 软件延时,以使时序匹配

*PCDA TDIR=*PCDA TDIR&0X0FFF7;// SCL=0

}

// 字节读子程序,即从I2C器件读出1个字节的数据,入口为需要读出的地址BYTE_ADDR,出口

// 为读出的数据R_DA TA,通过C语言的参数传递功能实现。返回值为0X0FFFF时,表示操作失败;

// 否则操作成功

int BYTE_RD(int BYTE_ADDR)

{

int k,R_DA TA;

START();// 启动I2C总线

TRANSMIT(0XA0);// 送出写控制字,以写入地址字节

k=SLA VE_ACK( );// 从机(即PCF8583芯片)应答

if(k==0) TRANSMIT(BYTE_ADDR);// 送出需要读出数据的地址

k=SLA VE_ACK();// 从机(即PCF8583芯片)应答

if(k==0) {

START( );// 启动I2C总线

287

TRANSMIT(0XA1);

} // 送出读控制字

k=SLA VE_ACK();// 从机(即PCF8583芯片)应答

if(k==0) {

R_DA TA=RECEIVE();// 接收PCF8583发出的数据

NO_ACK();// 主机不作应答

STOP();// 设置停止状态

}

if(k==0) return(R_DA TA);// 返回一个读出的数据

else return(0X0FFFF);// 如果整个读过程有误,则返回0X0FFFF

}

// 连续写子程序,入口为需要写的起始地址ADDR,存储需要写入数据的数组的首地址ARRY,需要

// 写入的数据的个数N

int CON_WR(ADDR,ARRA Y,N)

int ADDR,*ARRA Y,N;

{

int k;

START();// 启动I2C总线

TRANSMIT(0X0A0);// 送写控制字

k=SLA VE_ACK();// 从机(即PCF8583芯片)应答

if(k==0) TRANSMIT(ADDR);// 送出要写数据的起始地址

if(k==0) k=SLA VE_ACK();// 从机(即PCF8583芯片)应答

if(k==0) {

for(;N>0;N--,ARRA Y++) {

TRANSMIT(*ARRA Y);// 送出需要保存的数据,保存在数组ARRA Y中

k=SLA VE_ACK();// 从机(即PCF8583芯片)应答,地址自动加1

if(k==1) break;

}

}

STOP();// 设置停止状态

return(k);

}

// 连续读子程序,入口为需要读的起始地址ADDR,存储读出数据的数组首地址ARRY,需要读出的

// 数据的个数N

int CON_RD(ADDR,ARRA Y,N)

int ADDR,*ARRA Y,N;

{

int k,R_DA TA;

288

START();// 启动I2C总线

TRANSMIT(0XA0);// 送出写控制字,以写入地址字节

k=SLA VE_ACK();// 从机(即PCF8583芯片)应答

if(k==0) TRANSMIT(ADDR);// 送出需要读出数据的地址

k=SLA VE_ACK();// 从机(即PCF8583芯片)应答

if(k==0) {

START();// 启动I2C总线

TRANSMIT(0XA1);

} // 送出读控制字

k=SLA VE_ACK();// 从机(即PCF8583芯片)应答

if(k==0) {

for(;N>1;N--,ARRA Y++) {

R_DA TA=RECEIVE();// 接收PCF8583发出的数据

*ARRA Y=R_DA TA;// 读出的数据存入数组

MASTER_ACK();// 主机应答,地址自动加1

}

R_DA TA=RECEIVE();// 接收PCF8583发出的数据

*ARRA Y=R_DA TA;// 读出的数据存入数组

NO_ACK();// 主机不作应答

STOP();// 设置停止状态

}

return(k);// k=0时表示操作成功,k=1时表示操作失败

}

// 主程序

main()

{

int k;

int R_DA TA;

static int source[6]={0x0F,0x0E,0x0D,0x0C,0x0B,0x0A};

int result[6];

sysinit();// 系统初始化

IOINIT();// 输入输出口初始化

k=BYTE_WR(0x00,0x00);// 设置PCF8583的控制状态寄存器,其地址为0x00,值0x00代

// 表的意义请参考相关资料,若k==0,则证明写入成功;若k==1,

// 则证明写入失败

R_DA TA=BYTE_RD(0x00);// 读出地址单元0X00的值,如果读出值为0X0FFFF,则表示读

// 出值有误

k=CON_WR(0x30,source,6);// 从0x30地址开始连续写入6个数据

289

k=CON_RD(0x30,result,6);// 把写入的数据连续读出

}

// 直接返回中断服务子程序

void interrupt nothing()

{

return;

}

290

是否具有对高级语言HLL(High Level Language)的支持已成为衡量微控制器性能的标准之一。显然,在HLL平台上要比在汇编级上编程具有诸多优势:代码清晰易读、易维护,易形成模块化,便于重复使用从而增加代码的开发效率。

HLL中又因C语言的可移植性最佳而成为首选。因此,支持C语言几乎是所有微控制器设计的一项基本要求。μ?nSP?指令结构的设计就着重考虑了对C语言的支持。GCC是一种针对μ?nSP?操作平台的ANSI-C编译器,

1 μ’nSP?支持的C语言算逻操作符(#)

在μ?nSP?的指令系统算逻操作符与ANSI-C算符大同小异,见表4.6。

2 C语言支持的数据类型

μ?nSP?支持ANSI-C中使用的基本数据类型如表4.7所示。

3 程序调用协议

由于C编译器产生的所有标号都以下划线(_)为前缀,而C程序在调用汇编程序时要求汇编程序名也以下划线( _ )为前缀。

模块代码间的调用,是遵循μ?nSP?体系的调用协议(Calling Convention)。所谓调用协议,是指用于标准子程序之间一个模块与另一模块的通讯约定;即使两个模块是以不同的语言编写而成,亦是如此。

调用协议是指这样一套法则:它使不同的子程序代码之间形成一种握手通讯接口,

291

C语言程序中关于文件的操作

文件操作函数C语言(FILE fputc fgetc fputs fgets fscanf fprintf) 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:typedef struct{ int level;/*fill/empty level of buffer*/ unsigned flags;/*File status flags*/ char fd;/*File descriptor*/ unsigned char hold;/*Ungetc char if no buffer*/ int bsize;/*Buffer size*/ unsigned char_FAR*buffer;/*Data transfer buffer*/ unsigned char_FAR*curp;/*Current active pointer*/ unsigned istemp;/*Temporary file indicator*/ short token;/*Used for validity checking*/ }FILE;/*This is the FILE object*/ FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表函数功能 fopen()打开流 fclose()关闭流 fputc()写一个字符到流中 fgetc()从流中读一个字符 fseek()在流中定位到指定的字符 fputs()写字符串到流 fgets()从流中读一行或指定个字符 fprintf()按格式输出到流 fscanf()从流中按格式读取 feof()到达文件尾时返回真值 ferror()发生错误时返回其值 rewind()复位文件定位器到文件开始处 remove()删除文件 fread()从流中读指定个数的字符 fwrite()向流中写指定个数的字符 tmpfile()生成一个临时文件流 tmpnam()生成一个唯一的文件名 下面就介绍一下这些函数 1.fopen() fopen的原型是:FILE*fopen(const char*filename,const char*mode),fopen实现三个功

《C语言程序设计》第1章 C语言概述练习题答案

第一章 C语言概述练习题 一、选择题 1.C语言是一种( )。 A) 机器语言B) 汇编语言C) 高级语言D) 低级语言 2.下列各项中,不是C语言的特点是( )。 A) 语言简洁、紧凑,使用方便B) 数据类型丰富,可移植性好 C) 能实现汇编语言的大部分功能D) 有较强的网络操作功能 3.下列叙述正确的是( )。 A) C语言源程序可以直接在DOS环境中运行 B) 编译C语言源程序得到的目标程序可以直接在DOS环境中运行 C) C语言源程序经过编译、连接得到的可执行程序可以直接在DOS环境中运行 D) Turbo C系统不提供编译和连接C程序的功能 4.下列叙述错误的是()。 A) C程序中的每条语句都用一个分号作为结束符 B) C程序中的每条命令都用一个分号作为结束符 C) C程序中的变量必须先定义,后使用 D) C语言以小写字母作为基本书写形式,并且C语言要区分字母的大小写 5.一个C程序的执行是从()。 A) 本程序的main函数开始,到main函数结束 B) 本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C) 本程序文件的第一个函数开始,到本程序main函数结束 D) 本程序的main函数开始,到本程序文件的最后一个函数结束 6.以下叙述不正确的是()。 A) 一个C源程序必须包含一个main函数 B) 一个C源程序可由一个或多个函数组成 C) C程序的基本组成单位是函数 D) 在C程序中,注释说明只能位于一条语句的后面 7.C语言规定:在一个源程序中,main函数的位置( )。 A)必须在程序的开头B)必须在系统调用的库函数的后面 C)可以在程序的任意位置D)必须在程序的最后 8.一个C语言程序是由( )。 A)一个主程序和若干个子程序组成B) 函数组成 C) 若干过程组成D) 若干子程序组成 9.以下有4组用户标识符,其中合法的一组是()。 A) For B) 4d C) f2_G3 D) WORD -sub DO IF void Case Size abc define 10. 一个算法应该具有“确定性”等5个特性,下面对另外4个特性的描述中错误的是 ()。 A) 有零个或多个输入B) 有零个或多个输出C) 有穷性D) 可行性 二、填空题 1.汇编语言属于面向( 面向机器的 )语言,高级语言属于(面向问题的)语言。 2.用高级语言编写的程序称为(源)程序,它可以通过解释程序翻译一句执行一句的方式 执行,也可以通过编译程序一次翻译产生(目标)程序,然后执行。

C语言程序简单例子讲解学习

实验二参考答案 1.输入两个整型数字,输出他们的和。 #include main() { int a, b, sum; scanf(“%d%d ”, &a, &b); sum=a+b; printf(“a+b=%d ”, sum); } 2.输入两个实型数,输出他们的和与乘积。 #include main() { float a, b, sum, product; scanf(“%f%f ”, &a, &b); sum=a+b; product=a*b; printf(“a+b=%5.2f, a*b =%5.2f ”, sum, product); } 3.求方程02=++c bx ax 的根(设042≥-ac b )(其中a ,b ,c 的值由键盘输入)。 #include #include main() { float a, b, c, dt, x1, x2; scanf(“%f%f%f ”, &a, &b, &c); dt=sqrt(b*b-4*a*c); x1=(-b+dt)/(2*a); x2=(-b-dt)/(2*a); printf(“x1=%5.2f, x2 =%5.2f ”, x1, x2); }

4.鸡兔同笼,已知鸡兔总头数为h,总脚数为f,求鸡兔各多少只?(h和f的值由键盘输入,输出鸡和兔的头数) #include main() { int h, f, x,y; scanf(“%d%d”, &h, &f); x=2*h-f/2; y=f/2-h; printf(“x=%d, y =%d”, x, y); }

C语言文件操作大全

1.创建文件夹 //using System.IO; Directory.CreateDirectory(%%1); 2.创建文件 //using System.IO; File.Create(%%1); 3.删除文件 //using System.IO; File.Delete(%%1); 4.删除文件夹 //using System.IO; Directory.Delete(%%1); 5.删除一个目录下所有的文件夹 //using System.IO; foreach (string dirStr in Directory.GetDirectories(%%1)) { DirectoryInfo dir = new DirectoryInfo(dirStr); ArrayList folders=new ArrayList(); FileSystemInfo[] fileArr = dir.GetFileSystemInfos(); for (int i = 0; i < folders.Count; i++) { FileInfo f = folders[i] as FileInfo; if (f == null) { DirectoryInfo d = folders[i] as DirectoryInfo; d.Delete(); } } } 6.清空文件夹 //using System.IO; Directory.Delete(%%1,true); Directory.CreateDirectory(%%1); 7.读取文件 //using System.IO; StreamReader s = File.OpenText(%%1); string %%2 = null; while ((%%2 = s.ReadLine()) != null){

简单C语言程序的例子

例子: #include main () { tips(); /*caller*/ printf(“\n Success is about banging on after others have let go”); } tips() /*caller*/ { printf (“\n When you reach the end of the rope tie a knot & hang on”,)0; } [上述程序的输出结果如下: When you reach the end of the ropt tie a knot & hang on. Success is about hanging on after others have let go.] #include main() { int a,fact; printf(“\nEnter any number”); scanf(“%d”,&a); fact=rec(a); printf(“Factorial value is%d”,fact); } rec(x); int x; { int f; if(x==1) return(1); else f=x*rec(x-1); return(f); } [其显示的结果为:Factorial value is 2.] 比较两个数较大的那个: #include main()

{ int a,b,max; scanf (“%d%d”,&a,&b); if (a>b) max=a; else max=b; printf (“%d”,max); } 输出a+b的值: #include void main() { int a,b,x; scanf (“%d%d”,&a,&b); x=a+b; printf (“%d”,x); } 输出a,b中最大的一位数: #include int max(int x,int y) { int z; if (x>y) z=x; else z=y; return(z); } void main() { int a,b,c; scanf (“%d%d”,&a,&b); c=max(a,b); printf (“%d\n”,c); } 输出Hello: #include int main() { printf (“Hello!”);

学生成绩查询c语言程序文件

填写说明: 1、同一名教师在不同教学班教授的同一门课程只须填写一份教学日历;由不同教师教授的同一门课程每人填写一份教学日历。 2、“作业、实验”栏中的作业,是指教师计划布置的,应该批改的作业。 3、法定假日不安排教学容,其课次顺排。 系统开发语言作业 现有一个班级,共10人,本学期共学习三门课程,设计一个学生成绩管理系统,要求如下: 1、完成三门课程成绩输入;或单门课程录入、或同时录入三门课。 2、完成成绩排序:按单科成绩排序、按平均分排序; 3、完成成绩统计:按单科分段统计人数、按平均分分段统计(60分以下,60-79分,80以上); 4、用结构体完成学生和成绩的输入: 5、完成成绩查询:单科查询、平均分查询、按查询、分段查询等; 6、完成奖学金统计:三门课均高于90分,一等奖学金;三门课均高于80分,二等奖学金,统计获奖学金人数 7、完成成绩输出:按单科输出、输出所有成绩、按平均分由高到低输出,输出奖学金等;. 作业要求 第1、2、3周、完成成绩录入、排序和统计 第4、5、6周、完成菜单和函数编制 第2、8、9周、完成成绩查询和统计 第10、11周、完成查询输出 第12、13周、讲程序进行函数化、模块化 第14、15周、应用指针、指针函数以及函数指针等 第16周,完善程序、验收。最后打印出完整代码清单 代码如下: #include struct student {

float math; float Chinese; float English; float average; char name[5]; }; void inputgread(struct student stu) //输入成绩 { int a=0; scanf("%s",https://www.wendangku.net/doc/5f16350647.html,); printf("按顺序输入数学成绩,语文成绩,英语成绩"); scanf("%f%f%f",&stu.math,&stu.Chinese,&stu.English); } void Chinesecompositor(struct student stu[]) //按语文排序{ int num=0,num2=0;

第三章 最简单的c程序设计

第三章最简单的c程序设计 实践教学: 属性:实训 时间:学时。 实践教学内容: 实验目的:熟悉运算符、表达式,掌握标准输入输出函数的适用方法和顺序结构程序设计的一般方法。 实验内容和步骤: 1.编程,要求从键盘按规定的格式输入时间(时:分:秒), 并将输入的时间在屏幕上显示出来,存入ex3_1.c文件, 并编译、调试、运行。 #include main() { int a ,b,c; scanf("%d%d%d",&a,&b,&c); if (a>24) printf("请重新输入"); if (b>60) printf("请重新输入"); if (c>60) printf("请重新输入"); printf("%d:%d:%d\n",a,b,c); return 0; }

2.编程,要求从键盘输入数据,使整型变量a=10,b=8;字符 型c1=’A’,c2=’a’;实型变量x=3.1,y=64.54。并按规定格式输出变量的值。格式如下。存入ex3-2.c文件,并编译、调试、运行。 __int___a=__10___b=____8 char_c1=__A,___c2=____a float___x=_3.1,___y=64.54 #include main() { int a=10,b=8; char c1='A',c2='a'; float x=3.1,y=64.54; return 0; } 3.c语言编程求ax2+bx+c=0并分析其结果。存入ex3_2.c文 件,并编译、调试、运行。 #include

简单C语言程序的例子

简单C语言程序的例子 Prepared on 22 November 2020

例子: #include<> main() { tips();/*caller*/ printf(“\nSuccessisaboutbangingonafterothershaveletgo”); } tips()/*caller*/ { printf(“\nWhenyoureachtheendoftheropetieaknot&hangon”,)0; } [上述程序的输出结果如下:Whenyoureachtheendoftheropttieaknot&hangon. Successisabouthangingonafterothershaveletgo.] #include<> main() { inta,fact; printf(“\nEnteranynumber”); scanf(“%d”,&a); fact=rec(a); printf(“Factorialvalueis%d”,fact); } rec(x); intx; { intf; if(x==1) return(1); else f=x*rec(x-1); return(f); } [其显示的结果为:Factorialvalueis2.] 比较两个数较大的那个: #include<> main() { inta,b,max;

scanf(“%d%d”,&a,&b); if(a>b) max=a; elsemax=b; printf(“%d”,max); } 输出a+b的值: #include<> voidmain() { inta,b,x; scanf(“%d%d”,&a,&b); x=a+b; printf(“%d”,x); } 输出a,b中最大的一位数:#include<> intmax(intx,inty) { intz; if(x>y)z=x; elsez=y; return(z); } voidmain() { inta,b,c; scanf(“%d%d”,&a,&b); c=max(a,b); printf(“%d\n”,c); } 输出Hello: #include<> intmain() { printf(“Hello!”); return0; } 求1~100的和: #include<>

C语言程序的设计试题库完整

一、选择题(每题1分,共20分) 1.C语言程序从main()函数开始执行,所以这个函数要写在(D )。 A.程序文件的开始B.程序文件的最后 C.它所调用的函数的前面D.程序文件的任何位置 2.下列方法中错误的是(D )。 A.主函数可以分为两个部分:主函数说明部分和主函数体。 B.主函数可以调用任何非主函数的其它函数。 C.任何非主函数可以调用其它任何非主函数。 D.程序可以从任何非主函数开始执行。 3.下列正确的标识符是(C )。 A.-a1 B.a[i] C.a2_i D.int t 4.C语言中的简单数据类型包括(D )。 A.整型、实型、逻辑型B.整型、实型、逻辑型、字符型 C.整型、字符型、逻辑型D.整型、实型、字符型 5.下列可以正确表示字符型常量的是(A )。 A.’\t’B.”a”C.”\n”D.297 6.在C语言中,字符型数据所占的内存空间是(C )。 A.2个字节B.4字节C.1字节D.由用户自定义 7.若int类型数据占2个字节,则unsigned int类型数据的取值范围是(B )。 A.0~255 B.0~65535 C.-32768~32767 D.-256~255 8.若有以下类型说明语句:char a;int b; float c; double d; 则表达式a*b+d-c的结果类型为(D )。 A.float B.char C.int D.double 9.下列正确的预编译命令是(D )。 A.define PI 3.14159 B.#define P(a,b)=strcpy(a,b) C.#define stdio.h D.#define PI 3.14159 10.为表示逻辑表达式7979 )&&( X<90 ) B.( X>79 )!=( X<90 ) C.7979 )||( X<90 ) 11.设有语句“int a=2,b=3,c=-2,d=2;”,则逻辑表达式“a>0&&b&&c<0&&d>0”的值是(A )。 A.1 B.0 C.-1 D.出错

简单的C程序介绍

简单的C程序介绍 例1: main()主函数说明 { 程序框架 printf(“abcdef”);函数体 } 语句 程序的功能是输出字符串:abcdef 例2:求两数之和。 main() { int a,b,c; a a=100; b=50; b c=a+b; c printf(“\n c=%d”,c); } 程序运行结果:c=150 例3:求两数中的最大值。函数类型函数名形参 main() int max (int x,int y) { int a,b,c; { int z; scanf(“%d,%d”,&a,&b); if(x>y) z=x; c=max(a,b); else z=y; printf(“\nmax is:%d”,c); return(z); } } a x b y c z (两个函数组成) C 的数据类型 ●基本类型(整型、实型、字符型、枚举型) ●构造类型(略) ●指针类型(略) ●空类型各类型包含常量与变量

3.2 常量与变量 ■常量与符号常量 常量 在程序运行过程中其值保持不变的量。 符号常量 用来代表一个常量的标识符。 #define PI 3.1415926 例: #define PI 3.1415926 main() { float r=2,c; c=2*PI*r; printf(“%f”,c); } ■变量 其值可以改变的量。 变量的三要素: ①变量名 每个变量有一个名字,作为识别该变量的标识符。 ②变量的值 每个变量有一个值,变量的值是随时可以改变的。 ③变量的存储单元 每个变量占据一个内存单元,用于存放变量的值。 变量名 a 变量值 存储单元 变量的命名规则: 由字母、数字和下划线组成 以字母或下划线开头

C语言中.h和.c文件解析

C语言中.h和.c文件解析20468104728 2010-1-9 15:32:30 收藏 | 打印 | 投票(1) | 评论(0) | 阅读(156) ◇字体:[大中小]---By xiaoxiaopig收集 简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件) 4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息。(生成.exe文件) 编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位,它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件,在PC上的程序开发,一般都有一个main函数,这是各个编译器的约定,当然,你如果自己写连接器脚本的话,可以不用main函数作为程序入口!!!! (main .c文件目标文件可执行文件) 有了这些基础知识,再言归正传,为了生成一个最终的可执行文件,就需要一些目标文件,也就是需要C文件,而这些C文件中又需要一个main函数作为可执行程序的入口,那么我们就从一个C文件入手,假定这个C文件内容如下: #include #include "mytest.h" int main(int argc,char **argv) { test = 25; printf("test.................%d\n",test); } 头文件内容如下: int test; 现在以这个例子来讲解编译器的工作: 1.预处理阶段:编译器以C文件作为一个单元,首先读这个C文件,发现第一句与第二句是包含一个头文件,就会在所有搜索路径中寻找这两个文件,找到之后,就会将相应头文件中

实验项目:实验一 最简单的C程序设计

实验项目:实验一最简单的C程序设计 (所属课程:《C语言程序设计》学时:2) 一、实验目的 1.掌握:使用标准输入/输出函数进行常见数据类型的数据的输入/输出方法。 2.初步培养编制程序框图和源程序、准备测试数据以及实际调试程序的独立编程能力。 3.掌握顺序结构程序设计的基本思路。 二、实验条件 Pc和vc++编程环境 三、实验内容 1.熟悉编程环境。 2.输入并运行一个C程序 3.掌握各种格式转换符的正确使用方法。 4.编程序:设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。要求用scanf函数从键盘上输入数据(半径和高),输出各计算结果,输出时要求有文字说明,取小数点后2位数字。5.编程序:用getchar函数输入两个字符给C1、C2,然后分别用putchar 函数和printf函数输出这两个字符。 四、实验步骤 编写程序,输入数据,观察结果。 五、实验结果 观察结果和预期是否一致。 实验项目:实验二选择结构程序设计

(所属课程:《C 语言程序设计》学时:2) 一、实验目的 1.了解C 语言表示逻辑量的方法(以0代表“假”,以非0代表“真”)。 2.学会正确使用逻辑运算符和逻辑表达式。 3.熟练掌握if 语句和switch 语句 二、实验条件 Pc 和vc++编程环境 三、实验内容 1.有一函数: ?? ???≥-<≤-<=)10x (113x )10x 1(12x )1x (x y 用scanf 函数输入x 的值,求y 值。 运行程序,输入x 的值(分别为x<1、1≤x <10、x ≥10三种情况),检查输出的y 值是否正确。 2.给出一个百分制成绩,要求输出成绩等级A 、B 、C 、D 、E 。90分以上为A ,81~89分为B ,71~79分为C ,61~69分为D ,60分以下为E 。 3.输入4个整数,要求按由小到大顺序输出。 四、实验步骤 编写程序,输入数据,观察结果。 五、实验结果 观察结果和预期是否一致。 实验项目:实验三 循环结构程序设计

c语言程序中文件的操作

文件操作函数 C语言 (FILE fputc fgetc fputs fgets fscanf fprintf) 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在中定义如下: typedef struct { int level; /* fill/empty level of buffer */ unsigned flags; /* File status flags */ char fd; /* File descriptor */ unsigned char hold; /* Ungetc char if no buffer */ int bsize; /* Buffer size */ unsigned char _FAR *buffer; /* Data transfer buffer */ unsigned char _FAR *curp; /* Current active pointer */ unsigned istemp; /* Temporary file indicator */ short token; /* Used for validity checking */ } FILE; /* This is the FILE object */ FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表函数功能 fopen() 打开流 fclose() 关闭流 fputc() 写一个字符到流中

C语言 实验五 最简单的C语言程序设计

实验5:最简单的C语言程序设计 一、实验目的: (1)掌握C语言中使用最多的一种语句——赋值语句的使用方法。(2)掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。(3)进一步掌握编写程序和调试程序的方法。 二、实验内容和步骤: 1、通过下面的程序掌握各种格式转换符的正确使用方法。 (1)输入以下程序: /* Note:Your choice is C IDE */ # include int main( ) {int a,b; float d,e; char c1,c2; double f,g; long m,n; unsigned int p,q; a=61,b=62; c1='a';c2='b'; d=3.56;e=-6.87; f=3157.890121;g=0.123456789; m=50000;n=-60000; p=32768;q=40000; printf("a=%d,b=%d\nc1=%c,c2=%c\nd=%6.2f,e=%6.2f\n",a,b,c1,c2,d,e); printf("f=%15.6f,g=%15.12f\nm=%1d\np=%u,q=%u\n",f,g,m,n,p,q); 显示结果: (2)运行此程序并分析结果。 (3)在此基础上,将程序第10~14行改为c1=a,c2=b; f=3157.890121;g=0.123456789; d=f;e=g;运行程序,分析结果。 /* Note:Your choice is C IDE */ #include"stdio.h"

int main() {int a,b; float d,e; char c1,c2; double f,g; long m,n; unsigned int p,q; a=61;b=62; c1=a;c2=b; f=3157.890121;g=0.123456789; d=f;e=g; p=a=m=50000;q=b=n=-60000; printf("a=%d,b=%d\nc1=%c,c2=%c\nd=%6.2f,e=%6.2f\n",a,b,c1,c2,d,e); printf("f=%15.6f,g=%15.12f\nm=%1d,n=%1d\np=%u,q=%u\n",f,g,m,n,p,q); } 显示结果: (4)用sizeof运算符分别检测程序中各类型的数据占多少字节。例如,int型变量a的字节数为sizeof(a)或sizeof(int),用printf函数语句输出各类型变量的长度(字节数)。 程序如下: # include int main( ) {printf("int:%d\n",sizeof(int)); return 0; } 显示结果: #include int main( ) {printf("float:%d\n",sizeof(float)); return 0; }

c语言简单程序---初学者

c语言简单程序---初学者

素数的筛选 #include #include #define N 1000 int main(int argc, char* argv[]) { int i,j,num[N]; for(i=0;i

for(i=1;i main() { int x,s,t,d; scanf("%d",&x); s=x%60; t=(x/60)%60; d=(x/60)/60; printf("%d时%d分%d秒",d,t,s); } 三个数的交换 #include void main() { int a,b,c,t;

scanf("%d%d%d",&a,&b,&c); printf("The original number:a=%d,b=%d,c=%d\n",a,b,c); t=a,a=b,b=t; t=a,a=c,c=t; printf("after swap:a=%d,b=%d,c=%d",a,b,c); } switch语句的运用 #include main() { int a,m; printf("please input a number:"); scanf("%d",&a); switch(a/10) { case 10: case 9: m=5; break; case 8: m=4; break; case 7:m=3; break; case 6:m=2; break;

C语言程序的设计个简单的经典例子

经典C语言程序设计100例 1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯并按条件打印笑脸 11.经典兔子问题 12.判断素数 13.水仙花数问题 14.正整数分解质因数 15.学习成绩划分 16.正整数求其最大公约数和最小公倍数 17.统计英文字母/空格/数字个数 18.求s=a+aa+aaa+aa...a的值 19.求解"完数" 20.球体自由落下物理问题 21.猴子吃桃问题 22.乒乓球比赛抽签问题 23.打印菱形图案 24.分数数列求和 25.求1+2!+3!+...+20!的和26.利用递归方法求5! 27.将输入字符以相反顺序打印 28.岁数问题 29.求解正整数位数 30.判断回文数 31.星期几猜测游戏 32.改变文本颜色 33.学习gotoxy()与clrscr()函数34.练习函数调用 35.设置文本颜色 36.求100之内的素数 37.对10个数进行排序38.求3*3矩阵对角线元素之和 39.数字插入数组重新排序40. 将一个数组逆序输出 41.static定义静态变量用法42. 使用auto定义变量用法43.使 用static的另一用法 44.使用external的用法 45.使用register定义变量方法 46.宏#define命令练习(1) 47.宏#define命令练习(2) 48.宏#define命令练习(3) 49.#if #ifdef和#ifndef的综 合应用 50.#include 的应用练习 51.学习使用按位与 & 52.学习使用按位或 | 53.学习使用按位异或 ^ 54.取一个整数从右端开始的 4~7位。 55.学习使用按位取反~ 56.用circle画圆形 57.学用line画直线 58.用rectangle画方形 59.画图综合例子1 60.画图综合例子2 61.打印杨辉三角形 62.学习putpixel画点 63.画椭圆ellipse 64.利用ellipse and rectangle 画图 65.画个最优美的图案 66.输入3个数字按大小顺序输 出 67.输入数组交换元素重新输出 68.多个整数后移位置问题 69.圆圈报数问题 70.计算一个字符串长度 71.编写输入/输出函数 72.创建链表 73.反向输出链表 74.连接两个链表 75.算一道简单题目 76.调用函数求 1/2+1/4+...+1/n 77.填空练习(指向指针的指针) 78.找到年龄最大的人 79.字符串排序 80.海滩猴子分桃 81.已知公式条件求数字 82.八进制转换为十进制 83.求0-7所能组成的奇数个数 84.由两个素数之和表示的偶数 85.判断一个素数能被几个9整 除 86.两个字符串连接程序 87.结构体变量传递 88.读取数字的整数值并打印出 该值个数的* 89.数据加密 90.专升本一题 91.时间函数举例1 92.时间函数举例2 93.时间函数举例3 94.一个猜数游戏 95.家庭财务管理小程序 96.计算字符串中子串出现的次 数 97.输入字符并保存到磁盘98. 字符串转换成大写字母并输出 保存 99.文件操作应用1 100.文件操作应用2 --------------------------------------------------------------------------------

C语言多文件编程

C语言多文件编程 现在先写一个简单的程序。学过C语言的你都能看懂。 在DEV-C++下编辑下面的程序: [cpp]view plaincopyprint? 1.#include 2.#include 3.void func1(); //函数声明 4.void func2(); //函数声明 5.void func3(); //函数声明 6.int main() 7.{ 8. printf("hello world!\n"); 9. func1(); 10. func2(); 11. func3(); 12. system("pause"); 13. return 0; 14.} 1.//函数实现 2.void func1() 3.{ 4. printf("我是函数1\n"); 5. } 6.void func2()

7.{ 8. printf("我是函数2\n"); 9. } 10.v oid func3() 11.{ 12. printf("我是函数3\n"); 13. } 这个程序够简单吧!运行结果如下: 1.//myfile.h

2.void func1() 3.{ 4. printf("我是函数1\n"); 5. } 6.void func2() 7.{ 8. printf("我是函数2\n"); 9. } 10.v oid func3() 11.{ 12. printf("我是函数3\n"); 13. } 1.//main.c 2.#include 3.#include 4.#include"myfile.h" //注意,这里包含了我们自己写的头文件 5.int main() 6.{ 7. printf("hello world!\n"); 8. func1(); 9. func2(); 10. func3(); 11. system("pause"); 12. return 0; 13.}

实验3--最简单的C程序设计——顺序程序设计

①输入以下程序: #include int main() {int a,b; //定义整形a,b float d,e; //定义单精度浮点d,e char c1,c2; //定义字符c1,c2 double f,g; //定义双精度字符f,g long m,n; //定义长整形字符m,n unsigned int p,q; //定义无符号整形p,q a=61;b=62; //对a,b赋值61,62 c1='a';c2='b'; //对c1,c2赋值a,b d=3.56;e=-6.87; //对d,e赋值 f=3157.890121;g=0.123456789; //对f,g赋值 m=50000;n=-60000; //对m,n赋值 p=32768;q=40000; //对p,q赋值 printf("a=%d,b=%d\nc1=%c,c2=%c\nd=%6.2f,e=%6.2f\n",a,b,c1,c2,d,e); //输出a,b,c1,c2,d,e printf("f=%1.56f,g=%15.12f\nm=%ld,n=%ld\np=%u,q=%u\n",f,g,m,n,p,q); //按格式化输出f,g,m,n,使f小数点后保留56位,g的有效字符位15且保留12位小数 } ②运行此程序并分析结果。 ③在此基础上,将程序第10—14行改为: c1=a;c2=b; f=3157.890121;g=0.123456789; d=f;e=g; p=a=m=50000;q=b=n=-60000; 运行程序,分析结果。

④用sizeof运算符分别检测程序中各类型的数据占多少字节。例如,int型 变量a的字节数为sizeof(a)或sizeof(int),用printf函数语句输出各类型变量的长度(字节数)。 sizeof(int) = 4 sizeof(float) = 4; sizeof(double) = 8; sizeof(char) = 1; char *p; sizeof(p) = 4; sizeof(long) = 4; sizeof(unsigned int) = 4; ⑵设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。编程序,用scanf输入数据,输出计算结果。输出时要有文字说明,取小数点后面两位数。 解:程序如下: #include int main() {float h,r,l,s,sq,vq,vz; //定义h,r,l,s,sq,vq,vz float pi=3.1415926; // 设pi=3.1415926 printf("请输入圆半径r,圆柱高h:"); //输出:请输入圆半径r,圆柱高h:scanf("%f,%f",&r,&h); //输入r,h l=2*r*pi; //给l赋值为2*r*pi s=r*r*pi; //给s赋值为r*r*pi sq=4*pi*r*r; //给sq赋值为4*pi*r*r vq=4.0/3.0*pi*r*r*r; //给vq赋值为4.0/3.0*pi*r*r*r vz=pi*r*r*h; //给vz赋值为pi*r*r*h

c语言程序设计答案

1.什么是程序?什么是编程? 程序:是一组可以识别和执行的指令,每条指令使计算机执行特定的操作 编程:它涉及从确定任务到获得结果以及编写文档的整个过程 2.为什么需要计算机语言?高级语言的特点是什么? 为什么需要计算机语言:计算机语言解决了人与计算机之间交流的语言问题,因此计算机和人可以相互识别 高级语言的特点是什么 2.1高级语言的数据结构比汇编语言和机器语言丰富; 2.2高级语言与特定机器结构之间的关系与汇编语言和机器语言不紧密; 2.3高级语言更接近自然语言,更易于掌握; 2.4在执行计算机之前,必须先编译或解释以高级语言编写的程序; 3.正确理解以下名词及其含义: (1)源程序,目标程序,可执行程序。

源程序:是指按照某些编程语言规范编写的未编译文本文件,它是一系列人类可读的计算机语言指令 目标程序:一组源代码,可在编译源程序后由计算机直接运行。Obj用作计算机文件中的扩展名 可执行程序:将所有编译的目标模块连接并组装在一起,形成一个带有功能库的整体,以生成可以由计算机执行并成为可执行程序的目标程序 (2)程序编辑,程序编译,程序链接。 程序编辑:输入或编辑源程序。 程序编译: 首先,使用C提供的预处理器对程序中的预处理指令进行编译和预处理 检查源程序的语法,以确定是否存在语法错误,直到没有语法错误为止 编译器会自动以二进制形式将源程序转换为目标程序 程序连接:将所有已编译对象模块连接和组装为一个整体的过程称为程序连接

(3)程序,程序模块,程序文件。 程序:一组可以被计算机识别和执行的指令,并且可以在电子计算机上运行以满足人们的某些需求 程序模块:可以由汇编程序,编译器,装载程序或翻译程序整体处理的,独立且可识别的程序指令级别 程序文件:程序文件称为程序文件。程序文件存储程序,包括源程序和可执行程序(4)函数,主函数,被调用函数,库函数。 功能:封装一段常用代码,可以直接调用以完成某些功能 主要功能:又称主要功能,是程序执行的起点 被调用函数:当一个函数调用另一个函数时,第二个函数被调用 库函数:通常是指编译器可以在C源程序中调用的函数。它可以分为两种,一种是C语言标准指定的库函数,另一种是C语言标准指定的库函数 编译器特定的库函数

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