河南理工大学本科课程设计报告
附1:源程序代码
1.主程序:
#include\void main() {
timer_init(); while(1) { keysccan(); display(); if(buttonflag==1)//有按键动作再执行 { switch(boxing) { case 0:led=0x20;//方波指示灯 th=tab2[f-1];//周期设定 tl=tab3[f-1];//周期设定 break; case 1:led=0x10;//锯齿波指示灯 th=255;//周期设定 tl=tab5[f-1];// dj=tab4[fz-1]/tab6[f-1];//步进计算 break; case 2:led=0x08;//三角波指示灯 th=255;//周期设定 tl=tab7[f-1];// ds=tab4[fz-1]/tab8[f-1];//步进计算 break; case 3:led=0x04; th=255;//周期设定 tl=tab11[f-1];// break; } } P3=led;//指示波形 } }
2.头文件:
#include
#define uchar unsigned char #define uint unsigned int sbit we=P3^6; sbit du=P3^7; sbit led1=P3^5; sbit led2=P3^4; sbit led3=P3^3; sbit led4=P3^2;
uchar th=236,tl=120;//定时器初值设定 uchar i;
uchar led,fz=50;//指示灯和幅值50代表5.0 uchar f=5;//1频率代表100
uchar boxing=0;//0方波1锯齿波2三角波3正弦波 uchar buttonflag;//按键动作标志 uchar dj;//锯齿波两点之间的步进; uchar ds;//三角波两点之间的步进 uchar sq;//方波切换标志
uchar scount;//三角波点数计数 uchar dz;//正弦波步进 uchar zcount;//正弦波计数 uchar code tab0[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
27
河南理工大学本科课程设计报告
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共阴数码管显示0~f
//uchar code tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选编码 uchar code tab1[]={0xfe,0xfd,0xef,0xdf,0xbf,0x7f};//位选编码
uchar code tab2[]={236,246,249,251,252,252,253,253,253,254};//方波Th uchar code tab3[]={150,78,148,53,45,214,75,165,234,35};//方波TL uchar code tab4[]={5,10,15,20,26,31,36,41,46,51, 56,61,66,71,77,82,87,92,97,102, 107,112,117,122,128,133,138,143,148,153, 158,163,168,173,179,184,189,194,199,204, 209,214,219,224,230,235,240,245,250,255};//幅值 uchar code tab5[]={161,181,200,210,200,212,206,200,208,215};//锯齿TL uchar code tab6[]={80,50,40,35,25,25,19,15,15,15};//锯齿波点数
uchar code tab7[]={153,180,196,197,198,200,194,194,192,187};//三角波TL uchar code tab8[]={40,25,20,15,12,10,8,7,6,5};//三角波点数的一半 uchar code tab9[]={80,50,40,30,24,20,16,14,12,10};//三角波点数 uchar code tab10[]={135,145,158,167,176,188,199,209,//正弦64 218,226,234,240,245,249,252,254, 254,253,251,247,243,237,230,222, 213,204,193,182,170,158,146,133, 121,108,96,84,72,61,50,41, 32,24,17,11,7,3,1,0, 0,2,5,9,14,20,28,36, 45,55,66,78,90,102,114,128 };//正弦波表格
uchar code tab11[]={123,253,176,131,160,179,119,138,154,169};//正弦波tl uchar code tab12[]={64,64,32,16,16,16,8,8,8,8};//正弦波点数 uchar code tab13[]={135,158,176,199,//正弦32 218,234,245,252, 254,251,243,230, 213,193,170,146, 121,96,72,50, 32,17,7,1, 0,5,14,28, 45,66,90,114 };//正弦波表格
uchar code tab14[]={135,176,//正弦16 218,245, 254,243, 213,170, 121,72, 32,7, 0,14, 45,90 };//正弦波表格
uchar code tab15[]={135,//正弦8 218, 254, 213, 121, 32, 0, 45 };//正弦波表格
uchar code tab16[]={135,209,//正弦10 254,230, 158,61, 7,14, 78,128 };//正弦波表格
void delay(uchar i) {
uchar x,y;
for(x=i;x>1;x--) for(y=100;y>1;y--); }
void timer_init() {
TMOD=1;
28
河南理工大学本科课程设计报告
TH0=th; TL0=tl; EA=1; ET0=1; TR0=1; }
void display(void) //数码管动态显示四位数 {
uchar fzs,fzg,fs,fg; uchar x,y; fzs=fz/10; fzg=fz; fs=f/10; fg=f;
for(x=0;x<6;x++) {
du=1; switch(x) { case 0:P2=tab0[fzs]+0x80;break; case 1:P2=tab0[fzg];break; //case 2:P2=0x40;break; //case 3:P2=0x40;break; case 2:P2=tab0[fs];break; case 3:P2=tab0[fg];break; case 4:P2=tab0[0];break; case 5:P2=tab0[0];break; } du=0; we=1; P2=tab1[x]; we=0; for(y=120;y>0;y--); } }
void keysccan() {
P0=0xff; delay(1); if(P0!=0xff) { delay(1); if(P0!=0xff) { switch(P0) { case 0xfe:i=0;boxing=2;break;//三角波 case 0xfd:i=1;boxing=3;break;//正弦波 case 0xfb:i=2;if(f>1)f--;break;//频率减 case 0xf7:i=3;if(fz>1)fz--;break;//幅值减 case 0x7f:i=4;if(fz<50)fz++;break;//幅值加 case 0xbf:i=5;if(f<10)f++;break;//频率加 case 0xdf:i=6;boxing=1;break;//锯齿波 case 0xef:i=7;boxing=0;break;//方波 } buttonflag=1; } while(P0!=0xff) { display(); } }
else buttonflag=0; }
void timer0() interrupt 1 {
TH0=th; TL0=tl; sq=!sq;
29
河南理工大学本科课程设计报告
switch(boxing) { case 0:if(sq)P1=tab4[fz-2]; //如果直接写tab4[fz]不行 else P1=0; break; case 1:if(P1 } 30 河南理工大学本科课程设计报告 附 2:系统原理图 原理图 PCB图 31 河南理工大学本科课程设计报告 附 3:实物效果图 32