proteus仿真基于單片機的數控穩壓電源
0.png (72.92 KB, 下載次數: 123)
下載附件
2016-9-9 20:47 上傳
全部資料下載:
proteus數控穩壓電源.zip
(489.83 KB, 下載次數: 485)
2016-9-9 20:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
下面是部分內容預覽:
數控穩壓電源設計報告 班級:電信10-1班 學號:3100718116 姓名:羅鋒 此次數控穩壓電源設計我主要通過51單片機控制輸出來控制電源的電壓和顯示。主流程圖如下。
1.001.jpg (20.37 KB, 下載次數: 93)
下載附件
2016-9-9 20:50 上傳
主要輸出部分
1.002.jpg (24.03 KB, 下載次數: 81)
下載附件
2016-9-9 20:50 上傳
1.003.jpg (45.5 KB, 下載次數: 109)
下載附件
2016-9-9 20:50 上傳
加減置數部分,通過對4X4矩陣鍵盤的設置,可任意置數,加減, 自動步進,輸出波形。
1.004.jpg (32.87 KB, 下載次數: 69)
下載附件
2016-9-9 20:50 上傳
1.005.jpg (34.77 KB, 下載次數: 94)
下載附件
2016-9-9 20:50 上傳
預置數部分 通過撥碼開關來預置。
1.006.jpg (50.62 KB, 下載次數: 83)
下載附件
2016-9-9 20:50 上傳
顯示部分 通過單片機對兩位數碼管進行動態掃描
1.007.jpg (56.33 KB, 下載次數: 100)
下載附件
2016-9-9 20:50 上傳
1.008.jpg (71 KB, 下載次數: 88)
下載附件
2016-9-9 20:50 上傳
1.009.jpg (36.91 KB, 下載次數: 101)
下載附件
2016-9-9 20:50 上傳
1.010.jpg (47.01 KB, 下載次數: 86)
下載附件
2016-9-9 20:50 上傳
1.011.jpg (43.76 KB, 下載次數: 112)
下載附件
2016-9-9 20:50 上傳
1.012.jpg (61.52 KB, 下載次數: 100)
下載附件
2016-9-9 20:50 上傳
數控0~9.9V輸出,11鍵為確定!1~10好鍵為1~0的數字
十二為三角波 13,14為加減,15自動步進
源程序:
- #include
- #include
- #define uchar unsigned char
- #define uint unsigned int
- uchar aa,bb,cc,dd,jj,ii,jjj,iii,key,j;
- uchar time1=0;
- sbit led1=P2^0;
- sbit led2=P2^1;
- sbit ce=P2^4;
- #define timer0_count 0xfc18//定時器初值,設置time0 1/1000秒中斷一次
- const seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管的顯示
- const seg_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小數點的數碼管顯示
- uchar scan1;//用來分別顯示2個數碼管
- uchar scan2;
- uchar counter[2]={0xf1,0xf2};
- uchar vout=0; //j_片選,vout_電壓輸出
- static void timer0_initialize(void)//timer0的初始化
- //定時器的初始化程序
- {
- EA=0; //中斷控制器IE--停止接受中斷
- TR0=0; //停止計時
- TMOD=0x01; //設置工作方式為1
- TL0=(timer0_count & 0x00ff);
- TH0=(timer0_count>>8); //設置time0 初值
- PT0=1; //設置timer0高優先級
- ET0=1; //允許timer0中斷
- TR0=1; //開始計時
- EA=1; //開所有中斷
- }
- void delay(uint t) //tms的延時
- {
- uchar i;
- uint j;
- for(j=0;j<t;j++)
- for(i=0;i<40;i++);
- }
- void shuc(void)
- {
- uchar nn;
- vout=2*(scan2*10+scan1);//輸出的數字量
- P1=vout;
- for(nn=0;nn<250;nn++)
- ;
- nn=0;//輸出是存在D/A轉換時間差所以要延時
- }
- void shaom(void)
- {
- P3=0x0f;//掃描是否有按鍵按下
- if((P3&0x0f)!=0x0f)
- dd=0;
- else
- dd=1;
- }
- void zdbj(void) //自動步進
- {
- uchar rr;
- jj=scan2;
- ii=scan1;
- shaom();
- for(;jj<10;jj++)
- {
- for(;ii<10;ii++)
- {
- if(dd)
- {
- scan1=ii;
- scan2=jj;
- shuc();
- for(rr=0;rr<250;rr++)
- {
- shaom();
- if(dd)
- delay(70);
- else
- break;
- }
- if(jj==9&&ii==9)
- {
- ii=0;
- jj=0;
- }
-
- }
- else
- {
- jj=10;
- ii=10;
- }
- }
- ii=0;
- }
- jj=0;
- shaom();
- for(;dd==0;)
- shaom();
- }
- void sjb(void) //三角波
- {
- uchar max;
- max=vout;
- shaom();
- for(;dd;)
- {
- for(iii=0;iii<=max;iii=iii+2)
- {
- P1=iii;
- shaom();
- delay(10);
- if(dd==0)
- break;
- }
- if(dd==0)
- break;
- for(;iii>0;iii=iii-2)
- {
- P1=iii;
- shaom();
- delay(5);
- if(dd==0)
- break;
- }
- if(dd==0)
- break;
- }
- P1=max;
- shaom();
- for(;dd==0;)
- shaom();
- }
- unsigned char keyscan(void) //鍵盤掃描函數,使用行列反轉掃描法
- {
- unsigned char cord_h,cord_l;//行列值中間變量
- P3=0x0f; //行線輸出全為0
- cord_h=P3&0x0f; //讀入列線值
- if(cord_h!=0x0f) //先檢測有無按鍵按下
- {
- delay(70); //去抖
- if((P3&0x0f)!=0x0f)
- {
- cord_h=P3&0x0f; //讀入列線值
- P3=cord_h|0xf0; //輸出當前列線值
- cord_l=P3&0xf0; //讀入行線值 ;;
- while((P3&0xf0)!=0xf0);//等待松開并輸出
- {
- time1=time1+1;
- return(cord_h+cord_l);//鍵盤最后組合碼值
- }
- }
- }return(0); //返回該值
- }
- void timer0_isr(void) interrupt 1 //timer0中斷
- //用于LED數碼管的動態顯示
- {
-
- TR0=0; //停止時鐘0
- P2=counter[j];
- switch(j)
- {
- case 0:P0=seg[scan1];break;
- case 1:P0=seg_point[scan2];break;
- default:break; //j為其他情況是跳出循環
- }
- j++;
- if(j==2)
- j=0;
- TL0=(timer0_count & 0x00ff);
- TH0=(timer0_count>>8); //設置time0 初值
- TR0=1; //開時鐘
- }
-
- void main(void)
- {
- ce=0;
- delay(5);
- scan1=(P3/2)%10;
- scan2=P3/20;
- ce=1;
- delay(5);
- shuc();
- timer0_initialize(); //定時器初始化用于LED顯示
- do
- {
- key=keyscan();
- if(time1==1)
- switch( key)
- {
-
- case 0xee:aa=1;break;//1 按下相應的鍵顯示相對應的碼值
- case 0xed:aa=2;break;
- case 0xeb:aa=3;break;
- case 0xe7:aa=4;break;//4
- case 0xde:aa=5;break;//5
- case 0xdd:aa=6;break;//5
- case 0xdb:aa=7;break;//6
- case 0xd7:aa=8;break;//7
- case 0xbe:aa=9;break;//8
- case 0xbd:aa=0;break;//9
- case 0xbb:time1--;break;//確認
- case 0xb7: //三角波
- {
- time1=0;
- sjb();
- }
- break;
- case 0x7e: //加
- {
- time1=0;
- scan1++;
- if(scan1==10)
- {
- scan1=0;
- scan2++;
- if(scan2==10)
- scan2=0;
- }
- shuc();
- }break;//c
- case 0x7d: //減
- {
- time1=0;
- scan1--;
- if(scan1==-1)
- {
- scan1=9;
- scan2--;
- if(scan2==-1)
- scan2=9;
- }
- shuc();
- }break;
- case 0x7b: //自動步進
- {
- time1=0;
- zdbj();
- }break;//e
- case 0x77: time1--;break;
- }
-
- if(time1==2)
- switch( key)
- {
-
- case 0xee:bb=1;break;//0 按下相應的鍵顯示相對應的碼值
- case 0xed:bb=2;break;//1
- case 0xeb:bb=3;break;//2
- case 0xe7:bb=4;break;//3
- case 0xde:bb=5;break;//4
- case 0xdd:bb=6;break;//5
- case 0xdb:bb=7;break;//6
- case 0xd7:bb=8;break;//7
- case 0xbe:bb=9;break;//8
- case 0xbd:bb=0;break;//9
- case 0xbb: //確認
- {
- scan2=0;
- scan1=aa;
- time1=0;
- shuc();
- }break;
- case 0xb7://三角波
- {
- time1=0;
- sjb();
- }
- break;
- case 0x7e: //加
- {
- time1=0;
- scan1++;
- if(scan1==10)
- {
- scan1=0;
- scan2++;
- if(scan2==10)
- scan2=0;
- }
- shuc();
- }break;//c
- case 0x7d: //減
- {
- time1=0;
- scan1--;
- if(scan1==-1)
- {
- scan1=9;
- scan2--;
- if(scan2==-1)
- scan2=9;
- }
- shuc();
- }break;
- case 0x7b: //自動步進
- {
- time1=0;
- zdbj();
- }break;//e
- case 0x77: time1--;break;
- }
- ;
- if(time1>2)
- switch( key)
- {
-
- case 0xee:time1--;break;//0 按下相應的鍵顯示相對應的碼值
- case 0xed:time1--;break;//1
- case 0xeb:time1--;break;//2
- case 0xe7:time1--;break;//3
- case 0xde:time1--;break;//4
- case 0xdd:time1--;break;//5
- case 0xdb:time1--;break;//6
- case 0xd7:time1--;break;//7
- case 0xbe:time1--;break;//8
- case 0xbd:time1--;break;//9
- case 0xbb: //確認
- {
- time1=0;
- scan2=aa;
- scan1=bb;
- time1=0;
- shuc();
- }break;
- case 0xb7://三角波
- {
- time1=0;
- sjb();
- }
- break;
- case 0x7e: //加
- {
- scan1++;
- if(scan1==10)
- {
- scan1=0;
- scan2++;
- if(scan2==10)
- scan2=0;
- }
- shuc();
- }break;//c
- case 0x7d: //減
- {
- time1=0;
- scan1--;
- if(scan1==-1)
- {
- scan1=9;
- scan2--;
- if(scan2==-1)
- scan2=9;
- }
- shuc();
- } break;
- case 0x7b: //自動步進
- {
- time1=0;
- zdbj();
- }break;//e
- case 0x77: time1--;break;
- }
- }
- while(1);
- }
復制代碼 |