单片机实验程序(全)_第1页
单片机实验程序(全)_第2页
单片机实验程序(全)_第3页
单片机实验程序(全)_第4页
单片机实验程序(全)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2基本输入输出实验(蜂鸣器控制程序)/*名称:基本输入输出(I/O)程序说 明:*/#include/包含头文件#define uint unsigned int /宏定义#define uchar unsigned char sbit buzzer=P35;sbit Keyadd=P20;sbit Keydec=P21;sbit Keycom=P22; void Delay(uint z)uint x;uchar y;for(x=z;x0;x-)/延时 for(y=250;y0;y-);void main(void) uchar voice; voice=3; while(1) if(Key

2、add=0)/按键被按下时为0voice=1;if(Keydec=0)voice=2;if(Keycom=0)voice=3;if(voice=1)buzzer=buzzer; Delay(1);else if(voice=2)buzzer=buzzer; Delay(20);elsebuzzer=1; 3定时器中断实验/*名称:实验三作业说 明:*/#include/包含头文件#define uint unsigned int /宏定义#define uchar unsigned char uchar counter;uchar voice;sbit buzzer=P35;sbit Keya

3、dd=P20;sbit Keydec=P21;sbit Keycom=P22;sbit Keycan=P23;/-计算计数器初值-/#define T0_TIME1254 /定时时间us为单位#define T0ReLoadL1 (65536-(uint)(T0_TIME1*11.0592/12) % 256)#define T0ReLoadH1 (65536-(uint)(T0_TIME1*11.0592/12) / 256) /-计算计数器初值-/#define T0_TIME21400 /定时时间us为单位#define T0ReLoadL2 (65536-(uint)(T0_TIME2

4、*11.0592/12) % 256)#define T0ReLoadH2 (65536-(uint)(T0_TIME2 *11.0592/12) / 256)/*名称:主程序说明:*/void main(void)/-初始化TIMER0 TMOD|=0 x01;/定时器T0方式1TH0 =T0ReLoadH1;/装载计数器初值 TL0 =T0ReLoadL1;TR0 =1;/启动Timer0ET0 =1;/Timer0中断使能EA =1;/总开关使能/-大循环counter=0;while(1)if(Keyadd=0)/按键被按下时为0voice=1;if(Keydec=0)voice=2;

5、if(Keycom=0)voice=3;/*名称:Timer0中断服务子程序功能:产生10ms定时中断*/void Timer0_Int(void) interrupt1if(voice=1) TH0=T0ReLoadH1;/重装载计数器初值 TL0=T0ReLoadL1; buzzer=buzzer;if(voice=2) TH0=T0ReLoadH2; TL0=T0ReLoadL2; buzzer=buzzer;if(voice=3) 4 LED数码管动态扫描显示实验#include#define uint unsignedint#define uchar unsignedchar/-LE

6、D显示代码-/ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0/ dp G C D E F B Auchar code seg10=0 x3f,0 x22,0 x5b,0 x73,0 x66,/0,1,2,3,40 x75,0 x7d,0 x23,0 x7f,0 x77,;/5,6,7,8,9ucharidatadis_buff_14;/第一行 LED显示缓冲ucharidatadis_buff_24;/第二行 LED显示缓冲ucharcounter;sbitU4_HC574_CP=P10;/S3 显示锁存74HC574脉冲sbitU5_HC574_CP=P11

7、; /S4 显示锁存74HC574脉冲#define T0_TIME10000 /定时时间us为单位#define T0ReLoadL (65536-(uint)(T0_TIME*11.0592/12) % 256)#define T0ReLoadH (65536-(uint)(T0_TIME*11.0592/12) / 256)/*名称:数码管显示驱动子程序说明:*/void Display(void)uchardatai,j,k,temp00;temp00=0 x20; for(i=0;i4;i+)P1 |= 0 x3C;/关所有扫描位P0=dis_buff_1i;U4_HC574_CP=

8、0;U4_HC574_CP=1;/S3显示锁存74HC574脉冲 上升沿P0=dis_buff_2i;U5_HC574_CP=0;U5_HC574_CP=1;/S4显示锁存74HC574脉冲 上升沿P1 &= (temp00);/送扫描位for(j=0;j20;j+)/延时 for(k=0;k=1;/扫描位移位P1|=0 x3C;/关所有扫描位/*名称:主程序*/void main(void)uchardatabai,shi,ge;uintdataNum;uchardatatemp00;TMOD|=0 x01;/定时器T0方式1TH0 =T0ReLoadH;/装载计数器初值 TL0 =T0Re

9、LoadL;TR0 =1;/启动Timer0ET0 =1;/Timer0中断使能EA =1;/总开关使能counter=0;Num=999;for(;)bai=Num/100;temp00=Num-bai*100;shi=temp00/10;ge =temp00-shi*10;dis_buff_10=0;dis_buff_11=0;dis_buff_12=0;dis_buff_13=0;dis_buff_20=0;dis_buff_21=segbai;dis_buff_22=segshi;dis_buff_23=segge;if(counter=100) counter=0;Num-;if(N

10、um=0)Num=999;Display();/调用LED数码管显示子程序void Timer0_Int(void) interrupt1 TH0=T0ReLoadH;/重装载计数器初值 TL0=T0ReLoadL;counter+;5实时时钟与温度传感器实验(只需main()部分代码)void main(void)uchar Hour,Min,Sec;/-初始化TIMER0 TMOD|=0 x01;/定时器T0方式1TH0 =T0ReLoadH;/装载计数器初值 TL0 =T0ReLoadL;TR0 =1;/启动Timer0ET0 =1;/Timer0中断使能EA =1;/总开关使能coun

11、ter=0;/-大循环WR_DS1302(0 x8e,0X00);WR_DS1302(0 x84,0X14);WR_DS1302(0 x82,0X43);WR_DS1302(0 x80,0X00);WR_DS1302(0 x8e,0X80);for(;) Hour=RD_DS1302(0 x85); Min=RD_DS1302(0 x83); Sec=RD_DS1302(0 x81); dis_buff_10=segHour4;if(counter=49)dis_buff_11=segHour&0 x0f|0 x80;else if(counter4;dis_buff_13=segMin&0

12、x0f;dis_buff_20=0;dis_buff_21=0;dis_buff_22=segSec4;dis_buff_23=segSec&0 x0f; Display();6 74HC595串行输入实验#include / use _nop_() function#include#define uint unsignedint#define uchar unsignedcharucharcounter;/-计算计数器初值-/#define T0_TIME10000 /定时时间us为单位#define T0ReLoadL (65536-(uint)(T0_TIME*11.0592/12) %

13、 256)#define T0ReLoadH (65536-(uint)(T0_TIME*11.0592/12) / 256)uchar bdata HC595_buff2; /交通灯控制1的位寻址变量sbitHC595RegCLK=P25;/4hc595锁存时钟 输出sbitHC595S_Data=P26;/74hc595串行数据 输出sbitHC595ShiftCLK=P27;/74hc595串行移位时钟 输出 /*名称:WR_74HC595说明:向2片74HC595写入2字节数据(HC595_buff)*/void WR_74HC595(void)uchar i,j,k,temp00;H

14、C595RegCLK = 0; /锁存线置“低” HC595ShiftCLK = 0;/HC595.CLK =0for(i=0;i2;i+) k=0X80;temp00=HC595_buff1-i; for(j=0;j= 1;/k右移一位 HC595ShiftCLK = 0;/HC595.CLK HC595RegCLK = 1; /产生上升沿,锁存数据void Timer0_Int(void) interrupt1 TH0=T0ReLoadH;/重装载计数器初值 TL0=T0ReLoadL;counter+;/*名称:主程序说明:main主函数放在所有子程序的后面,自称无需声明定义*/void

15、 main(void)uchar CN,i;CN=0;HC595_buff0=0 x00;HC595_buff1=0 x00;/-初始化TIMER0 TMOD|=0 x01;/定时器T0方式1TH0 =T0ReLoadH;/装载计数器初值 TL0 =T0ReLoadL;TR0 =1;/启动Timer0ET0 =1;/Timer0中断使能EA =1;/总开关使能counter=0;for(;) if(CN10) if(counter=50) counter=0; HC595_buff0=HC595_buff0; HC595_buff1=HC595_buff1; CN+; counter=0; i

16、=0;if(CN=10)HC595_buff0=0 x00; HC595_buff1=0 x08;else if(CN=10) if(counter=10) i+;counter=0;if(i=1; else if (i=4) HC595_buff0=0 x80; HC595_buff1=0 x00; else if(i=1; else if(i=12) i=0; HC595_buff0=0 x00; HC595_buff1=0 x08;WR_74HC595(); 7交通信号灯控制实验(仅需TraficLighter_ctrl()子程序部分代码)void TraficLighter_ctrl(

17、void)switch(TraficLighter_state) case 0: /初始化状态,两个方向都为红灯5秒钟if(timer_count1=50) timer_count1=0; HC595_buff0=HC595_buff0; HC595_buff1=HC595_buff1;if (timer_count0=0) TraficLighter_state=1;timer_count0=30;HC595_buff0=0;HC595_buff1=0;break;case 1:/状态1,南北方向红灯,东西绿灯East_Green=1;West_Green=1;North_Red=1;Sou

18、th_Red=1;if(timer_count0=0) TraficLighter_state=2;timer_count0=5;HC595_buff0=0;HC595_buff1=0;break;case 2:/状态2,南北方向红,东西黄灯闪烁 South_Red=1; North_Red=1; if(timer_count1=50) timer_count1=0; East_Yellow=East_Yellow; West_Yellow=West_Yellow;if(timer_count0=0) TraficLighter_state=3;timer_count0=50;HC595_bu

19、ff0=0;HC595_buff1=0;break;case 3:/状态3,南北方向绿灯,东西红灯East_Red=1;West_Red=1;North_Green=1;South_Green=1;if(timer_count0=0) TraficLighter_state=4;timer_count0=5;HC595_buff0=0;HC595_buff1=0; break;case 4:/状态4,东西方向红,南北黄灯闪烁 East_Red=1; West_Red=1; if(timer_count1=50) timer_count1=0; South_Yellow=South_Yellow

20、; North_Yellow=North_Yellow;if(timer_count0=0) TraficLighter_state=1;timer_count0=5;HC595_buff0=0;HC595_buff1=0;break;8 UART串口通讯实验#include/包含头文件#define uint unsigned int /宏定义#define uchar unsigned char uchar Rec_No; uchar Rec_Data; ucharRec_Addr; uchar Send_ok;uchar Rec_order;ucharSelf_Addr;sbit rel

21、ay=P37;/*名称:主程序说明:*/void main(void)/-UART串口初始化SM0 =0;SM1 =1;/串口方式1REN =1;/允许接收 TMOD |=0 x20;/定时器T1方式2TH1 =0 xfd;/装载计数器初值 TL1 =0 xfd;TR1 =1;/启动Timer1PCON &=0 x7f;/SMOD=0,BRT=9600bps;SMOD=1,BRT=19200bps;Send_ok=0;Self_Addr=0 x02;ES =1;/打开串口中断EA =1;/总开关使能/-大循环while(1)/*名称:串口中断服务子程序功能:*/void UART0(void)

22、 interrupt4uchar Temp0; if(RI=1)/接收到数据Rec_No+;Temp0=SBUF; RI=0; if(Rec_No=1)Rec_Addr=Temp0; /必须软件清零标志else if(Rec_No=2)Rec_order=Temp0;Rec_No=0;if(Rec_Addr=Self_Addr)if(Rec_order=0 x21)relay=0; if(Rec_order=0 x22)relay=1; if(Rec_order=0 x20) SBUF=Rec_No;Send_ok=0;if(TI=1)/发送数据完毕 TI=0;if(Send_ok=0)SBU

23、F=35; Send_ok=1; /必须软件清零标志附录资料:不需要的可以自行删除测量平差程序设计角度(度分秒)到弧度AngleToRadian#define PI 3.14159265double AngleToRadian(double angle)int D,M;double S,radian,degree, angle,MS;D=int(angle+0.3);MS=angle-D;M=int(MS)*100+0.3);S=(MS*100-M)*100;degree=D+M/60.0+S/3600.0;radian=degree*PI/180.0;return radian;注意:防止数

24、据溢出,要加个微小量,例如0.3.弧度换角度(度分秒) RadianToAngle#define PI 3.14159265double RadianToAngle(double radian)int D,M;double S,radian,degree,MS,angle;degree=radian*180/PI;D=int(degree);MS=degree-D;M=int(MS*60);S=(MS*60-M)*60;angle=D+M/100.0+S/10000.0;return angle;已知两点求坐标方位角Azimuth#include double Azimuth(double x

25、i,double yi,double xj,double yj)double Dx,Dy,S,T;Dx=xj-xi;Dy=yj-yi;S=sqrt(Dx*Dx+Dy*Dy);if(S1e-10) return 0;T=asin(Dy/S);if(Dx0&(Dy0)|T0) T=2*PI+T;return T;4.开辟二维数组的动态空间的宏#include #define NewArray2D(type,A,i,n,m)A=(type*)malloc(n*sizeof(type*); for(i=0;im;i+) Ai=(type*)malloc(m*sizeof(type); 5.释放开辟的二

26、维数组的空间#define FreeSpace(A,i,m)for(i=0;im;i+) free(Ai); free(A); 注意:释放空间与开辟空间相反,释放空间是先释放列,后释放行.6.矩阵求转置transformmatrixvoid transformmatrix(double *A,double *B,int i,int j)int m,n;for(m=0;m=i;m+)for(n=0;n=j;n+)Bnm=Amn:7.矩阵相乘(mulmatrix)void mulmatrix(double *A,double *B,double *C,int i,int j,int k)int m

27、,n,p;for(m=0;mi;m+)for(n=0;nj;n+)Cmn=0;for(p=0;pk;p+)Cmn+=Amp*Bpn:8.矩阵求逆(countermatrix)#include void countermatrix(double *T, double *s, double *r, double *Q,double *N, double *rt,int n)for(i=0;in;i+)s=Nii;for(k=0;ki;k+)s-=Tki*Tki;Tii=sqrt(s)for(j=i+1;jn;j+)s=Nij;for(k=0;ki;k+)s-=Tki*Tkj;Tij=s/Tii;f

28、or(i=0;in;i+)for(j=0;j=0;i+)rii=1/Tii;for(j=i+1;jn;j+)s=0;for(k=i;kj-1;k+)s-=rik*Tkj;rij=s/Tii;for(i=0;in;i+)for(j=0;jn;j+)rij=0;transformmatrix(r,rt,n,n)mulmatrix(r,rt,Q,n,n)9.平差主程序之读入数据typedef struct POINTchar name8;double x,y;int type;POINT;typedef struct READVALUEPOINT *begin;POINT *end;double v

29、alue;READVALUE;POINT *GETPOINT(char *name,POINT *pPoint,int nPoint)int i;for(i=0;inPoint;i+)if (strcmp(pP,name)=0)return (pPoint+i) for(i=0;i0)pPoint=(POINT*)malloc(nDirect*sizeof(POINT);if(nDirect0)pDirect=(READVALUE*)malloc(nDirect*sizeof(READVALUE);if(nDistance0)pDistance=(READVALUE*)ma

30、lloc(nDistance*sizeof(RAADVALUE);fscanf(fp,”%lf,%lf,%lfn”,&mo,&mf,&ms);for(i=0;inKnownPoint;i+)fscanf(fp,”%s,%lf,%lfn”,pP,&pPointi.x,&pPointi.y);type=1;for( ;inPoint;i+)pP=NULL; pPointi.x=0;pPointi.y=0;pPointi.type=0; for(i=0;inDirect;i+)fscanf(fp,”%s,%s,%lfn”,begin,end,&pDirecti

31、.value);pDirecti.begin=GetPoint(begin,pPoint,nPoint);pDirecti.end=GetPoint(end,pPoint,nPoint);for(i=0;inDistance;i+)fscanf(fp,”%s,%s,%lfn”,begin,end,&pDistancei.value);pDistancei.begin=GetPoint(begin,pPoint,nPoint);pDistancei.end=GetPoint(end,pPoint,nPoint);fclose(fp);10.角度检验(checkangle)#include int

32、 checkangle(double angle)int M,S;double MS;if(angle=0&angle360)MS=angle-(int)(angle);if(M6)S=(int)(MS*1000);if(S%106)return 1;return 0;11.前方交会#define PI=3014159265/*此处调用程序角度换弧度AngleToRadian*/Qianfang(double XE, double YE, double XF, double YF, doubleDEG, double DEF, double DFG, double DFE, double *D

33、FE, double *DFG)double C,A,B;C=DGE-DGF;A=DEF-DEG;B=DFG-DFE;if(C-2*PI)|(C0&C-PI&CPI&C2*PI)XG=(XE/tan(B)+XF/tan(A)+YE-YF)/(1/tan(A)+ 1/tan(B);YG=(YE/tan(B)+YF/tan(A)-XE+XF)/ (1/tan(A)+ 1/tan(B);12.坐标概算全方向法子函数取出观测方向GetAllDirectint GetAllDirect(char *name,int nDirect,READVALUE *pDirect, READVALUE *pStat

34、ion)int i,nCount=0;for(i=0;iname,name)=0)pStationnCount.begin=p(pDirectnCount.begin;pStationnCount.end=p(pDirectnCount.end;pStationnCount.value=p(pDirectnCount.value; nCount+;return nCount;坐标概算全方向法子程序实现流程(coordinate)coordinate (入口参数设置)READVALUE pStation50,pObject50;int nCount,i,j,k,m,n,p,nobject;for

35、(i=0;i1)|( nCount=1)for(j=0;jtype=1)for(k=0;ktype=0) nobject=GetAllDirect(pStationj.end-name,nDirect,pDirect,pobject)m=-1;n=-1;for(p=0;pname,pP)=0)m=p; if(strcmp(pobjectp.end-name,pStationk.end-name)=0)n=p;if(m=0&n=0)pPointi=pStationk.end-pStationj.end;pStationj.end=pObjectm.value-pObjectn

36、.value; Xe=pPointi.x; Ye=pPointi.y; Xf=pStationj.end-x; Yf=pStationj.end-y; Lef=pStationj.value; Leg=pStationk.value; Lfe=pObjectm.value; Lfg=pObjectn.value; Qianfang(Xe,Xf,Ye,Yf,Lef,Leg,Lfe,Lfg,*Xg,*Yg;) pStationk.end-x=*xg; pStationk.end-y=*yg; pStationk.end.type=2; 13.坐标增量法(calcoordinate)子函数由端点名称

37、得边长值的函数GetDistancedouble GetDistance(char *begin,char *end,int nDistance,READVALUE *pDistance)int i;for(i=0;iname,begin)=0&strcmp(pDistancei.end-name,end=0)|(strcmp(pDistancei.begin-name,end)=0&strcmp(pDistancei.end,begin)=0)return pDistancei.value;return -1;/*函数取出观测方向GetAllDirect*/void calcoordinat

38、e(int nDirect,READVALUE *pDirect,int nDistace,READVALUE *pDistance,int nPoint,POINT *pPoint) int nPoint,nCount,nDirect,nDistance; int m=-1,i,j,k; double x1,y1,x2,y2,A0,A,S,dx,dy; READVALUE*pDirect=NULL; READVALUE pStation50; for(i=0;i0) nCount=GetAllDirect(pP,nDirect,pDirect,pStation50); f

39、or(j=0;jtype0)m=j; if(m!=-1) for(k=0;ktype=0) x1=pPointi.x; y1=pPointi.y; x2=pStationj.end-x; y2=pStationj.end-y; A0=Bearing(x1,y1,x2,y2); A=A0-(DMSToRAD(pStationm.value)-DMSToRAD(pStationk.value); if(A2*PI)A=A-2*PI; S=GetDistance(pPointi,pStationk.end,nDistance,pDistance); if(Sx=pPointi.x+dx; pStat

40、ionk.end-y=pPointi.y+dy; pStationk.end-type=2; 14.高斯正反算高斯正算:#include #include #define PI 3.14159265double DMSToRAD(double dDMS)int L1,L2;double T,L3;L1=(int)(dDMS+0.3);L2=(int)(dDMS-L1)*100+0.3);L3=(dDMS-L1)*100-L2)*100;T=(L1+L2/60.0+L3/3600.0)*PI/180.0;return T;void PreGausePositive(double B,double L,double L0, double a, double b, double *N,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论