单片机C语言程序.docx
《单片机C语言程序.docx》由会员分享,可在线阅读,更多相关《单片机C语言程序.docx(16页珍藏版)》请在冰豆网上搜索。
单片机C语言程序
数码管显示采用共阴极结构,其公共端接地。
采用动态显示方式实现0—9数字的显示.
#include
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedchardispcount;
voiddelay02s(void)
{
unsignedchari,j,k;
for(i=50;i>0;i--)
for(j=50;j>0;j--)
for(k=248;k>0;k--);
}
voidmain()
{
while
(1)
{
for(dispcount=0;dispcount<10;dispcount++)
{
P1=table[dispcount];
delay02s();
}
}
}
实现报警产生器,其中P1_7引脚接一个开关,P1_0输出1kHz和500Hz的音频信号驱动扬声器,作警报信号,要求1kHz信号响100ms,500Hz信号响200ms,
#include
#include
sbitP1_7=P1^0;
sbitP1_0=P1^0;
unsignedcharcount;
voiddely500(void)
{
unsignedchari;
for(i=500;i>0;i--)
{
_nop_();
}
}
voidmain(void)
{
while
(1)
{
if(P1_7==0)
{
for(count=200;count>0;count--)
{
P1_0=~P1_0;
dely500();
}
for(count=200;count>0;count--)
{
P1_0=~P1_0;
dely500();
dely500();
}
}
}
}
采用定时器/计数器工作方式,同时采用中断服务程序来实现闪烁功能.
#include
sbitP1_0=P1^0;
unsignedchari,j;
voiddelay1()
{
for(i=0;i<200;i++)
for(j=0;j<248;j++);
}
voiddelay2()
{
for(i=0;i<240;i++)
for(j=0;j<248;j++);
}
voidmain()
{
TMOD=0x06;
TH0=246;
TL0=246;
IE=0x82;
P1_0=1;
TR0=1;
while
(1);
}
voidtimer0()interrupt1
{
unsignedchark;
for(k=0;k<=5;k++)
{P1_0=0;
delay1();
P1_0=1;
delay2();
}}
独立式键盘电路设计1.
#include
voiddelay10ms(void)
{
unsignedchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
voidmain()
{
unsignedcharx;
P1=0xff;
x=1;
while
(1)
{
while(x==1)
{
x=P3;
x=~x;
}
delay10ms();
x=P3;
x=~x;
if(x==1)continue;
switch(x)
{
case0x3e:
P1=0xfe;break;
case0x3d:
P1=0xfd;break;
case0x3c:
P1=0xfb;break;
case0x37:
P1=0xf7;break;
case0x2f:
P1=0xef;break;
case0x1f:
P1=0xdf;break;
default:
break;
}
}
}
独立式键盘电路设计2.
#include
voiddelay10ms(void)
{
unsignedchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
voidmain()
{
unsignedcharx;
P3=0xff;
x=1;
while
(1)
{
while(x==1)
{
x=P1;
x=~x;
}
delay10ms();
x=P1;
x=~x;
if(x==1)continue;
switch(x)
{
case0xfe:
P3=0xfe;break;
case0xfd:
P3=0xfd;break;
case0xfb:
P3=0xfb;break;
case0xf7:
P3=0xf7;break;
case0xef:
P3=0xef;break;
case0xdf:
P3=0xdf;break;
case0xbf:
P3=0xbf;break;
case0x7f:
P3=0x7f;break;
default:
break;
}
}
}
多个数码管动态显示程序设计.
\#include
unsignedcharcodeTab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};
unsignedcharcodeCol[]={0x01,0x02,0x04,0x08,0x10,0x20};
xdataunsignedcharOUTBIT_at_0x8002;
xdataunsignedcharOUTSEG_at_0x8004;
voiddelay()
{
unsignedchari,j,k;
for(i=50;i>0;i--)
for(j=50;j>0;j--)
for(k=248;k>0;k--);
}
voidmain()
{
unsignedcharj;
while
(1)
{
for(j=1;j<7;j++)
{
OUTSEG=Tab[j];
OUTBIT=Col[j-1];
delay();
OUTBIT=0x00;
delay();
}
}
}
霓虹灯控制系统程序设计
#include
unsignedchari10,i8,i6;
unsignedcharmod1,mod2;
bitF;
voidmain(void)
{
i10=10;
i8=8;
i6=6;
mod1=0x01;
mod2=0xAA;
F=0;
TMOD=0x10;
TH1=0x3C;
TL1=0xB0;
IE=0x8A;
TR1=1;
while
(1);
}
voidtimer0()interrupt3using1
{
TH1=0x3C;
TL1=0xB0;
i10--;
if(i10==0)
{
i10=10;
if(F==0)
{
P1=mod1;
mod1=mod1<<1;
i8--;
if(i8==0)
{
i8=8;
F=1;
mod1=0x01;
}
}
else
{
P1=mod2;
mod2=~mod2;
i6--;
if(i6==0)
{
i6=6;
F=0;
}
}
}
}
一键多功能按键识别程序设计
#include
unsignedcharID;
sbitP3_0=P3^0;
sbitP1_3=P1^3;
sbitP1_1=P1^1;
sbitP1_2=P1^2;
sbitP1_0=P1^0;
voiddelay10ms(void)
{
unsignedchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
voiddelay02s(void)
{
unsignedchari;
for(i=20;i>0;i--)
{delay10ms();
}
}
voidmain(void)
{while
(1)
{if(P3_0==0)
{delay10ms();
if(P3_0==0)
{
ID++;
if(ID==0)
{
ID=0;
}
while(P3_0==0);}
}
switch(ID)
{case0:
P1=P1|0xfe;
P1_0=~P1_0;
delay02s();
break;
case1:
P1=P1|0xfd;
P1_1=~P1_1;
delay02s();
break;
case2:
P1=P1|0xfb;
P1_2=~P1_2;
delay02s();
break;
case3:
P1=P1|0xf7;
P1_3=~P1_3;
delay02s();
break;
}
}
}
电子时钟.其中包括整点报时,时间调整.
#include
#include
#defineLEDLen6
#definePB12//164时钟位
#definePB01//164数据位
xdataunsignedcharOUTBIT_at_0x8002;//位控制口
xdataunsignedcharOUTSEG_at_0x8004;//段控制口
xdataunsignedcharIN_at_0x8001;//键盘读入口
unsignedcharLEDBuf[LEDLen];//显示缓冲
unsignedcharx,y;
codeunsignedcharLEDMAP[]={//八段管显示码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
sbitP1_5=P1^5;//整点报时
//延时子程序:
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
}
voidDisplayLED()
{
unsignedchari;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;//从左边开始显示
for(i=0;iOUTBIT=0;//关所有八段管
LED=LEDBuf[i];
OUTSEG=LED;
OUTBIT=Pos;//显示一位八段管
Delay
(1);
Pos>>=1;//显示下一位
}
}
codeunsignedcharKeyTable[]={//键码定义
0x16,0x15,0x14,0xff,
0x13,0x12,0x11,0x10,
0x0d,0x0c,0x0b,0x0a,
0x0e,0x03,0x06,0x09,
0x0f,0x02,0x05,0x08,
0x00,0x01,0x04,0x07
};
unsignedcharTestKey()
{
OUTBIT=0;//输出线置为0
return(~IN&0x0f);//读入键状态(高四位不用)
}
unsignedcharGetKey()
{
unsignedcharPos;
unsignedchari;
unsignedchark;
i=6;
Pos=0x20;//找出键所在列
do{
OUTBIT=~Pos;
Pos>>=1;
k=~IN&0x0f;
}while((--i!
=0)&&(k==0));
//键值=列x4+行
if(k!
=0)
{
i*=4;
if(k&2)
i+=1;
elseif(k&4)
i+=2;
elseif(k&8)
i+=3;
OUTBIT=0;
doDelay(10);while(TestKey());//等键释放
return(KeyTable[i]);//取出键码
}
elsereturn(0xff);
}
//===========================================================
#defineTick10000//10000x100us=1s
#defineT100us(256-50)//100us时间常数(6M)
unsignedcharHour,Minute,Second;
unsignedintC100us;//100us记数单元
//主程序
voidmain()
{
TMOD=0x02;//方式2,定时器
TH0=T100us;
TL0=T100us;
IE=0x82;//EA=1,IT0=1
Hour=0;
Minute=0;
Second=0;
C100us=Tick;
TR0=1;//启动定时器0
while
(1)
{
LEDBuf[0]=LEDMAP[Hour/10];
LEDBuf[1]=LEDMAP[Hour%10]|0x80;
LEDBuf[2]=LEDMAP[Minute/10];
LEDBuf[3]=LEDMAP[Minute%10]|0x80;
LEDBuf[4]=LEDMAP[Second/10];
LEDBuf[5]=LEDMAP[Second%10];
DisplayLED();
if(TestKey())
{x=GetKey();
switch(x)
{
case0x00:
Second=Second+1;if(Second>59)Second=0;
break;
case0x0f:
Minute=Minute+1;if(Minute>59)Minute=0;
break;
case0x0e:
Hour=Hour+1;if(Hour>23)Hour=0;
break;
case0x01:
if(Second==0)Second=59;
Second=Second-1;
break;
case0x02:
if(Minute==0)Minute=59;
Minute=Minute-1;
break;
case0x03:
if(Hour==0)Hour=23;
Hour=Hour-1;
break;
}
}
if((Second==0)&(Minute==0))//整点报时
{
for(y=Hour;y>0;y--)
{
P1_5=~P1_5;
Delay(100);
P1_5=~P1_5;
Delay(100);}
}
}
}
//中断程序
voidT0Int()interrupt1
{
C100us--;
if(C100us==0){
C100us=Tick;//100us记数器为0,重置记数器
Second++;
if(Second==60){
Second=0;
Minute++;
if(Minute==60)
{
Minute=0;
Hour++;
if(Hour==24)Hour=0;
}
}
}
}