单片机.docx
《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(21页珍藏版)》请在冰豆网上搜索。
单片机
实验一驱动数码管
#include
sbitadd=P2^0;
sbitmin=P2^1;
sbitbeg=P2^2;
sbitcs=P2^7;
sbitwor=P3^0;
unsignedchartab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelay(unsignedcharms)
{
unsignedinti,j;
for(i=0;i{
for(j=0;j<240;j++);
}
}
unsignedcharkey(chari)
{
P2=0xff;
if(add==0)
{
delay(10);
if(add==0)
{
while(add==0);//松手检测
i++;
if(i>9)
i=0;
}
}
if(min==0)
{
delay(10);
if(min==0)
{
while(min==0);
i--;
if(i<0)
i=9;
}
}
returni;
}
voidmain()
{
unsignedchari,j;
j=0;
cs=1;
while
(1)
{
j=key(j);
P0=tab[j];//显示设定的数
if(beg==0)
{
for(i=0;i<=j;i++)
{
delay(500);
P0=tab[i];
}
wor=0;
while(add==1&&min==1&&beg==1)
{
P0=tab[j];
delay(100);
cs=~cs;
}
cs=1;
wor=1;
}
}
}
实验二键盘扫描
#include
#defineuintunsignedint
#defineucharunsignedchar
intxx=0;
//sbitkey=P2^0;
charcodeseg[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
charcodeduan[4]={0x01,0x02,0x04,0x08};
charnum[4]={16,16,16,16};
voiddelay_ms(unsignedcharms)
{
inti;
intj;
for(i=0;i{for(j=0;j<120;j++);
}
}
unsignedcharkeyscan()
{
ucharn,key,key_r,key_c;
n=20;
P3=0xf0;
key_c=P3;
key_c=key_c&0xf0;
if(key_c!
=0xf0)
{
delay_ms(10);
if(key_c!
=0xf0)
{
key_c=key_c|0x0f;
P3=key_c;
key_r=P3;
key_r=key_r&0x0f;
key_c=key_c&0xf0;
key=key_c+key_r;
}
switch(key)
{
case0xEE:
n=0;break;
case0XDE:
n=1;break;
case0XBE:
n=2;break;
case0X7E:
n=3;break;
case0XED:
n=4;break;
case0XDD:
n=5;break;
case0XBD:
n=6;break;
case0X7D:
n=7;break;
case0XEB:
n=8;break;
case0XDB:
n=9;break;
case0XBB:
n=10;break;
case0X7B:
n=11;break;
case0XE7:
n=12;break;
case0XD7:
n=13;break;
case0XB7:
n=14;break;
case0X77:
n=15;break;
case0x37:
n=16;break;
default:
break;
}
delay_ms(200);
}
returnn;
}
voiddisplay()
{
chari,j;
for(i=3;i>=0;i--)
{
P2=duan[i];
j=num[i];
if(j!
=16)
{
P0=seg[j];
delay_ms(10);
}
}
}
voidmain()
{
chari,k;
begain:
P0=seg[0];
P2=0x01;//初始化显示
for(i=0;i<4;i++)
{
num[i]=16;
}
do
{i=keyscan();}
while(i==20);//等待按键
while
(1)
{
if(i!
=20)
{
if(i==16)
{
do
{i=keyscan();}
while(i==16||i==15||i==14);//等待按键松手
gotobegain;//E、F键同时按下进入初始化
}
for(k=3;k>0;k--)
{
num[k]=num[k-1];
}
num[0]=i;
}
display();
i=keyscan();
}
}
实验三中断
#include
sbityell=P2^0;
sbitgree=P2^1;
sbitred=P2^2;
voiddelay(intms)
{
inti,j;
for(i=0;ifor(j=0;j<240;j++);
}voidmain()
{IE=0x85;
IP=0x04;
TCON=0x05;
while
(1)
{
yell=~yell;
delay(200);
}
}
voidintt0()interrupt0
{
chari;
yell=1;
red=0;
gree=1;
for(i=0;i<10;i++)
{
delay(200);
red=~red;
}
red=1;
}
voidintt1()interrupt2
{
chari;
yell=1;
gree=0;
red=1;
for(i=0;i<10;i++)
{
delay(200);
gree=~gree;
}
gree=1;
}
实验四串行口通信
发送
#include
voidmain()
{
TMOD=0X20;//串口工作于方式1,定时器1工作于方式2
TH1=0XFA;
TL1=0XFA;
SCON=0x50;//不倍增,波特率4800
PCON=0;
TR1=1;
while
(1)
{
SBUF=P1;
while(TI==0);
TI=0;
}
}
接收
#include
voidmain()
{
TMOD=0X20;//串口工作于方式1,定时器1工作于方式2
TH1=0XFA;
TL1=0XFA;
SCON=0x50;//不倍增,波特率4800
PCON=0;
TR1=1;
while
(1)
{
P2=SBUF;
while(RI==0);
RI=0;//接受
}
}
实验六步进马达
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeTAB[]=
{
0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
};
sbitgo=P3^0;
sbitback=P3^1;
sbitfast=P0^2;
sbitslow=P0^3;
sbitstop=P3^4;
ucharN=10;
voidDelay(uintms)
{
uchari;
while(ms--)
{
for(i=0;i<120;i++);
}
}
voidSETP_MOTOR_GO(charN)//正传
{
ucharj;
for(j=0;j<8;j++)
{
if(back==0||stop==0)
break;
P1=TAB[j];
Delay(N);
}
}
voidSETP_MOTOR_BACK(charN)//反转
{
ucharj;
for(j=8;j>0;j--)
{
if(go==0||stop==0)
break;
P1=TAB[j];
Delay(N);
}
}
voidmain()
{
IE=0X85;
TCON=0X05;
P3=0xff;
while
(1)
{
if(go==0)
{
while(back==1&&stop==1)
{
P0=0xfe;
SETP_MOTOR_GO(N);
}
}
else
if(back==0)
{
while(go==1&&stop==1)
{
P0=0xfd;
SETP_MOTOR_BACK(N);
}
}
else
{
P0=0xef;
P1=0x03;
}
}
}
voidintfast()interrupt0//减速程序
{
IE=0;//关中断
N++;
if(N>20)
N=20;
fast=0;
Delay(50);
IE=0X85;//打开中断
}
voidintslow()interrupt2//加速程序
{
IE=0;
N--;
if(N<=1)
N=1;
slow=0;
Delay(50);
IE=0X85;
}
实验七倒计时60
#include
sbitkey=P1^0;
sbitrst=P1^1;
sbitled=P1^7;
charcodeseg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedintnum=0,second=60;
voiddelay(unsignedcharms)
{
unsignedchari,j;
for(i=0;i{
for(j=0;j<120;j++);
}
}
voidmain()
{
begain:
second=60;
IE=0X8A;//开定时器0
TMOD=0X21;//设置为模式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=0;//开始计数
while
(1)
{
if(key==0)
{
TR0=~TR0;//停止开始计数切换
//delay(10);
while(key==0);//等待松手
}
if(rst==0)
{
gotobegain;
}
P2=0x01;
P0=seg[second/10];
delay(20);
P2=0x02;
P0=seg[second%10];
delay(20);//显示
}
}
voidT0_1(void)interrupt1
{
TH0=(65636-50000)/256;
TL0=(65636-50000)%256;//重新赋值
num++;
if(++num==20)
{led=~led;
num=0;
second--;
if(second==0)
{
second=60;
}
}
}
实验八LED动态扫描
#include
codecharright[8]={0x18,0x3C,0x7E,0xFF,0x3C,0x3C,0x3C,0x3C};
codecharleft[8]={0x3C,0x3C,0x3C,0x3C,0xFF,0x7E,0x3C,0x18};
codecharup[8]={0x3C,0x3C,0x3C,0x3C,0xFF,0x7E,0x3C,0x18};
codechardown[8]={0x18,0x3C,0x7E,0xFF,0x3C,0x3C,0x3C,0x3C};
sbitupkey=P3^0;
sbitdownkey=P3^1;
sbitleftkey=P3^2;
sbitrightkey=P3^3;
voiddelay(charms)
{
chari,j;
for(i=0;i{
for(j=0;j<120;j++);
}
}
voidrightmove(charms)
{
charx,y,i,j;
x=0x80;
for(j=0;j<=8;j++)
{
y=x;
for(i=0;i<9;i++)
{
P2=y;
P1=~right[i];
y=2*y;
delay(10);
}
P1=0xff;
P2=0;
x=x/2;
delay(ms);
}
}
voidleftmove(charms)
{
charx,y,i,j;
x=1;
for(j=0;j<=8;j++)
{
y=x;
for(i=0;i<9;i++)
{
P2=y;
P1=~left[i];
y=2*y;
delay(10);
}
P1=0xff;
P2=0;
x=2*x;
delay(ms);
}
}
voidupmove(charms)
{
charx,y,i,j;
x=1;
for(j=0;j<=8;j++)
{
y=x;
for(i=0;i<9;i++)
{
P1=~y;
P2=up[i];
y=2*y;
delay(10);
}
P2=0xff;
P2=0;
x=2*x;
delay(ms);
}
}
voiddownmove(charms)
{
charx,y,i,j;
x=0x80;
for(j=0;j<=8;j++)
{
y=x;
for(i=0;i<9;i++)
{
P1=~y;
P2=down[i];
y=2*y;
delay(10);
}
P2=0xff;
P2=0;
x=x/2;
delay(ms);
}
}
voidmain()
{
while
(1)
{
if(upkey==0)
{
while(downkey==1&leftkey==1&rightkey==1)
upmove(10);
}
if(downkey==0)
{
while(upkey==1&leftkey==1&rightkey==1)
downmove(10);
}
if(leftkey==0)
{
while(downkey==1&upkey==1&rightkey==1)
leftmove(10);
}
if(rightkey==0)
{
while(downkey==1&leftkey==1&upkey==1)
rightmove(10);
}
}
}