c语言51单片机实例程序详解大全

上传人:微*** 文档编号:168529746 上传时间:2022-11-10 格式:DOCX 页数:193 大小:254.06KB
返回 下载 相关 举报
c语言51单片机实例程序详解大全_第1页
第1页 / 共193页
c语言51单片机实例程序详解大全_第2页
第2页 / 共193页
c语言51单片机实例程序详解大全_第3页
第3页 / 共193页
点击查看更多>>
资源描述
【实例1】使用累加器进行简单加法运算:MOVA,#02H;A-2ADDA,#06H;A-A+06H【实例2】使用B寄存器进行简单乘法运算:MOVA,#02H;A-2MOVB,#06H;B-6MULAB;BA-A*B=6*2【实例3】通过设置RSI, RSO选择工作寄存器区1:CLRPSW.4;PSW.4-0SETBPSW.5;PSW.5-1【实例4】使用数据指针DPTR访问外部数据数据存储器:MOVDPTR, #data16;DPTRdata 16MOVXA, DPTR;A-( (DPTR)MOVX DPTR, A;(DPTR)-A【实例5使用程序计数器PC查表:MOVA, #data;A -dataMOVCA, A+DPTR;PC-(PC)+1 ,A-(A)+(PC)【实例6】if语句实例:void main() ( int a,b,c,min;printf(*n please input three number:);scanf(%d%d%d &a,&b,&c);if(ab&ac) printf(min=%dn,a); else if(ba&bc) printf(min=%dn,b); else if(ca&c0;a -) printf(%d,a);【实例9】while语句实例:void main() int i=0; while(i=10) i+;)实例10 dwhile语句实例:void main() int i=0;do i+; while(i=10);)【实例11】语句形式调用实例:void main() int i=0; while(i=10) i+;Sum();/常函数调用/)【实例12】表达式形式调用实例:void main() int a,bti=0; while(i=10) i+; i=4*Sum(a,b);/ 函数调用/)【实例13】以函数的参数形式调用实例: void main() int a,b,c,i=0; while(i=10) i+;i= max(c,Sum(a,b);六函数调用*/)【实例14】函数的声明实例:void main() int max(int xtint y);/*函数的声明/int a,b,c,i=0; while(i=10) i+;t= max(c,Sum(a,b); /* 函数调用率/)【实例15】函数递归调用的简单实例:void fun() int a= I, result,1; for(i=0;i10;) i=a+I;result = fun(); / 函数调用/return result;【实例16】数组的实例:void main() charnum33=#,, #,);/定义多维数组int i=0,j=0;for(;i3;i+)for(;j3;j+)printf(c”,num国!1);printf(47nM);)【实例17】指针的实例:void main() int a=3,*p;p=&a;/*将变量a的地址赋值给指针变量p*/printf(d,%d”,a,*p);/*输出二者的数值进行对比*/I【实例18】数组与指针实例:void main() int i=3,num3= 1,2,3 ),*p;p=num;/将数组num的地址赋值给指针变量p*/result =max(p,3); /函数调用,计算数组的最大值/)实例19 P1 口控制直流电动机实例sfrp 1=0x90;sbit p!0=plA0;sbitpll=plAl;void main ()int i, m;int j= 100;int k=20;/正快转for (i=0; i100; i+)(P10=l;for(j=0;j50;j+)Im=0;Pl 0=0;for(j=0;j10;j+)(正慢转fbr (i=0; iIOO; i+) (P10=i;for (j=0;j10;j+)(m=0pl 0=0;for (j=0; j50; j+)(m=0)/Z负快转for (i=0; il(X); i+) (pll=l;for(j=0;j50;j+)(m=0;pll=;for (j=0; j10; j+)(m=0;/Z负慢转for (i=0; i100; i+)(pll=l;fbr (j=0;j10;j+)(m=0;)pl 1=0for 0=O;j5O;j+)(m=0;【实例20I用74LS165实现串口扩展并行输入口(1)函数声明管脚定义/库函数声明,管脚定义#includesbit LOAD=P1A7;用P1A7控制SH/管脚(2)串口初始化函数UART_init()/Z 函数名称:UART_init()/Z功能说明:串口初始化,设定串口工作在方式/ /void UARTJnit(void)(SCON=OxlO;设串行口方式0,允许接收,启动接收过程ES=O;禁止串口中断)(3)数据接收函数PA()/Z函数名称:PA()/Z输入参数:无/Z输出参数:返回由并口输入的数据/Z功能说明:接收八位串行数据/unsigned char PA(void)1unsigned char PA_data;LOAD=0;当Pl.7输出低电平,74LS165将并行数据装入寄存器当中 LOAD=1;当P1.7输出高电平,74LS165在时钟信号下进行移位UART_init();/74LS165工作在时钟控制下的串行移位状态while(RI=0);循环等待RI=0;PA_data=SBUF;return PA_data;返回并行输入的数据I(1)函数声明管脚定义/库函数声明,管脚定义#includesbit a7=ACCA7;sbit simuseri_CLK=Pl A6;用P1A6模拟串口时钟sbit simuseri_DATA=Pl A5;用P1A5模拟串口数据sbit drive74165_LD=P1A7;用P1A7控制SH/管脚(2)数据输入函数in_simuseri()/-/Z 函数名称:in_simuseri()/Z输入参数:无/Z输出参数:data_buf/功能说明:8位同位移位寄存器,将simuseri_DATA串行输入的数据按从低位到/Z髙位/ 保存到 data_buf7/-unsigned char in_simuseri(void) unsigned char i;unsigned char data_buf;i=8; do (ACC=ACC1;for(;simuseri_CLK=0;);a7= simuseri_DATA;fbr(;simuseri_CLK= 1;);1while(-i!=0);simuseri_CLK=O;data_buf=ACC;return(data_buf);(3)数据输出函数PAs()/-/Z函数名称:PAs()/Z输入参数:无/Z输出参数:PAs_buf,返冋并行输入74LS165的数据/Z功能说明:直接调用,即可读取并行输入74LS165的数据,不需要考虑74LS165的 /Z工作原理/-unsigned char PAs(void) (unsigned char PAs_buf;drive74165_LD=O;drive74165_LD=l;PAs_buf= in_simuseri();return(PAs_buf);)【实例21】用74LS164实现串口扩展并行输出口单片机串口驱动74LS164的程序主要包括函数声明管脚定义部分、串口初始化函数以 及数据发送函数。(1)函数声明管脚定义/库函数声明,管脚定义#include sbit CLR=P1A7;用P”7控制CLR(2)串口初始化函数UART_init()/Z 函数名称:UART_init()/Z功能说明:串口初始化,设定串口工作在方式/void UART_init(void) (SCON =0x00;没串行方式,允许发送,启动发送过程ES=O;/禁止串口中断)(3)数据发送函数PA-out()/Z函数名称:PA_out()/Z输入参数:PA_data,需要从74LS164并行输出的数据/Z输出参数:无/Z功能说明:发送八位串行数据至并口void PA_out(unsigned char PA_data) (CLR=0;并口输出清零CLR=1;开始串行移位UART_init();/74LS165工作在时钟控制下的串行移位状态while(TI=0);循环等待TI=O;SBUF=PA_data; )单片机I/O端口驱动74LS164主要包括函数声明管脚定义部分、数据输入函数以及数据 输出函数。(1)函数声明管脚定义/库函数声明,管脚定义#include sbit simuseri_CLK=Pl A6;用P6模拟串口时钟 sbit simuseri_DATA=P 1A5;用P1A5模拟串口数据 sbit drive74164_CLR二Pl;用P1A7控制CLR sbit aO=ACCAO;(2)数据输入函数out_simuseri() /-/Z 函数名称:out_simuseri /Z输入参数:data.buf /Z输出参数:无/Z功能说明:8位同步移位寄存器,将data.buf的数据逐位输出到simuseri_DATAvoid out_simuseri(char data_buf) (char i;i=8;ACC=data_buf; do (simuseri_CLK=O;simuseri_DATA=aO;simuseri_CLK= 1;ACC=ACC1; ) while(i!=0); simuseri_CLK=O;)(3)数据输出函数PAut()/Z函数名称:PA_out/Z输入参数:Pseri-out,需要输出的8位数据/Z输出参数:无/Z功能说明:将Pseri_out中的数据送到?4165并行口 A-G输出/void PA_out (char Pseri_out) (drive74164_CLR =0;并口输出清零drive74164_CLR=1;开始串行移位out_simuseri(Pseri_out);)【实例22】P0I/。扩展并行输入口I/O 对应的地址为:1111 1110 1111 1111 B=FEFFHCPU操作指令为:#define 244_addr xbyteOXFEFF unsigned char I/O_DATA; I/O_DATA=244_addr;【实例23】POI/。扩展并行输出口I/O端口对应的地址为:1111 1101 1111 1111 B=FDFFHCPU操作指令为:#define 273_addr xbyteOXFDFF unsigned char I/O_DATA; 244_addr =I/O_DATA;【实例24】用8243扩展I/O端口#includesbit ContrBitO=P1A;sbit ContrBitl=PlAl;sbit ContrBit2=PlA2;sbit ContrBit3=PlA3;sbit PROG=P1A4;sbit CS=P1A5;char driver8243(char sele_P,char sele_M,char out_data) char in_data=0;char data_buf;PROG=1;置PROG为髙电平/-开始写控制字if(sele_P&0x01)=0)将控制字最低位送到8243的p2.0ContrBit0=0; else ContrBitO=l;if(sele_P&OxO2)=O)将控制字第二位送到 8243 的 p2.1ContrBitl=0;elseContrBitl = l;以上两位共同指定端口地址/-写端口工作模式控制字if(sele_M&0x01)=0)将端工作模式控制字低位送到8243的p2.2ContrBit2=0;elseContrBit2=l;if(sele_M&0x01)=0)将端工作模式控制字高位送到8243的p2.3ContrBit3=0; else ContrBit3=l; 完成写控制字 PROG=0; 在PROG上产生下降沿 switch(sele_M&0x03)判断工作模式( case 0: break; /sele_M=B00为输入,不处理,等待上升沿 case 1: data_buf=out_data; break; sele_M=B01为输出,直接送数据 case 2: data_buf=out_data; break; sele_M=B10为逻辑或,直接送数据 case 3: data_buf=out_data; break; sele_M二B11为逻辑与,直接送数据 ) PROG=1; 产生上升沿 if(sele_M&0x03)=0)sele_M二B00 为输入,接收数据in_data=(data_buf&OxOF); return(in_data); /sele_M=B00返回接收到的数据 ) sele_M!;B00,返回 void main( void)char receive_data;receive_data=driver8243( 1,0,5);实例25用8255A扩展1/O /-/Z函数名称:rd_PA/Z输入函数:无/Z输出参数:PA_data,PA输入的数据/功能说明:驱动PA实现输入功能,读入PA的并行数据/unsigned char rd_PA(void)读 PA(1) 管脚定义及函数声明/従i数声明,管脚定义#include#include#define a8255_PAXBYTE0x7F7C/PA 地址#define a8255_PBXBYTE0x7F7D/PB 地址#define a8255_PCXBYTE0x7F7E/PC 地址#define a8255_CON XBYTEOx7F7F/控制字地址unsigned char bdata IO_flags;用于表示PA、PB、PC的当前输入输出状态内容不能被其他程序改写sbit IO_flagsA=IO_flagsA0;PA的当前输入输出状态sbit IO_flagsB=IO_flagsA 1;/PB的当前输入输出状态sbit IO_flagsC=IO_flagsA2;/PC的当前输入输出状态unsigned char const cfg_table8= (0x80,/10000000b, c=outb=outa=out0x90,10010000b, c=outb=outa=in0x82,/10000010b, c=outb=ina=out0x92,/10010010b, c=outb=ina=in0x89,/10001001b, c=inb=outa=out0x99,/10011001b, c=inb=outa=in0x8B,/10001011b, c=inb=ina=out0x9B,/10011011b, c=inb=ina=inunsigned char rd_PA(void);读PAunsigned char rd_PB(void);读PBunsigned char rd_PC(void);读PCvoid wr_PA(unsigned char PA_data);写PAvoid wr_PB(unsigned char PB_data);写PBvoid wr_PC(unsigned char PC_data);写PCvoid set_PC(unsigned char PC_num);PC位操作,置位,PCwm为端口号 void clr_PC(unsigned char PC_num);PC位操作,复位,PC_num为端口号 void PABC_config(void);写8255A控制字(2) 端、B、C读写函数 (unsigned char PA_dala;ACC=IO_flags;把状态标志字读到ACC便于进行位操作 do IO_flagsA=l;置PA状态标志位为高输入IO_flags=ACC;PABC_config();调用配置子程序,完成对8255的设置 ACC=IO_flags;)while(IO_flagsA=0);判断状态标志位是否为髙 控制字设置完成PA_data=a8255_PA;把PA的数据读到PA_data retum(PA_data);返回 PA_data/Z函数名称:rd_PB/Z输入函数:无/Z输出参数:PB_data,PB输入的数据/功能说明:驱动PB实现输入功能,读入PB的并行数据/-unsigned char rd_PB(void)读 PB(unsigned char PB_data;ACC=IO_flags;把状态标志字读到ACC便于进行位操作doIIO_flagsB=l;置PB状态标志位为高输入IO_flags=ACC;PABC_config();调用配置子程序,完成对8255的设置)while(IO_flagsB=0);判断状态标志位是否为高控制字设置完成PB_data=a8255_PB;把PB的数据读到PB.datareturn(PB_data);返回 PB_data/-/Z函数名称:rd_PC/Z输入函数:无/Z输出参数:PC_data,PC输入的数据/Z功能说明:驱动PC实现输入功能,读入PC的并行数据/unsigned char rd_PC(void)读 PC(unsigned char PC_data;ACC=IO_flags;把状态标志字读到ACC便于进行位操作 do (IO_flagsC=l;置PC状态标志位为高输入IO_flags=ACC;PABC_config();调用配置子程序,完成对8255的设置/ACC=IO_flags;)while(IO_flagsC=0);判断状态标志位是否为高控制字设置完成PC_data=a8255_PC;把PC的数据读到PC.data retum(PC_data);返回 PC_data/Z函数名称:wr_PA/Z输入函数:PA_data,送PA输出的数据/Z输出参数:无/Z功能说明:驱动PA实现输出功能,输出数据到PA/void wr_PA(unsigned char PA_data) 写 PAACC=IO_flags;把状态标志字读到ACC便于进行位操作 (IO_flagsA=0;置PA状态标志位为低输出IO_flags=ACC;位操作完成,把ACC的内容写回状态标志字 PABC_config();调用配置子程序,完成对8255的设置 ACC=IO_flags;)while( IO_flags A= 1);判断状态标志位是否为髙, 为高,设置未完成,需从新设置 a8255_PA=PA_data;将PA.data的内容送到PA7/-/Z函数名称:wr_PB/输入函数:PB_data,送PB输出的数据/Z输出参数:无/Z功能说明:驱动PB实现输出功能,输出数据到PA/void wr_PB(unsigned char PB_data)写 PB(ACC=IO_flags;把状态标志字读到ACC便于进行位操作 (IO_flagsB=0;置PB状态标志位为低输出IO_flags=ACC;位操作完成,把ACC的内容写回状态标志字 PABC_config();调用配置子程序,完成对8255的设置 ACC=IO_flags;while(IO_flagsB= 1);判断状态标志位是否为高,为高,设置未完成, 需从新设置a8255_PB=PB_data;将PB.data的内容送到PB)/-/Z函数名称:wr_PC/Z输入函数:PC_data,送PC输出的数据/Z输出参数:无/Z功能说明:驱动PC实现输出功能,输出数据到PC/void wr_PC(unsigned char PC_dala) 写 PCACC=IO_flags;把状态标志字读到ACC便于进行位操作 (IO_flagsC=0;置PC状态标志位为低输出IO_flags=ACC;位操作完成,把ACC的内容写回状态标志字 PABC_config();调用配置子程序,完成对8255的设置 ACC=IO_flags;)while(IO_flagsC=l);判断状态标志位是否为髙, 为高,设置未完成,需从新设置 a8255_PC=PC_data;将PC_data的内容送到PC)(3) 端口C配置函数11- /Z函数名称:set_PC/Z输入函数:PC_num,范围7/Z输出参数:无/Z功能说明:对PC进行位操作,置PC (PC_num)为髙/void set_PC(unsigned char PC_num)(ACC=IO_flags;IO_flagsC=0;ACC=IO_flags;PC_num=PC_num 1;PC_num=(PC_num|OxO I);a8255_CON=PC_num;)/Z函数名称:clr_PC/Z输入函数:PC_mim,范围/Z输出参数:无/Z功能说明:对PC进行位操作,清PC (PC.num)为低 7/-void clr_PC(unsigned char PC_num) (ACC=IO_flags;IO_flagsC=l;ACC=IO_flags;PC_num=PC_num 1;PC_num=(PC_num&OxFE);a8255_CON=PC_num;(4) 写控制字函数/Z 函数名称:PABC.config/Z功能说明:写8255A的控制字寄存器小void PABC_config(void) (a8255_CON=cfg_tableIO_flags;I【实例26I用8155扩展I/O (1)相关函数声明及管脚定义/函数声明,#include/控制字地址/PA地址/PB地址/PC地址/Z定时器寄存器A/Z定时器寄存器B 存储器首地址#include#define a8155_PA XBYTE0x7E00#define a8155_PB XBYTE0x7E01#define a8155_PC XBYTE0x7E02#define a8155_CON XBYTE0x7E03#define Timer_A XBYTE0x7E04#define Timer.B XBYTEOx7EO5#define mem_head XBYTE0x7F00unsigned char bdata IO_flags;用于表示PA、PB、PC的当前输入输出状态内容不能被其他程序改写sbit IO_flagA=IO_flagsA0;PA的当前输入输出状态sbit IO_flagB=IO_flagsAl;/PB的当前输入输出状态sbit IO_flagC=IO_flagsA2;PC的当前输入输出状态sbit IO_flagCl=IO_flagsA3;PC的当前输入输出状态sbit Int_flagA=state_flagsA4;PA的当前输入输出状态sbit Int_fIagB=state_flagsA5;/PB的当前输入输出状态sbit Timer_flag 1 =state_flagsA6;sbit Timer_fIag2=state_flagsA7;/Timer的状态置位表示计数中unsigned char rd_mem(unsigned char mem_ad);读存储器void wr_mem( unsigned char mem_ad,unsigned char mem_data);写存储器char rd_PA(void);读PAchar rd_PB(void);读PBchar rd_PC(void);读PCvoid wr_PA(unsigned char PA_data);写PAvoid wr_PB(unsigned char PB_data);写PBvoid wr_PC(unsigned char PC_data);写PCvoid Dint_PA(void);关端口 A中断void Eint_PA(void);开端口 A中断void Dint_PB(void);关端口 B中断void Eint_PB(void);开端口 B中断void setting_PCOint(void);void setting_PC4int(void);void start_timer(void);开始计数器计数void stop_timer(void);停止计数器计数void setting_zero_stop(void);设定计数到零停止计数int rd_timer(void);读计数值void setting_timerout_mode(unsigned char mode);设定输出模式(2) 读写外RAM函数读写外RAM函数对外部存储器指定单元数据进行读写,程序代码如下:/Z函数名称:rd_mem/Z输入函数:mem_ad范围255/Z输出参数:mem_data,存储对应数据/Z功能说明:读外部RAM,输入相对地址,返回数据/unsigned char rd_mem(unsigned char mem_ad) 使存储器 (unsigned char mem_data;unsigned int AD_mem;AD_mem=&mem_head;AD_mem=AD_mem+mem_ad;mem_data=XBYTEAD_mem;return (mem_data);)/Z函数名称:wr_mem/Z输入函数:mem_ad, mem_data相对地址和数据/Z输出参数:无/Z功能说明:写数据到外部RAM,把数据写到相应的地址小void wr_mem(unsigned char mem_ad. unsigned char mem_data) 与存储器 (unsigned int AD_mem;AD_mem=&mem_head;AD_mem=AD_mem+mem_ad;XBYTEAD_mem=mem_data;)(3) 端口 PA、端口 PB以及端口 PC的读写设置函数端口 PA、端口 PB以及端口 PC的读写设置函数主要完成对8155端口的输入输出设置 及数据读写,程序代码如下:/Z函数名称:rd_PA/Z输入函数:无/Z输出参数:PA.data/Z功能说明:返回PA数据/char rd_PA(void)读 PA(unsigned char PA_dala;ACC=state_flags;把状态标志字读到ACC便于进行位操作 do IO_flagA=0;置PA状态标志位为低输入state_flags=ACC;a8155_CON=state_flags;重写控制字,完成对8155的设置 )while(IO_flagA=1);判断状态标志位是否为髙 控制字设置完成PA_data=a8155_PA;把PA的数据读到PA-data retum(PA_data);返回 PA_data )/-/Z读PB、PC的函数:rd_PB和rd_PC程序代码与rd_PA类似,不再赘述/Z函数名称:wr_PA/Z输入函数:PA_data/Z输出参数:无/功能说明:把PA_dala送到PA输出/-void wr_PA(unsigned char PA_data) 写 PA (ACC=state_flags;把状态标志字读到ACC便于进行位操作 IO_flagA=l;置PA状态标志位为髙输出 statc_flags=ACC;位操作完成,把ACC的内容写回状态标志字 a8155_CON=state_flags;写控制字,完成对8155的设置 )while(IO_flagA=0); 判断状态标志位是否为低 为低,设置未完成,需从新设置 a8155_PA=PA_data;将PA_data的内容送到PA)/写PB、PC的函数:wr_PB和wr_PC程序代码与wr_PA类似,不再赘述 /(4)端口 PA、端口 PB以及端口 PC的中断设置函数端口 PA、端口 PB以及端口 PC的中断设置函数完成各个端口的中断开启和关断,程序 代码如下:/Z函数名称:Eint_PA/Z输入函数:无/Z输出参数:无/Z功能说明:PA中断允许/void Eint_PA(void)开端口 A 中断(ACC=state_flags; 把状态标志字读到ACC便于进行位操作 Int_flagA=l;state_flags=ACC;位操作完成,把ACC的内容写回状态标志字 a8155_CON=state_flags;写控制字,完成对8155的设置)/Z函数名称:Dint.PA/Z输入函数:无/Z输出参数:无/Z功能说明:PA中断禁止/-void Dint_PA(void)关端口 A 中断1ACC=state_flags; 把状态标志字读到ACC便于进行位操作 Inl_flagA=O;state_flags=ACC;位操作完成,把ACC的内容写回状态标志字 a8155_CON=state_flags;写控制字,完成对8155的设置/开关PB中断的函数Eint_PB、Dint_PB和Eint_PA、Dint_PA程序代码类似,不再赘述/端口 PC上下半口配置函数:端口 PC上下半口配置函数可实现端口 PC上半口配置为PA状态输出和PC下半口配置 为PB状态输出。程序代码如下:/Z函数名称:PCO_PAint/Z输入函数:无/Z输出参数:无/功能说明:设置PC上半口为PA状态输出,PCO=INTRa, PCl=BFa, PC3=/STBb/void PCO_PAint(void)/PC 上半口为 PA 状态输出( /PC0=INTRa, PCl=BFa, PC3= ACC=state_flags;把状态标志字读到ACC便于进行位操作 Int_flagA=l;IO_flagCl = l; state_flags=ACC;位操作完成,把ACC的内容写回状态标志字 a8155_CON=state_flags;写控制字,完成对8155的设置 /Z函数名称:PC4_PBint/Z输入函数:无/Z输出参数:无/功能说明:设置PC下半为PB状态输出,PC4=INTRb, PC5=BFb, PC6=/void PC4_PBint(void)/PC 下半口为 PB 状态输出( /PC0=INTRa, PCl=BFa, PC3= ACC=state_flags;把状态标志字读到ACC便于进行位操作 Int_flagA=l;IO_flagCl=l;IO_flagC=l; state_flags=ACC;位操作完成,把ACC的内容写回状态标志字 a8155_CON=state_flags;写控制字,完成对8155的设置计数器设置函数:计数器设置函数完成计数器的起停和读写和输出模式设置,具体程序代码如下:/-/Z 函数名称:start_timer/Z输入函数:无/Z输出参数:无/Z功能说明:开始计数器计数/void start_timer(void)开始计数器计数(ACC=state_flags;把状态标志字读到ACC便于进行位操作Timer_flagl=l;Timer_flag2=l;state_flags=ACC;位操作完成,把ACC的内容写回状态标志字a8155_CON=state_flags;写控制字,完成对8155的设置/Z 函数名称:stop_timer/Z输入函数:无/Z输出参数:无/Z功能说明:停止计数器计数/void stop_timer(void)停止计数器计数ACC=state_flags;把状态标志字读到ACC便于进行位操作Timer_flagl = l;Timer_flag2=0;state_flags=ACC;位操作完成,把ACC的内容写回状态标志字a8!55_CON=state_flags;写控制字,完成对8155的设置)/Z 函数名称:size_zero_stop/Z输入函数:无/Z输出参数:无/Z功能说明:设定计数到零停止计数7/-void stop_timer(void)停止计数器计数ACC=state_flags;把状态标志字读到ACC便于进行位操作 Timer_flagl=l; Timer_flag2=0; state_flags=ACC; 位操作完成,把ACC的内容写回状态标志字 a8155_CON=state_flags; 写控制字,完成对8155的设置 ) /Z函数名称:rd_timer /Z输入函数:无 /Z输出参数:time /Z功能说明:读计数值 /int rd_timer(void)读计数值(int time; char timea; time=Timer_B; timea=Timer_A; time=time8; time=(time&timea)&0x3F); retum(time); ) /Z 函数名称:setting_timerout_mode /Z输入函数:mode范围3 /Z输出参数:无 /Z功能说明:设定输出模式 /void setting_timcrout_modc(unsigncd char mode)设定输出模式 (Timer_B=(mode&0x03); 写控制字 )【实例29I与AT24系列EEPROM接口及驱动程舜*=对 2402 的读写函数=*/#include #define DELAY-TIME 60/经实验,不要小于50!否则可能造成时序混乱/ #define FALSE 0 #define TRUE 1 sbit SCL=P1A2;/I2C 信号线定义sbit SDA=P1A1;/I2C 数据线定义/*=启动12c总线的函数,当SCL为高电平时使SDA产生一个负跳变=*/ void delayus(unsigned int t)(while(t!=O)t-;)void I2C_Start(void)(SDA=1;SCL=1;delayus(DELAY.TIME);SDA=O;delayus(DELAY_TIME);SCL=O;delayus(DELAY.TIME);)/*=终止12c总线,当SCL为高电平时使SDA产生一个正跳变=*/void I2C_Stop(void)(SDA=O;SCL=1;delayus(DELAY_TIME);SDA=1;delayus(DELAY_TIME);SCL=O;delayus(DELAY_TIME);)/*=发送,在SCL为高电平时使SDA信号为低=/ void SEND_0(void)SDA=0;SCL=1;delayus(DELAY_TIME);SCL=0;delayus(DELAY_TIME);)/*=发送!,在SCL为高电平时使SDA信号为高= void SEND_ 1 (void)(SDA=1;SCL=1;delayus(DELAY.TIME);SCL=0;delayus(DELAY_TIME);/*=发送完一个字节后检验设备的应答信号=*/ bit Cheek_Acknowledge(void)char FO;SDA=1;SCL=1;delayus(DELAY_TIME ;F0=SDA;delayus(DELAY_TIME/2);SCL=O;delayus(DELAY_TIME);if(FO=l)return FALSE;return TRUE;)/*=向 !2C 总线写个字节=*/ void WriteI2CByte(char b)(char i;for(i=0;i8;i+)if(bi)&Ox8O)SEND_1();elseSEND_0();)/*=从 !2C 总线读个字节=*/ char ReadI2CByte(void)Ichar b=0,i,F0;for(i=0;i8;i+)(SDA=1;/释放总线/SCL=1;/接受数据/delayus(lO);FO=SDA;delayus( 10);SCL=0;if(FO=l)b=b 1;b=b|0x01;else b=bl;)return b;/*=读写 24cO2 子函!&=/ /*=向 2402 写个字节=*/ void Write_One_Byte(char addnchar thedata)bit acktemp= 1;12C_Start();/* 总线开始/WriteI2CByte(0xa0);acktemp二Check_ Ackno wledge( );/发送完一个字节后检验设备的应答信号/Writcl2CByte(addr);/*向 address 首地址开始写数据/acktemp二Check_ Acknowledge。;/发送完一个字节后检验设备的应答信号/Writel2CByte(thedata);/*把 thedata 写进去/acktemp=Check_ Acknowledge。;/发送完一个字节后检验设备的应答信号/I2C_Stop();/* 总线停止*/) /*=向 2402 写个数组=*/ void Write_A_Page(char *buffer.char m,char addr) (bit acktemp= 1;int i;I2C_Start();WritcI2CByte(0xa0);acktemp=Check_ Acknowledge。;/发送完一个字节后检验设备的应答信号/WriteI2CByte(addr);/* address*/acktemp二Check. Acknowledge。;/发送完一个字节后检验设备的应答信号/ for(i=0;im;i+)(WriteI2CByte(bufferi);if(!Check_Acknowledge() I2C_Stop();) ) I2C_Stop(); )/*=从 2402 读个字节=*/ char Read_One_Byte(char addr) (bit acktemp=l;char mydata;I2C_Start();/*启动 I2C 总线WriteI2CByte(OxaO);/向 I2C 总线写个字节acktemp=Check_Acknowledge();/发送完一个字节后检验设备的应答信号/ WriteI2CByte(addr);/*向 12c 总线写个字节,addr 是地址/acklemp二Check_Acknow1edge();/发送完一个字节后检验设备的应答信号/ I2C_Start();WriteI2CByte(0xal);acktemp=Check_Acknowledge();/发送完一个字节后检验设备的应答信号/ mydata=ReadI2CByte();acktemp二Check_ Acknowledge。;/发送完一个字节后检验设备的应答信号/ return mydata;I2C_Stop();/*停止 I2C 总线/)/*= 2402 倭个数组=*/ void Read_N_Bytes(char .buffer,char n,char addr) bit acktemp= 1;int i=0;I2C_Start();/*启动 I2C 总线WriteI2CByte(0xa0);acktemp二Check_Acknow1edge();/发送完一个字节后检验设备的应答信号/WriteI2CByte(addr);/address*/acktemp=Check_ Acknowledge;/发送完一个字节后检验设备的应答信号/ I2C_Start();WriteI2
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!