一些实用的单片机c程序.docx
- 文档编号:11351135
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:45
- 大小:27.73KB
一些实用的单片机c程序.docx
《一些实用的单片机c程序.docx》由会员分享,可在线阅读,更多相关《一些实用的单片机c程序.docx(45页珍藏版)》请在冰豆网上搜索。
一些实用的单片机c程序
-- C51写的串口通讯程序[转]
/*定义为中断方式串口处理*/
#defineINTERSENDSTR
/*不为8032系列芯片*/
//#defineCHIP_8032
#include
#include
#include
#include"err.h"
#ifdefINTERSENDSTR
unsignedcharxdatasSendComBuf[256],sRecComBuf[256];
unsignedchardatabOut,bIn,bSout,bSin;
#else
#defineDEFSENDCHARTI=0;SBUF=ACC;while(!
TI);TI=0;
#endif
//bps设置9600就是PSetBps(96)(11.0592Mhz)
unsignedchar PSetBps(unsignedintbps)SMALL
{
unsignedintt1;
unsignedchart2;
#ifdefINTERSENDSTR
/*如果使用中断方式发送数据,必须等待发送数据完毕才能更换波特率*/
while(bSin!
=bSout)
{
;
}
ES=0;
#endif
#ifdefCHIP_8032
if(3456%bps)
{
returnERR_SET_BPS;
}
t1=3456/bps;
t1--;t1=~t1;
RCAP2H=t1/256;RCAP2L=t1;
T2MOD=0x00;
/*使用定时器2做波特率发生器*/
T2CON=0x34;/*TF2=0;EXF2=0;RCLK=1;TCLK=1;EXEN2=0;TR2=1;C/T2=0;CP/RL2=0
*/
#else
t1=576/bps;
if((576%bps)||((t1==0))||(t1>=2*256))
{
returnERR_SET_BPS;
}
if(t1>256)
{
PCON=00;
t2=256-(288/bps);
}
else
{
PCON=0x80;
t2=256-t1;
}
TH1=t2;TL1=t2;
TR1=1;
#endif
/*模式3*/
SM0=0;
RI=0;TI=0;
REN=1;
SM1=1;
SM2=1;
#ifdefINTERSENDSTR
bOut=bIn;
bSout=bSin;
ES=1;
#endif
returnOK;
}
voidPSendChar(unsignedcharch)SMALL
{
#ifdefINTERSENDSTR
unsignedchartch;
tch=bSin+1;
while(tch==bSout)
{
;
}
sSendComBuf[bSin]=ch;
ES=0;
if((bSout==bSin))
{
SBUF=sSendComBuf[bSin];
bSin++;
}
else
{
bSin++;
}
ES=1;
#else
ACC=ch;
DEFSENDCHAR;
#endif
}
unsignedcharPGetChar()SMALL
{
unsignedcharch;
#ifdef INTERSENDSTR
ch=sRecComBuf[bOut];
bOut++;
returnch;
#else
ch=SBUF;
RI=0;
#endif
}
bitPCharInCom()SMALL
{
#ifdef INTERSENDSTR
if(bIn!
=bOut)
{
return1;
}
return0;
#else
returnRI;
#endif
}
voidPSendString(unsignedchar*st)SMALL
{
while(*st)
{
PSendChar(*st);
st++;
}
}
voidPSendArray(unsignedchar *st,unsignedint len)SMALL
{
unsignedintii;
for(ii=0;ii { PSendChar(st[ii]); } } #ifdef INTERSENDSTR voidPSerialInt()interrupt4 { if(RI) { sRecComBuf[bIn]=SBUF; bIn++; RI=0; } if(TI) { TI=0; if(bSout! =bSin) { bSout++; } if(bSout! =bSin) { SBUF=sSendComBuf[bSout]; } } } #endif //16进制<->10进制互换程序 unsignedchard[10]; //用于显示的10位显示缓存 //======================================================== //16进制to10进制输出子程序: 显示数据,起始位,结束位,有无小数点 //======================================================== voidoutput(unsignedlongdd,unsignedchars,unsignedchare,unsignedchardip){ unsignedlongdiv; unsignedchartm[8],i,j; div=10000000; for(i=0;i<8;i++){ tm[i]=dd/div;//16进制<->10进制互换程序 unsignedchard[10]; //用于显示的10位显示缓存 //======================================================== //16进制to10进制输出子程序: 显示数据,起始位,结束位,有无小数点 //======================================================== voidoutput(unsignedlongdd,unsignedchars,unsignedchare,unsignedchardip){ unsignedlongdiv; unsignedchartm[8],i,j; div=10000000; for(i=0;i<8;i++){ tm[i]=dd/div; dd%=div; div/=10; } for(i=0;i<6;i++){ if(tm[i]! =0)break; tm[i]=nul; } tm[5]|=dip; //小数点控制,请看"串行LED数码管显示驱动程序" j=7; for(i=s;i d[i]=tm[j]; j--; } } //把显示位5-9位的10进制数转换成为16进制数 unsignedintinput(void){ unsignedintdd,dat; dd=10000;dat=0; for(i=5;i<10;i++){ dat+=dd*temp; dd/=10; } return(dat); } /* 89C51系列CPU编程器接收CPU程序*/ #include #include #include #definee8 #definep9 #definel10 sbitled=P3^2; sbitp27=P2^7; sbitp26=P2^6; sbitp36=P3^6; sbitp37=P3^7; sbitrst=P3^3; sbitale=P3^5; sbitvpp=P3^4; bitb_break; unsignedintadds; // 13.8mS voidint_t0(void)interrupt1{ TH0=-100; b_break=1; } voidwait(unsignedcharw){ unsignedintt=w*184; b_break=0; TL0=-t%256-1;TH0=-t/256; while(b_break==0){} } voidnop(void){ _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } unsignedcharcommand(void){ TH0=-100;b_break=0; while(RI==0){if(b_break==1)return(0);} RI=0; return(SBUF); } voidearsure(unsignedcharcpu){ switch(cpu){ case1: //89C51 case2: rst=p26=1;p27=p36=p37=0;nop();vpp=1;nop(); ale=0;wait(110);ale=1;nop(); break; case3: case4: break; case5: case6: break; } } voidprogram(unsignedcharcpu){ unsignedintbdataadds=0; unsignedchard; switch(cpu){ case1: //89C51 case2: p36=p37=1;rst=1; while (1){ TH0=-100;b_break=0; while(RI==0){if(b_break==1)return;} RI=0; d=SBUF; //address P0=adds%256; P2=adds/256; p27=1; //data P1=d; nop(); //48clcl //vpp vpp=1; nop(); //48clcl //ale ale=0; wait (1);//100uS ale=1; nop(); //10uS vpp=0; nop(); //48clcl p27=0; nop(); //48clcl P1=0xff; TH0=-100;b_break=0; while(d! =P1){if(b_break==1)return;} //datapolling SBUF=d; adds++; } break; case3: case4: case5: case6: break; } } voidlock(unsignedcharcpu){ unsignedchari; switch(cpu){ case1: //89c51 case2: //lock1 rst=p26=p36=p27=p37=1;nop(); vpp=1; nop(); ale=0; // for(i=0;i<6;i++)wait(100); wait (1); ale=1; nop(); vpp=0; nop(); //lock2 rst=p26=p27=1;p36=p37=0;nop(); vpp=1; nop(); ale=0; // for(i=0;i<6;i++)wait(100); wait (1); ale=1; nop(); vpp=0; nop(); //lock3 rst=p26=p36=1;p27=p37=0;nop(); vpp=1; nop(); ale=0; // for(i=0;i<6;i++)wait(100); wait (1); ale=1; nop(); vpp=0; nop(); break; case3: case4: case5: case6: break; } } voidmain(void){ unsignedchardisp,flash,temp,cpu; EA=1; SCON=0xd8;PCON=0x80; TMOD=0x21; TL1=TH1=0xff;TR1=1; TH0=-100;ET0=TR0=1; flash=0x80; while (1){ temp=command(); switch(temp){ case0: case1: //89c51 case2: //89C52 case3: //80f51 case4: //80F52 case5: //87F51 case6: cpu=temp;SBUF=temp;break;//87f52 casee: SBUF=temp;earsure(cpu);break; //erasure casep: SBUF=temp;program(cpu);break; //program casel: lock(cpu);SBUF=temp;break; //lock default: SBUF=temp;break; } b_break=0; if((++disp)>flash){disp=0;led=! led;} } } //HT1380实时时钟驱动程序 sbitclock_dat=P0^1; sbitclock_clk=P0^2; sbitclock_rst=P0^3; sbita0=ACC^0; sbita1=ACC^1; sbita2=ACC^2; sbita3=ACC^3; sbita4=ACC^4; sbita5=ACC^5; sbita6=ACC^6; sbita7=ACC^7; voidclock_out(unsignedchardd){ ACC=dd; clock_dat=a0;clock_clk=1;clock_clk=0; clock_dat=a1;clock_clk=1;clock_clk=0; clock_dat=a2;clock_clk=1;clock_clk=0; clock_dat=a3;clock_clk=1;clock_clk=0; clock_dat=a4;clock_clk=1;clock_clk=0; clock_dat=a5;clock_clk=1;clock_clk=0; clock_dat=a6;clock_clk=1;clock_clk=0; clock_dat=a7;clock_clk=1;clock_clk=0; } unsignedcharclock_in(void){ clock_dat=1; a0=clock_dat; clock_clk=1;clock_clk=0;a1=clock_dat; clock_clk=1;clock_clk=0;a2=clock_dat; clock_clk=1;clock_clk=0;a3=clock_dat; clock_clk=1;clock_clk=0;a4=clock_dat; clock_clk=1;clock_clk=0;a5=clock_dat; clock_clk=1;clock_clk=0;a6=clock_dat; clock_clk=1;clock_clk=0;a7=clock_dat; return(ACC); } unsignedcharread_clock(unsignedcharord){ unsignedchardd=0; clock_clk=0; clock_rst=0; clock_rst=1; clock_out(ord); dd=clock_in(); clock_rst=0; clock_clk=1; return(dd); } voidwrite_clock(unsignedcharord,unsignedchardd){ clock_clk=0; clock_rst=0; clock_rst=1; clock_out(ord); clock_out(dd); clock_rst=0; clock_clk=1; } /*单个汉字库字摸提取程序,tc2.0编译*/ #include"stdio.h" #include"dos.h" #include"process.h" #include"string.h" voidmain(void){ longintnum_bytes,qm,wm; unsignedchard,i,j,k,a[132],b[132]; unsignedchar*data; unsignedchar*hz; staticunsigned chardd[103]; FILE*fp; if((fp=fopen("hzk16f","rb"))==NULL){ printf("can'topenhzk16\n"); exit (1); } clrscr(); while (1){ data=(unsignedchar*)malloc(33); printf("pleaseinput: \n"); scanf("%s",dd); /*输入一个汉字*/ qm=*dd; /*通过区位码计算其在hzk16f文件中的偏移地址*/ qm=qm-161; if(qm>87)exit(0); wm=*(dd+1); wm=wm-161; if(wm>94)exit(0); num_bytes=((long)qm*94+wm)*32; fseek(fp,num_bytes,SEEK_SET); fgets(data,33,fp); for(i=0;i<32;i++)b[i]=*data++; for(i=0;i<32;i+=2)a[i/2]=b[i]; for(i=0;i<32;i+=2)a[i/2+16]=b[i+1]; for(i=8;i<16;i++)b[i]=a[i]; for(i=8;i<16;i++)a[i]=a[i+8]; for(i=8;i<16;i++)a[i+8]=b[i]; /*转换,hzf16f在电脑的储存格式是以行为字节计算的,一般的lcd都采用以列为字节计算*/ for(k=0;k<32;k+=8){ for(j=0;j<8;j++){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一些 实用 单片机 程序