您好,欢迎访问三七文档
#include//此程序实现数控步进直流稳压电源的功能,调试时为了避免资源冲突,应使实验板上的拔码开关S8拔向高电平//本程序设定S9键为增加键,当按住S9键不松开时,输出Vout以0.1V连续步进,//直至键S9松开,当以一定的时间间隔点动S9键时,输出Vout也为点动步进//递减键S11的功能与S9基本相同时,输出电压的值显示在3个LED上unsignedcharR1,R2,R3,TXDATA,LEDF,BJF,COUNTW,data;unsignedinti;constchartable[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0xFF};//不带小数点的显示段码表constchartable0[11]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0xFF};//带小数点的的显示段码表unsignedchars[4];//定义一个显示缓冲数组//把需要显示的数字装入显示缓冲数组voidsfz(){s[0]=R3;s[1]=R2;s[2]=R1;s[3]=0x0A;//最后一个LED显示DARK}//系统各寄存器初始化子程序voidinitial(){R1=0X00;R2=0X00;R3=0X00;sfz();//把需要显示的数字装入显示缓冲数组TXDATA=0X00;LEDF=0X01;BJF=0X01;TRISB1=0;TRISB2=0;TRISB4=1;TRISB5=1;//设置与键盘相关的各口的输入输出方式RB1=0;RB2=0;//设置扫描初始条件}//spi方式显示初始化子程序voidSPIINIT(){PIR1=0;SSPCON=0x30;SSPSTAT=0xC0;//设置SPI的控制方式,允许SSP方式,并且时钟下降沿发送,与74HC595,当其//SCLK从低到高跳变时,串行输入寄存器的特点相对应TRISC=0xD7;//SDO引脚为输出,SCK引脚为输出TRISA5=0;//RA5引脚设置为输出,以输出显示锁存信号}//I2C初始化子程序voidi2cint(){SSPCON=0X08;//初始化SSPCON寄存器TRISC3=1;//设置SCL为输入口TRISC4=1;//设置SDA为输入口TRISA4=0;SSPSTAT=0X80;//初始化SSPSTAT寄存器SSPADD=0X02;//设定I2C时钟频率SSPCON2=0X00;//初始化SSPCON2寄存器di();//关闭总中断SSPIF=0;//清SSP中断标志RA4=0;//关掉74HC165的移位时钟使能,以免74HC165//移位数据输出与I2C总线的数据线发生冲突SSPEN=1;//SSP模块使能}//软件延时子程序voidDELAY(){for(i=3553;--i;)continue;}//键服务子程序voidkeyserve(){PORTB=0XFD;if(RB5==0)BJF=0X01;//S9键按下,步进加标志置1PORTB=0XFB;if(RB5==0)BJF=0X00;//S11键按下,步进加标志清0RB1=0;//恢复PORTB的值RB2=0;}//键扫描子程序voidKEYSCAN(){while(1){while(1){if(RB5==0)break;}DELAY();//若有键按下,则软件延时if(RB5==0)break;//若还有键按下,则终止循环扫描,返回}}//SPI传送数据子程序voidSPILED(data){SSPBUF=data;//启动发送do{;}while(SSPIF==0);SSPIF=0;}//显示子程序voiddisplay(){SPIINIT();//spi方式显示初始化RA5=0;//准备锁存for(COUNTW=0;COUNTW4;COUNTW++){data=s[COUNTW];if(COUNTW==1)data=table0[data];//第二位需要显示小数点elsedata=table[data];SPILED(data);//发送显示段码}for(COUNTW=0;COUNTW4;COUNTW++){data=0xFF;SPILED(data);//连续发送4个DARK,使显示看起来好看一些}RA5=1;//最后给一个锁存信号,代表显示任务完成}//I2C总线输出数据子程序voidi2cout(){i2cint();//因为SPI输出和I2C输出不能同时工作,则需要//不断在两种方式见切换SEN=1;//产生I2C启动信号for(i=0x02;--i;)continue;//给予一定的延时,保证启动do{RSEN=1;//产生I2C启动信号}while(SSPIF==0);//如果没能启动,则反复启动,直到启动为止SSPIF=0;//SSPIF标志清0SSPBUF=0X58;//I2C总线发送地址字节do{;}while(SSPIF==0);//等待地址发送完毕SSPIF=0;//SSPIF标志清0SSPBUF=0X01;//I2C总线发送命令字节do{;}while(SSPIF==0);//等待命令发送完毕SSPIF=0;//SSPIF标志清0SSPBUF=TXDATA;//I2C总线发送数据字节do{;}while(SSPIF==0);//等待数据发送完毕SSPIF=0;//SSPIF标志清0PEN=1;//产生停止条件do{;}while(SSPIF==0);//等待停止条件产生SSPIF=0;//SSPIF标志清0}//步进加子程序voidBJADD(){R1++;TXDATA=TXDATA+2;if(R19){R1=0;R2++;if(R29){R2=0;R3++;}}if((R3==1)&&(R2==2)&&(R1==1)){R3=0;R2=0;R1=0;//若R3,R2,R1超过120,则又从0计起TXDATA=0;}sfz();//把需要显示的数字装入显示缓冲数组}//步进减子程序voidBJSUB(){R1--;TXDATA=TXDATA-2;if(R1==0XFF){R1=9;R2--;if(R2==0XFF){R2=9;R3--;if(R3==0XFF){R3=1;R2=2;R1=0;//若R3,R2,R1小于0,则又从120计起TXDATA=0XF0;}}}sfz();//把需要显示的数字装入显示缓冲数组}//主程序main(){initial();//系统各寄存器初始化display();//调用一次显示子程序while(1){i2cout();//调用I2C子程序,启动D/A转换KEYSCAN();//键盘扫描keyserve();//若确实有键按下,则调用键服务程序if(BJF==0X01)BJADD();//若步进加标志为1,则调用步进加子程序elseBJSUB();//若步进加标志为0,则调用步进减子程序display();//调用一次显示子程序
本文标题:12直流稳压电源
链接地址:https://www.777doc.com/doc-4308554 .html