1、100例程序设计范例汇总第一章.4【实例1】使用累加器进行简单加法运算:.4【实例2】使用B寄存器进行简单乘法运算:.4【实例3】通过设置RSI,RS0选择工作寄存器区1:.4【实例4】使用数据指针DPTR访问外部数据数据存储器:.4【实例5】使用程序计数器PC查表:.4【实例6】IF语句实例:.4实例7 SWITCH-CASE语句实例:.4【实例8】FOR语句实例:.4实例9 WHILE语句实例:.5【实例10 DO.WHILE语句实例:.5【实例11】语句形式调用实例:.5实例12 表达式形式调用实例:.5【实例13】以函数的参数形式调用实例:.5【实例14】函数的声明实例:.5【实例15
2、】函数递归调用的简单实例:.5【实例16】数组的实例:.6【实例17】指针的实例:.6【实例18】数组与指针实例:.6实例19 P1 口控制直流电动机实例.6第二章.8【实例20】用74LS165实现串口扩展并行输入口.8【实例21】用74LS164实现串口扩展并行输出口.10实例22 P0 I/O扩展并行输入口.12实例23 P0 I/O扩展并行输出口.12实例24 用8243扩展I/O端口.12实例25 用8255A扩展I/O 口.14实例26 用8155扩展I/O 口.19第三章.26实例29 与AT24系列EEPROM接口及驱动程序.26实例30 EEPROM(X5045)接口及驱动程
3、序.30【实例31】与铁电存储器接口及驱动程序.33实例32 与双口 RAM存储器接口及应用实例.35【实例33】与NANDFLASH(K9F5608)接口及驱动程序.35第四章.43实例34 独立键盘控制.43【实例35】矩阵式键盘控制.44【实例36】改进型I/O端口键盘.46【实例37】PS/2键盘的控制.49【实例38】LED显示.53【实例39】段数码管(HD7929 显示实例.54【实例40】16x2字符型液晶显示实例.55【实例411点阵型液晶显示实例.61【实例42】LCD显示图片实例.63第五章.70【实例43】简易电子琴的设计.70【实例44】基于MCS-51单片机的四路抢
4、答器.71【实例45】电子调光灯的制作.76【实例46】数码管时钟的制作.81实例47 LCD时钟的制作.96【实例48】数字化语音存储与回放.103【实例49】电子标签设计.112第六章.120实例50 指纹识别模块.121【实例51】数字温度传感器.121第七章.124实例53 超声波测距.124实例54 数字气压计.125实例55 基于单片机的电压表设计.132实例56 基于单片机的称重显示仪表设计.133【实例57】基于单片机的车轮测速系统.136第八章.138【实例58】电源切换控制.138实例59 步进电机控制.140实例60 单片机控制自动门系统.141【实例61】控制微型打印机
5、.144实例62 单片机控制的EPSON微型打印头.144【实例63】简易智能电动车.145实例64 洗衣机控制器.149第九章.152【实例65】串行A/D转换.152【实例66】并行A/D转换.153实例67 模拟比较器实现A/D转换.154【实例68】串行D/A转换.155【实例69】并行电压型D/A转换.156【实例70】并行电流型D/A转换.156【实例71】12c接口的A/D转换.157【实例72】12c接口的D/A转换.161第十章.164实例73 单片机间双机通信.164实例74 单片机间多机通信方法之一.166实例75 单片机间多机通信方法之二.171【实例76】PC与单片机
6、通信.176实例77 红外通信接口.178第 H-一章.180实例79 单片机实现PWM信号输出.180实例80 实现基于单片机的低频信号发生器.182【实例81 软件滤波方法.183实例82 FSK信号解码接收.186实例83 单片机浮点数运算实现.187实例84 神经网络在单片机中的实现.192【实例85】信号数据的FFT变换.194第十二章.198【实例86】I2C 总线接口的软件实现.198实例87 SPI总线接口的软件实现.200【实例88】1-WIRE总线接口的软件实现.205实例89 单片机外挂CAN总线接口.207实例90 单片机外挂USB总线接口.210【实例91】单片机实现
7、以太网接口.214实例92 单片机控制GPRS传输.221实例93 单片机实现TCP/IP协议.223第十三章.229实例94 读写U盘.229实例95 非接触IC卡读写.234【实例96】SD卡读写.238【实例97】高精度实时时钟芯片的应用.242第十四章.247实例98 智能手机充电器设计.247实例99 单片机控制门禁系统.248第一章【实例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
8、选择工作寄存器区1:CLRPSW.4;PSW.4-0SETBPSW.5;PSW.5-1【实例4 使用数据指针DPTR访问外部数据数据存储器:MOVDPTR,#datal6;DPTR-data 16MOVXA,DPTR;A-(DPTR)MOVX DPTR,A;(DPTR)-A【实例5】使用程序计数器PC查表:MOVA,#data;A-dataMOVCA,A+DPTR;PC-g+l,A-(A)+(PC)【实例6】if语句实例:void mainQ int a,b,c,min;printsn please input three number:);scanf(n%d%d%d n,&a,&b,&c);
9、if(ab&ac)printf(nmin=%dnn,a);else if(ba&bc)printf(nmin=%dnn,b);else if(ca&c0;a)printf(n%dn,a);)实例9 while语句实例:void main()int i=0;while(i=10)i+;【实例10】dowhile语句实例:void main()int i=0;do i+;while(i=10);)【实例11】语句形式调用实例:void main()int i=0;while(i=10)i+;.Sum();/*函数调用*/)实例12 表达式形式调用实例:void mainQ int a,b,i=0;
10、while(i=10)i+;.i=4*Sum(a,b);/*函数调用*/)【实例13】以函数的参数形式调用实例:void mainQ int a,b,c,i=0;while(i=10)i+;.i=max(c,Sum(a,b);/*函数调用*/实例14 函数的声明实例:void mainQ int max(int x,int y);/*函数的声明*/int a,b,c,i=0;while(i=10)i+;.i=max(c,Sum(a,b);/*函数调用*/【实例15】函数递归调用的简单实例:void fun()int a=l,result,i;fbr(i=0;i10;)i=a+I;result=
11、fun();/*函数调用*/return result;)【实例16】数组的实例:void mainQ charnum3 3=#,;/*定义多维数组*/int i=0,j=0;fdr(;i3;i+)for(;j3;j+)printf(c”,numiJD;printf(/n”);)【实例17】指针的实例:void mainQ int a=3,*p;p=&a;/*将变量a的地址赋值给指针变量p*/printf(d,%d”,a,*p);/*输出二者的数值进行对比*/【实例18】数组与指针实例:void mainQ int i=3,num3=l,2,3,*p;p=num;/*将数组num口的地址赋值给
12、指针变量p*/result=max(p,3);/*函数调用,计算数组的最大值*/)实例19 P1 口控制直流电动机实例sfrp 1=0 x90;sbitplO=plAO;sbitpll=p1A1;void main()(int i,m;int j=100;int k=20;/正快转for(i=0;i100;i+)(P10=l;for(j=0;j50;j+)(m=0;)Pl 0=0;for(j=0;j10;j+)m=0)正慢转fbr(i=0;i100;i+)(P10=l;for(j=0;j10;j+)(m=0)pl 0=0;for(j=0;j50;j+)(m=0/负快转fbr(i=0;i100;
13、i+)(pll=l;for fl=0;j50;j+)(m=0;)pn=o;for(j=0;j10;j+)(m=0;/负慢转for(i=0;i100;i+)(pll=l;for(j=0;j10;j+)(m=0;)pll=0for(j=0;j50;j+)m=0;)第二章实例20 用74LS165实现串口扩展并行输入口(1)函数声明管脚定义/-库函数声明,管脚定义-#includesbit LOAD=P1A7;用P1A7控制SH/管脚(2)串口初始化函数UART_init()/-/函数名称:UART_init()/功能说明:串口初始化,设定串口工作在方式0/-void UARTinit(void)(
14、SCON=OxlO;设串行口方式0,允许接收,启动接收过程ES=0;禁止串口中断)(3)数据接收函数PA()-/函数名称:PA()/输入参数:无/输出参数:返回由并口输入的数据/功能说明:接收八位串行数据/-unsigned char PA(void)unsigned 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
15、data;/返回并行输入的数据)(1)函数声明管脚定义/-库函数声明,管脚定义-#includesbit a7=ACCA7;sbit simuseri_CLK=P 1A6;用P1A6模拟串口时钟sbit simuseri DATA=P 1A5;用P1A5模拟串口数据sbit drive74165_LD=P 1A7;用P1A7控制SH/管脚(2)数据输入函数in_simuseri()/-/函数名称:in_simuseri()/输入参数:无/输出参数:data_buf/功能说明:8位同位移位寄存器,将simuseri_DATA串行输入的数据按从低位到/高位/保存到data buf/-unsigne
16、d char in simuseri(void)(unsigned char i;unsigned char data buf;i=8;do(ACC=ACC1;fbr(;simuseri_CLK=O;);a7=simuseriDATA;fbr(;simuseri_CLK=l;);)while(-i!=0);simuseri_CLK=O;data_buf=ACC;retum(databuf);)(3)数据输出函数PAs()/-/函数名称:PAs()/输入参数:无/输出参数:PAs_buf,返回并行输入74LS165的数据/功能说明:直接调用,即可读取并行输入74LS165的数据,不需要考虑74L
17、S165的/工作原理/-unsigned char PAs(void)(unsigned char PAs buf;drive74165_LD=0;drive74165_LD=1;PAs_buf=in_simuseri();retum(PAsbuf);)实例21 用74LS164实现串口扩展并行输出口单片机串口驱动74LS164的程序主要包括函数声明管脚定义部分、串口初始化函数以 及数据发送函数。(1)函数声明管脚定义/-库函数声明,管脚定义-#include sbit CLR=P1A7;用P1A7控制CLRJ2)串口初始化函数UART_init()/-/函数名称:UART_init()/功能
18、说明:串口初始化,设定串口工作在方式0/-void UARTinit(void)(SCON=0 x00;没串行口方式0,允许发送,启动发送过程ES=0;/禁止串口中断)(3)数据发送函数PA_out()/-/函数名称:PA_out()/输入参数:PA_data,需要从74LS164并行口输出的数据/输出参数:无/功能说明:发送八位串行数据至并口/-void PA_out(unsigned char PAdata)(CLR=0;/并口输出清零CLR=1;开始串行移位 UART_init();/74LS165工作在时钟控制下的串行移位状态 while(TI=O);循环等待TI=0;SBUF=PA_
19、data;)单片机I/O端口驱动74LS164主要包括函数声明管脚定义部分、数据输入函数以及数据 输出函数。(1)函数声明管脚定义/-库函数声明,管脚定义-/include sbit simuseri_CLK=P 1A6;用P1A6模拟串口时钟 sbit simuseri_DATA=P 1A5;用PU5模拟串口数据 sbit drive74164_CLR=PlA7;用P1A7控制CLR sbit aO=ACCAO;(2)数据输入函数out_simuseri()/-/函数名称:out simuseri/输入参数:data buf/输出参数:无/功能说明:8位同步移位寄存器,将data_buf的数
20、据逐位输出到simuseri_DATA _一一_-void out_simuseri(char databuf)(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)数据输出函数PA_out()/-/函数名称:PA out/输入参数:Pseri_out,需要输出的8位数据/输出参数:无/功能说明:将Pseri_out中的数据送到74165并行口 A-G输出/-void PA out(char Pseri out)(dr
21、ive74164_CLR=0;/井口输出清零drive74164 CLR=1;/开始串行移位outsimuseri(Pseriout);)【实例22】P0 I/O扩展并行输入口I/O 口对应的地址为:1111 1110 1111 1111 B=FEFFHCPU操作指令为:/define 244_addr xbyte0XFEFFunsigned char I/O DATA;I/O_DATA=244_addr;【实例23】P0 I/O扩展并行输出口I/O端口对应的地址为:1111 1101 1111 1111 B=FDFFHCPU操作指令为:#define 273_addr xbyte0XFDFF
22、unsigned char I/O DATA;244_addr=I/O_DATA;【实例24】用8243扩展I/O端口#includesbit ContrBit0=PlA0;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 databuf;PROG=1;置PROG为高电平II-开始写控制字if(sele_P&0 x01)=
23、0)将控制字最低位送到8243的p2.0ContrBit0=0;elseContrBitO=l;if(sele_P&0 x02)=0)将控制字第二位送到8243的p2.1ContrBitl=0;elseContrBitl=l;/以上两位共同指定端口地址/-一写端口工作模式控制字-if(sele_M&0 x01)=0)将端口工作模式控制字低位送到8243的p2.2ContrBit2=0;elseContrBit2=l;if(sele_M&0 x01)=0)/将端口工作模式控制字高位送到8243的p2.3ContrBit3=0;elseContrBit3=l;/完成写控制字PROG=0;在PROG
24、上产生下降沿switch(sele_M&0 x03)(/判断工作模式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=BH为逻辑与,直接送数据PROG=1;/产生上升沿if(sele_M&0 x03)=0)/sele_M=B00 为输入,接收数据in_data=(data_buf&0 x0F);r
25、etum(indata);/sele M=B00,返回接收到的数据/sele_M!=B00,返回 0void main(void)(char receive data;receive_data=driver8243(l,0,5);)实例25用8255A扩展I/O 口/-/函数名称:rd_PA/输入函数:无/输出参数:PA_data,PA输入的数据/功能说明:驱动PA实现输入功能,读入PA的并行数据,/-.-unsigned char rd PA(void)读 PA(1)管脚定义及函数声明/-函数声明,管脚定义-#include#include/define a8255_PA XBYTE0 x7
26、F7C/PA 地址#define a8255_PB XBYTE0 x7F7D/PB 地址/define a8255_PC XBYTE0 x7F7E/PC 地址/define a8255_CON XBYTE0 x7F7F 控制字地址unsigned char bdata lO flags;用于表示PA、PB、PC的当前输入输出状态/内容不能被其他程序改写sbit IO _flagsA=IO_flagsA0;/PA的当前输入输出状态sbit IO _flagsB=IO_flagsA 1;/PB的当前输入输出状态sbit IO _flagsC=I0_flagsA2;/PC的当前输入输出状态unsig
27、ned char const cfg_table8-(0 x80,/10000000b,c=outb=outa=out0 x90,/10010000b,c=outb=outa=in0 x82,/10000010b,c=outb=ina=out0 x92,/10010010b,c=outb=ina=in0 x89,/10001001b,c=inb=outa=out0 x99,/10011001b,c=inb=outa=in0 x8B,/10001011b,c=inb=ina=out0 x9B,)unsigned char rd PA(void);/10011011b,c=inb=ina=in读P
28、Aunsigned char rd PB(void);读PBunsigned char rd PC(void);读PCvoid wr_PA(unsigned char PA data);写PAvoid wr_PB(unsigned char PBdata);写PBvoid wr_PC(unsigned char PCdata);写PCvoid set_PC(unsigned char PC num);/PC位操作,置位,PC_num为端口号07 void clr_PC(unsigned char PCnum);/PC位操作,复位,PC_mim为端口号07 void PAB C_config(v
29、oid);写8255A控制字(2)端口 A、B、(:读写函数(unsigned char PA data;ACC=IO_flags;/把状态标志字读到ACC便于进行位操作 do(IO_flagsA=l;置PA状态标志位为高-输入IO_flags=ACC;PABCconfigQ;/调用配置子程序,完成对8255的设置 ACC=IO flags;)while(IO flagsA=0);判断状态标志位是否为高控制字设置完成PA_data=a8255_PA;把PA的数据读到PA_data retum(PAdata);返回 PA_data)/-一一-/函数名称:rd_PB/输入函数:无/输出参数:PB_
30、data,PB输入的数据/功能说明:驱动PB实现输入功能,读入PB的并行数据/-一一-unsigned char rd PB(void)读 PB(unsigned char PB data;ACC=IO_flags;/把状态标志字读到ACC便于进行位操作 do(IO_flagsB=l;置PB状态标志位为高-输入IO_flags=ACC;PABC_config();/调用配置子程序,完成对8255的设置)while(IO flagsB=0);判断状态标志位是否为高控制字设置完成PB_data=a8255 PB;把PB的数据读到PB dataretum(PBdata);/返回 PB data)/-
31、/函数名称:rd_PC/输入函数:无/输出参数:PC_data,PC输入的数据/功能说明:驱动PC实现输入功能,读入PC的并行数据/-一一-unsigned char rd PC(void)读 PC(unsigned char PC data;ACC=IO_flags;/把状态标志字读到ACC便于进行位操作 do(10 flagsC=l;置PC状态标志位为高-输入IO_flags=ACC;PABCconfigQ;/调用配置子程序,完成对8255的设置/ACC=IO_flags;)while(IO_flagsC=0);判断状态标志位是否为高控制字设置完成PC_data=a8255_PC;把PC的
32、数据读到PC_data retum(PCdata);/返回 PC_data)-/函数名称:wr_PA/输入函数:PA_data,送PA输出的数据/输出参数:无/功能说明:驱动PA实现输出功能,输出数据到PA/-void wr_PA(unsigned char PA data)写 PA(ACC=IO_flags;把状态标志字读到ACC便于进行位操作(IO _flagsA=0;置PA状态标志位为低-输出 IO_flags=ACC;/位操作完成,把ACC的内容写回状态标志字 PABCconfigQ;/调用配置子程序,完成对8255的设置 ACC=IO_flags;)while(I0 _flagsA=
33、1);/判断状态标志位是否为高,/为高,设置未完成,需从新设置a825 5_PA=PA_data;将PA data的内容送到PA)/-一一-/函数名称:wr_PB/输入函数:PB_data,送PB输出的数据/输出参数:无/功能说明:驱动PB实现输出功能,输出数据到PA/-void wr_PB(unsigned char PB data)写 PB(ACC=IO flags;把状态标志字读到ACC便于进行位操作IO_flagsB=0;置PB状态标志位为低-输出IO_flags=ACC;/位操作完成,把ACC的内容写回状态标志字 PABCconfigQ;调用配置子程序,完成对8255的设置ACC=I
34、O flags;)while(IO_flagsB=1);判断状态标志位是否为高,为高,设置未完成,需从新设置a8255_PB=PB_data;将PB data的内容送到PB)/-/函数名称:wr_PC/输入函数:PC_data,送PC输出的数据/输出参数:无/功能说明:驱动PC实现输出功能,输出数据到PC/-void wr_PC(unsigned char PC data)写 PC(ACC=IO_flags;/把状态标志字读到ACC便于进行位操作(IO flagsC=0;置PC状态标志位为低-输出IO_flags=ACC;/位操作完成,把ACC的内容写回状态标志字 PABCconfigO;/调
35、用配置子程序,完成对8255的设置 ACC=IO flags;)while(I0 _flagsC=1);判断状态标志位是否为高,/为高,设置未完成,需从新设置a8255_PC=PC_data;将PC_data的内容送到PC)(3)端口 C配置函数/-/函数名称:set_PC/输入函数:PC_num,范围07/输出参数:无/功能说明:对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|0 x01
36、);a8255_CON=PC_num;)/-/函数名称:clr PC./输入函数:PC_num,范围07/输出参数:无/功能说明:对PC进行位操作,清PC(PC_num)为低/-void clr_PC(unsigned char PCnum)(ACC=IO_flags;IO _flagsC=l;ACC=IO_flags;PC_num=PC_num 1;PC_num=(PC_num&OxFE);a8255 coN=PC_num;)(4)写控制字函数,/-.-/函数名称:PAB C config/功能说明:写8255A的控制字寄存器/-void PAB C_config(void)(a8255_C
37、ON=cfg_tableIO_flags;)【实例26】用8155扩展I/O 口(1)相关函数声明及管脚定义/-函数声明,#include#include#define a8155_PA XBYTE0 x7E00/define a8155_PB XBYTE0 x7E01#define a8155_PC XBYTE0 x7E02管脚定义-*/控制字地址/PA地址/PB地址/define a8155_CON XBYTE0 x7E03/define TimerA XBYTE0 x7E04#define TimerB XBYTE0 x7E05#define mem head XBYTE0 x7F00
38、unsigned char bdata lO flags;/PC地址/定时器寄存器A/定时器寄存器B/存储器首地址用于表示PA、PB、PC的当前输入输出状态/内容不能被其他程序改写sbit IO_flagA=IO flagsA0;/PA的当前输入输出状态 sbit 10 _flagB=IO_flagsAl;/PB的当前输入输出状态 sbit IO_flagC=IO flagsA2;/PC的当前输入输出状态 sbit 10 flagC 1=10 flagsA3;/PC的当前输入输出状态 sbit Int_flagA=state_flags A4;/PA的当前输入输出状态sbit Int_flag
39、B=state _flagsA5;/PB的当前输入输出状态sbit Timer flag l=state_flagsA6;sbit Timer_flag2=state_flags A7;/Timer的状态置位表示计数中unsigned char rd_mem(unsigned char mem ad);读存储器void wr_mem(unsigned char mem ad,unsigned char mem data);写存储器char rdPA(void);读PAchar rdPB(void);读PBchar rdPC(void);读PCvoid wr_PA(unsigned char P
40、Adata);写PAvoid wr_PB(unsigned char PBdata);写PBvoid wr_PC(unsigned char PCdata);写PCvoid DintPA(void);/关端口 A中断void EintPA(void);/开端口 A中断void DintPB(void);关端口 B中断void EintPB(void);/开端口 B中断void setting PCOint(void);void setting_PC4int(void);void start timer(void);开始计数器计数void stop timer(void);停止计数器计数void
41、 setting zero stop(void);设定计数到零停止计数int rdtimer(void);读计数值void setting_timerout_mode(unsigned char mode);/设定输出模式(2)读写外RAM函数读写外RAM函数对外部存储器指定单元数据进行读写,程序代码如下:/-/函数名称:rd mem/输入函数:mem ad,范围0-255/输出参数:mem_data,存储对应数据/功能说明:读外部RAM,输入相对地址,返回数据/-unsigned char rd_mem(unsigned char mem ad)读存储器(unsigned char mem
42、data;unsigned int ADmem;AD_mem=&mem_head;AD_mem=AD_mem+mem_ad;mem_data=XB YTE ADmem;retum(memdata);)/-II函数名称:wr mem/输入函数:mem ad,mem data相对地址和数据/输出参数:无/功能说明:写数据到外部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;XBY
43、TEAD_mem=mem_data;)(3)端口 PA、端口 PB以及端口 PC的读写设置函数端口 PA、端口 PB以及端口 PC的读写设置函数主要完成对8155端口的输入输出设置 及数据读写,程序代码如下:一一一-/函数名称:rd_PA/输入函数:无/输出参数:PA_data/功能说明:返回PA数据/-.-char rd PA(void)读 PA(unsigned char PA data;ACC=state flags;/把状态标志字读到ACC便于进行位操作 do(IO _flagA=0;置PA状态标志位为低-输入 state_flags=ACC;a815 5_CON=state_flag
44、s;重写控制字,完成对8155的设置)while(IO_flagA=l);判断状态标志位是否为高 控制字设置完成 PA_data=a815 5PA;把PA的数据读到PA data retum(PAdata);返回 PA_data)/-/读PB、PC的函数:rd_PB和rd_PC程序代码与rd_PA类似,不再赘述/-/函数名称:wr_PA/输入函数:PA_data/输出参数:无/功能说明:把PA_data送到PA输出/-void wr_PA(unsigned char PA data)写 PA(ACC=state_flags;把状态标志字读到ACC便于进行位操作IO_flagA=l;置PA状态标
45、志位为高-输出 state_flags=ACC;/位操作完成,把ACC的内容写回状态标志字a8155_C0N=state flags;/写控制字,完成对8155的设置)while(IO_flagA=0);判断状态标志位是否为低/为低,设置未完成,需从新设置a815 5_PA=PA_data;将PA data的内容送到PA)/-.-/写PB、PC的函数:wr_PB和wr_PC程序代码与wr_PA类似,不再赘述/-一-_(4)端口 PA、端口 PB以及端口 PC的中断设置函数端口 PA、端口 PB以及端口 PC的中断设置函数完成各个端口的中断开启和关断,程序 代码如下:/函数名称:Eint_PA/
46、输入函数:无/输出参数:无/功能说明:PA中断允许/-一一-_一一-_void Eint PA(void)开端 口 A 中断(ACC=state flags;/把状态标志字读到ACC便于进行位操作Int_flagA=l;state_flags=ACC;/位操作完成,把ACC的内容写回状态标志字a8155_CON=state flags;/写控制字,完成对8155的设置)/-/函数名称:Dint_PA/输入函数:无/输出参数:无/功能说明:PA中断禁止.void Dint PA(void)关端 口 A 中断(ACC=state_flags;把状态标志字读到ACC便于进行位操作Int_flagA=
47、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状态输出。程序代码如下:/-/函数名称:PCO_PAint/输入函数:无/输出参数:无/功能说明:设置PC上半口为PA状态输出,PCO=INTRa,PCl=BFa,PC3=/STBb/-void PCO
48、_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的设置)/-/函数名称:PC4_PBint/输入函数:无/输出参数:无/功能说明:设置PC下半口为PB状态输出,PC4=INTRb,PC5=BFb,PC6=/-void PC4_PBint(void)/PC 下半口为 PB 状态输出
49、(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的设置)计数器设置函数:计数器设置函数完成计数器的起停和读写和输出模式设置,具体程序代码如下:一一一.-/函数名称:start timer/输入函数:无/输出参数:无/功能说明:开始计数器计数/-void start_timer(void)开始计数器计数(ACC=s
50、tate flags;/把状态标志字读到ACC便于进行位操作Timer_flagl=l;Timer_flag2=l;state_flags=ACC;位操作完成,把ACC的内容写回状态标志字 a8155_CON=state flags;/写控制字,完成对8155的设置)/-/函数名称:stop timer/输入函数:无/输出参数:无/功能说明:停止计数器计数,/-.-void stop timer(void)停止计数器计数(ACC=state_flags;/把状态标志字读到ACC便于进行位操作Timer_flagl=l;Timer_flag2=0;state_flags=ACC;/位操作完成,把