目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解,在开发大型软件时更能体现高级语言的优势。
5.2程序框图:
6 仿真结果数据分析
开始初始化为串口方式零 键盘扫描 延时去抖 判断是否有键结束
6 仿真结果数据分析
本系统的设计电路相对简单,硬件制作基本完成,我用ISIS Profressional
软件已仿真出来,效果非常的好。已经在输出的精度和稳定性基本达到要求,输出的电压范围为2-- +15v,步进为1v,又预设两个定值电压+12v和+5v。实验结果为下表:
表3 仿真数据结果
理论值(V) 实际值(V) 理论值(V) 实际值(V) 2 2.01 9 9.00 3 3.01 10 9.99 4 4.00 11 11.00 5 5.00 12 12.00 6 6.00 13 13.00 7 7.00 14 14.00 8 8.00 15 14.8 由上表的电压实测值与显示值对比值,可见该电源相对误差小于1%,按下“+”、“—”键时,单步变化1V的精度也基本符合要求。
参考文献
[1]王港元.电工电子实践指导[M].江西科学技术出版社
[2]陈明荧. 8051 单片机课程设计实训教程[M].清华大学出版社. [3]郁慧娣.微机系统及其接口技术[M].南京东南大学出版社, 1999 年.
[4]谢嘉茥,宣月清,冯军 . 电子线路-非线性部分[M]. 高等教育出版社 , 200 0 年. [5]何立民.单片机高级教程[M].北京航空航天大学出版社, 2003 年.
附录一:电路图
X1C122pFCRYSTALC222pF19U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD3938373635343332212223242526272810111213141516171218XTAL29RST293031PSENALEEAU212345678910274LS041CSVCCWR1ILE(BY1/BY2)GNDWR2DI3XFERDI2DI4DI1DI5DI0DI6VREFDI7RFBIOUT2GNDIOUT1DAC08324RP1987654321RESPACK-812345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51U3:A120191817161514131211U4:A3128R14kRV1U4:B8U3:B3LM358542610k774LS044LM358D21N4001R2500C31000uF+88.8VoltsD11N4001R32203U5LM317LVIADJVO21 附录二:源程序 #include
#define uchar unsigned char #define uint unsigned int
uchar code ziku[20]= {
0xc0,0xf9,0xa4,0xb0,0x99, //0,1,2,3,4, 0x92,0x82,0xD8,0x80,0x90, //5,6,7,8,9, 0x88,0x83,0xc6,0xa1,0x86, //A,B,C,D,E 0x8e,0x7f,0xbf,0x89,0xff //F,.,-,H,NULL };
//0 1 2 3 4 5 6 7 8 9 .
uchar buff[2]; uchar voltage; uchar ans; uchar x,y;
sbit key16 = P1^0; sbit key8 = P1^1; sbit keyadd = P1^2; sbit keysub = P1^3;
sbit OUT0 = P2^0; sbit OUT1 = P2^1; sbit OUT2 = P2^2; sbit OUT3 = P2^3; sbit OUT4 = P2^4; sbit OUT5 = P2^5; sbit OUT6 = P2^6; sbit OUT7 = P2^7; sbit L1 = P3^6; sbit L2 = P3^7;
//---------------------------------------- //函数名称: delay
//功能描述:延时(N*8+6)μ
//---------------------------------------- void delay(uint N) { uint i; for(i=0;i /*函数名:getbuff 功能:将电压值转化为显示码存入buff*/ void getbuff(void) { x = voltage/10; y = voltage; buff[1] = ziku[x]; buff[0] = ziku[y]; } /*函数名:display 功能:显示buff*/ void display(void) { L1 = 0; P0=buff[0]; delay(200); L1 = 1; L2 = 0; P0=buff[1]; delay(200); L2 = 1; } /*函数名:key 功能:键盘扫描和设置*/ /*按下P1.0:输出16V 按下P1.1:输出8V */ /*按下P1.2:输出加1V 按下P1.3:输出减1V */ void key(void) { key16 = 1; key8 = 1; keyadd = 1; keysub = 1; if((P1&0x0f)!=0x0f) //有键按下 { delay(200); //延时去抖动 if ((ans=(P1&0x0f))!=0x0f) { do{;}while((P1&0x0f)!=0x0f); // 等待键放松 switch (ans) { case 0x0e: voltage=10;break; case 0x0d: voltage=5;break; case 0x0b: if(voltage<15) voltage++;break; case 0x07: if(voltage>2) voltage--;break; default: break; } } } } /*函数名:DAC 功能:直通方式DA转换*/ void DAC(void) { uchar temp; temp = voltage*16-20; OUT0 = temp%2; temp = temp/2; OUT1 = temp%2; temp = temp/2; OUT2 = temp%2; temp = temp/2; OUT3 = temp%2; temp = temp/2; OUT4 = temp%2; temp = temp/2; OUT5 = temp%2; temp = temp/2; OUT6 = temp%2; temp = temp/2; OUT7 = temp%2; } void main(void) { P0 = 0xff; P1 = 0xff; P2 = 0xff; P3 = 0xff; voltage=2; while(1) { key(); DAC(); getbuff(); display(); } }