参考文献
1) 公茂法,单片机人机接口实例集[M],北京航空航天大学出版社,1998. 2)何希才,稳压电源电路的设计与应用[M],中国电力出版社,2006.
3)陈伟杰,张虹,基于混合最优算法的高精度数控直流电源设计[J],中国集成电路,2008,8(06):48-52
4)吴恒玉,唐民丽,何玲等,基于89S51单片机的数控直流稳压源的设计[J],制造业自动化,2010,32(01):95-96 附录一 系统源程序
//函数声明
void shuchu(unsigned char B);//显示输出和电压调节 void xd_delay();
void max7219_reset();//复位
void max7219_init();//初始化控制寄存器
void max7219_echo(unsigned char bw,sw,gw,dw);//数据寄存器
void max7219_send_data(unsigned char addr,da);//完成一次寄存器的写操作
27
//地址定义
#define adr_bit_1 0x01//显示数据1的寄存器地址 #define adr_bit_2 0x02//显示数据2的寄存器地址 #define adr_bit_3 0x03//显示数据3的寄存器地址 #define adr_bit_4 0x04//显示数据4的寄存器地址 #define adr_bitrans_mode 0x09//译码方式寄存器的地址 #define adr_light_con 0x0a//亮度寄存器 #define adr_scan_count 0x0b//扫描界线寄存器 #define adr_close 0x0c//掉电控制寄存器 #define adr_glint_con 0x0d//闪烁控制寄存器 #define adr_show_test 0x0f//显示测试寄存器 //管脚定义 sbit jia=P1^0; sbit jian=P1^1;
sbit max7219_pin_LOAD=P2^0; sbit max7219_pin_CLK=P2^1; sbit max7219_pin_DIN=P2^2; sbit max7219_pin_RST=P2^3; #include
void chaoshi_2s();//超时2s判断子程序
void main() {
uchar timer=0;
uchar bw=0,sw=0,gw=5,dw=0; uchar B; //初始化 B=50; P0=B;
max7219_reset();//复位
max7219_init();//初始化控制寄存器
max7219_echo(uchar bw,sw,gw,dw);//数据寄存器显示
max7219_send_data(uchar addr,da);//完成一次寄存器的写操作? { } else {
if(jia==0)//判断按下是否+键 {
if (P0==0xff)//输出已为最大值 {
goto chaxun;
chaoshi_2s();//返回一个timer判断 if(timer==32) //是否超过按键超过2s {
shuchujia_0.1v(uchar B); if (P0==0xff)//输出已为最大值 {
if(jia==0)//判断按下是否+键 {
//xd_delay(); goto chang_jia; goto chaxun; else //未达最大值
else //未达最大值
xd_delay(); goto chaxun;
//uchar a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void max7219_delay(void);
chaxun:if(P1==0xff)//判断是否有键按下
chang_jia:v++;
28
}
if(jian==0) //按下-键 {
if (P0==0)//输出已为最小值 {
chaoshi_2s();//返回一个判断值timer if(timer=32) //是否超过按键超过2s { } else { }
v--;
shuchujian_0.1v(uchar B); goto chaxun;
shuchujian_0.1v(uchar B); if (P0==0)//输出已为最小值 { }
if(jian==0)//判断按下是-键 { } else
goto chaxun;
//xd_delay(); goto chang_jian; goto chaxun; else //未达最小值 goto chaxun; else //已达最小值 }
} else { }
v++;
shuchujia_0.1v(uchar B); goto chaxun;
}
} else
goto chaxun;
chang_jian:v--;
29
}
void shuchu(uchar B)//修改显示数值及电压输出 { }
void chaoshi_2s()//查询超时2s子程序 { }
//延时消抖 void xd_delay() { }
//完成max7219的复位 void max7219_reset() {
uchar i; uchar i;
for(i=0;i<2000;i++); TMOD=0x01; TH0=0xff; TL0=0xff; TR0=1;
while(jia==0||jian==0) { }
while(!TF0);//定时一次未到空等待 timer++;
TH0=0xff;//重新装入数值 TL0=0xff; if(timer==32)
break;
//输出电压改变 P0=B; //显示改变 bw=B/1000; sw=B00/100;
gw=B000/10+0x80; dw=B;
/*bw=a[bw];sw=a[sw];gw=a[gw]+0x80;dw=a[dw];*/
max7219_echo(unsigned char bw,sw,gw,dw);//数据寄存器显示 max7219_send_data(unsigned char addr,da);//完成一次寄存器的写操作 }
}
}
30
}
//通过写控制寄存器,完成max7219的初始化 void max7219_init() { }
//入口参数bw,sw,gw,dw //送8位显示数据到显示寄存器
void max7219_echo(unsigned char bw,sw,gw,dw) { }
//入口地址:addr寄存器地址,da寄存器设置值 //把设置值写入对应的寄存器中
void max7219_send_data(unsegned char addr,da) {
uchar i,byte_out; byte_out=adr; mwx7219_pin_DIN=1; mwx7219_pin_CLK=1; mwx7219_pin_LOAD=0; for(i=1;i<8;i++) {
mwx7219_pin_CLK=1;
mwx7219_pin_DIN=(bit)(byte_out&0x80); byte_out=byte_out<<1; mwx7219_pin_CLK=0; max7219_send_data(addr_bit_1,bw); max7219_send_data(addr_bit_2,sw); max7219_send_data(addr_bit_3,gw); max7219_send_data(addr_bit_4,dw); max7219_reset();
max7219_send_data(addr_scan_count,0x04); max7219_send_data(addr_light_con,0x08); max7219_send_data(addr_trans_mode,0xff); max7219_send_data(addr_close,0x01); max7219_pin_RST=0; for(i=0;i<125;i++)
max7219_delay(); max7219_pin_RST=1; for(i=0;i<255;i++)
max7219_delay(); max7219_pin_RST=0; for(i=0;i<125;i++)
max7219_delay();
31