文章导读:本程序为51单片机数控步进直流稳压电源程序,实现数控步进直流稳压电源的功能。
//SPI传送数据子程序
void SPILED(data) {
SSPBUF=data; // 启动发送 do { ;
}while(SSPIF==0); SSPIF=0; }
//显示子程序
void display() {
SPIINIT(); //spi方式显示初始化 RA5=0; //准备锁存
for(COUNTW=0;COUNTW<4;COUNTW++) { data=s[COUNTW];
if(COUNTW==1) data=table0[data];//第二位需要显示小数点 else data=table[data];
SPILED(data); //发送显示段码
}
for(COUNTW=0;COUNTW<4;COUNTW++){ data=0xFF;
SPILED(data); //连续发送4个DARK,使显示看起来好看一些 }
RA5=1; //最后给一个锁存信号,代表显示任务完成 }
//I2C总线输出数据子程序
void i2cout() {
i2cint(); //因为SPI输出和I2C输出不能同时工作,则需要 //不断在两种方式见切换
SEN=1; //产生I2C启动信号
for(i=0x02;--i;) continue; //给予一定的延时,保证启动 do {
RSEN=1; //产生I2C启动信号
}while(SSPIF==0); //如果没能启动,则反复启动,直到启动为止 SSPIF=0; //SSPIF标志清0
SSPBUF=0X58; //I2C总线发送地址字节 do { ;
}while(SSPIF==0); //等待地址发送完毕
SSPIF=0; //SSPIF标志清0
SSPBUF=0X01; //I2C总线发送命令字节 do { ;
}while(SSPIF==0); //等待命令发送完毕 SSPIF=0; //SSPIF标志清0
SSPBUF=TXDATA; //I2C总线发送数据字节 do { ;
}while(SSPIF==0); //等待数据发送完毕 SSPIF=0; //SSPIF标志清0 PEN=1; //产生停止条件
do { ;
}while(SSPIF==0); //等待停止条件产生 SSPIF=0; //SSPIF标志清0 }
//步进加子程序
void BJADD() {
R1++;
TXDATA=TXDATA+2; if(R1>9) { R1=0; R2++; if(R2>9) { R2=0; R3++;
} }
if((R3==1)&&(R2==2)&&(R1==1)){ R3=0; R2=0;
R1=0; //若R3,R2,R1超过120,则又从0计起 TXDATA=0;
}
sfz(); //把需要显示的数字装入显示缓冲数组 }
//步进减子程序
void BJSUB() {
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,则调用步进加子程序 else BJSUB(); //若步进加标志为0,则调用步进减子程序 display(); //调用一次显示子程序 }