51单片机入门实验及示例程序.docx
- 文档编号:8182687
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:17
- 大小:93.67KB
51单片机入门实验及示例程序.docx
《51单片机入门实验及示例程序.docx》由会员分享,可在线阅读,更多相关《51单片机入门实验及示例程序.docx(17页珍藏版)》请在冰豆网上搜索。
51单片机入门实验及示例程序
实验题
1、由按键S1产生外部中断1,S1按一次L0、L2、L4、L6亮,再按一次L1、L3、L5、L7亮。
2、由按键S1产生外部中断1控制T0启停,T0产生100ms定时,使4个数码管循环显示0中的一段,每段显示时间为1S。
3、T1工作于方式2,产生250uS精确定时,产生0~9秒计时,并显示在数码管上。
4、串口工作于方式1,波特率为9600bps,当单片机收到PC机串口发来的任何字符,都立刻转发给PC。
5、串口工作于方式1,波特率为9600bps,当单片机收到PC机串口发来的‘0’~‘9’,回送0~9,当收到‘a’~‘z’时回送‘A’~‘Z’。
6、串口工作于方式1,波特率为9600bps,当单片机收到PC机串口发来的‘1’,回送字符串“Start”,并启动T0产生1S的方波控制L0~L7闪烁,当收到‘2’时回送字符串“Stop”,并停止控制L0~L7。
7、串口工作于方式1,波特率为9600bps,当单片机收到PC机串口发来的‘Start’,回送字符串“Ok1”,并启动T0产生1S的方波控制L0~L7闪烁,当收到‘Stop’时回送字符串“Ok2”,并停止控制L0~L7。
8、当S1工作于独立按键方式时(需考虑按键抖动,软件滤波),按第1次,L0~L3以0.5秒为周期闪烁,串口以9600bps波特率发送字符‘1’一次,按第2次,L4~L7以1秒为周期闪烁,串口以9600bps波特率发送字符‘2’一次,按第3次,L0~L7以2秒为周期闪烁,串口以9600bps波特率发送字符‘3’一次。
再按一次回到第一次的模式,如此循环。
本人自己写的示例程序,验证可用,仅供参考学习用:
附部分原理图:
1、
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitP33=P3^3;
sbitP35=P3^5;
bitflag=1;
voiddelay_115(intx)//延时函数
{
inti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
voidmain()
{
EA=1;//中断总允许位
IT1=0;//设置外部中断1的触发方式为电平触发
EX1=1;//开外部中断
P35=0;
P1=0xaa;//初始化P1,方法二中必须写这句
while
(1);
}
voidt1_115()interrupt2
{
/*delay_115(20);//按键消抖
while(!
P33);//当松开按钮时程序才往下执行,否则一直停留在此处
delay_115(20);//按键消抖*/
//方法一:
/*if(P1==0x55)
P1=0xaa;
else
P1=0x55;*/
//方法二:
(若使用方法二则给P1初始化为0xaa或0x55)
//P1=~P1;//取反
if(P33==0)
{
delay_115(15);
if(P33==0)
{
if(flag)
{
P1=~P1;
flag=0;
}
}
else
{
//key=0;
flag=1;
}
}
else
{
//key=0;
flag=1;
}
}
2、
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitP33=P3^3;
sbitP35=P3^5;
ucharcount_115=0;
voiddelay_115(intx)//延时函数
{
inti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
voidmain()
{
uchartemp_115=0xfe;
EA=1;//中断总允许位
TMOD=0x01;//设置T0的工作方式为方式1
IT1=0;//设置外部中断1的触发方式为电平触发
EX1=1;//开外部中断
ET0=1;//开定时器T0
TR0=1;//定时器T0启动
TH0=0x3C;//设置初值
TL0=0xB0;
P35=0;
P0=0x10;//打开4位数码管
while
(1)
{
if(count_115==20)//该变量每50ms加1,当count_115等于20时,即时间间隔为1s
{
count_115=0;//将计数变量重置为0,以便开始下1s的定时
P1=temp_115;
temp_115=temp_115<<1;//左移一位
temp_115=temp_115+0x01;//最低位补1
}
if(temp_115==0xbf)//由于只需要点亮最外圈的六个管子,故此处重置temp_115为0xfe
temp_115=0xfe;
}
}
voidt0_115()interrupt1
{
TH0=0x3C;//装入初值此处为50ms执行一次中断
TL0=0xB0;
count_115++;//每执行一次中断,该变量加1
}
voidt1_115()interrupt2
{
delay_115(20);//按键消抖
while(!
P33);//当松开按钮时程序才往下执行,否则一直停留在此处
delay_115(20);//按键消抖
TR0=~TR0;//暂停或启动定时器T0
}
3、此题过于简单,略。
。
。
4、
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharthedata;
bitflag;
voidmain()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
//SM0=0;
//SM1=1;
//REN=1;
SCON=0x50;
EA=1;
ES=1;
while
(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=thedata;
while(!
TI);
TI=0;
ES=1;
}
}
}
voidserial()interrupt4
{
thedata=SBUF;
RI=0;
flag=1;
}
5、
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharthedata;
bitflag;
voidmain()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
//SM0=0;
//SM1=1;
//REN=1;
SCON=0x50;
EA=1;
ES=1;
while
(1)
{
if(flag==1)
{
ES=0;
flag=0;
if(thedata>=48&&thedata<=57)
thedata-=48;
if(thedata>=97&&thedata<=122)//根据ascii值判断是否接收到了'a'-'z'
thedata-=32;//将小写字母转换成大写ascii值差32
SBUF=thedata;
while(!
TI);
TI=0;
ES=1;
}
}
}
voidserial()interrupt4
{
thedata=SBUF;
RI=0;
flag=1;
}
6、
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcount=0;
uchartemp;
uchar*thedata;
bitflag;
voidmain()
{
uchari;
TMOD=0x21;
TH0=0x3C;
TL0=0xB0;
TH1=0xfd;
TL1=0xfd;
TR1=1;
//TR0=1;
SCON=0x50;
EA=1;
ET0=1;
ES=1;
while
(1)
{
if(flag==1)
{
ES=0;
flag=0;
if(temp=='1')
{
TR0=1;
thedata="Start";
}
if(temp=='2')
{
TR0=0;
thedata="Stop";
}
//for(i=0;i<5;i++)
while(*thedata)
{
//SBUF=thedata[i];
SBUF=*thedata;
while(!
TI);
TI=0;
thedata++;
}
ES=1;
}
if(count==20)
{
count=0;
P1=~P1;
}
}
}
voidt0()interrupt1
{
TH0=0x3C;
TL0=0xB0;
count++;
}
voidserial()interrupt4
{
temp=SBUF;
RI=0;
flag=1;
}
7、
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
uchari;
ucharcount=0;
uchardata_count=0;
ucharreceive[8]="\0\0";
ucharsend_Ok1[]="Ok1\n";
ucharsend_Ok2[]="Ok2\n";
ucharStart[]="Start";
ucharStop[]="Stop";
ucharflag;
voidmain()
{
TMOD=0x21;
TH0=0x3C;
TL0=0xB0;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
EA=1;
ET0=1;
ES=1;
while
(1)
{
if(flag==1)
{
ES=0;
flag=0;
TR0=1;
data_count=0;
for(i=0;i<4;i++)
{
SBUF=send_Ok1[i];
while(!
TI);
TI=0;
}
ES=1;
}
if(flag==2)
{
ES=0;
flag=0;
TR0=0;
data_count=0;
for(i=0;i<4;i++)
{
SBUF=send_Ok2[i];
while(!
TI);
TI=0;
}
ES=1;
}
if(count==20)
{
count=0;
P1=~P1;
}
}
}
voidt0()interrupt1
{
TH0=0x3C;
TL0=0xB0;
count++;
}
voidserial()interrupt4
{
if(RI)
{
RI=0;
receive[data_count]=SBUF;
if(strcmp(receive,Start)==0)
{
flag=1;
for(i=0;i<8;i++)
receive[i]='\0';
}
if(strcmp(receive,Stop)==0)
{
flag=2;
for(i=0;i<8;i++)
receive[i]='\0';
}
data_count++;
}
}
8、
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcount=0,NUM=10;
sbitP33=P3^3;
sbitP35=P3^5;
voiddelay(intx)
{
intm,n;
for(m=x;m>0;m--)
for(n=110;n>0;n--);
}
voidmain()
{
uchari=1;
TMOD=0x21;
TH0=0x3C;
TL0=0xB0;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
EA=1;
ET0=1;
ES=1;
P35=0;
P1=0x00;
while
(1)
{
if(P33==0)
{
delay(20);
if(P33==0)
{
P1=0xff;
if(i==1)
{
count=0;
NUM=10;
SBUF='1';
while(!
TI);
TI=0;
i++;
}
elseif(i==2)
{
NUM=20;
SBUF='2';
while(!
TI);
TI=0;
i++;
}
else//if(i==3)
{
NUM=40;
ES=0;
SBUF='3';
while(!
TI);
TI=0;
ES=1;
i=1;
}
TR0=1;
}
while(!
P33);
delay(20);
}
}
}
voidt0()interrupt1
{
TH0=0x3C;
TL0=0xB0;
count++;
if(count==NUM)
{
count=0;
if(NUM==10)
P1=~P1+0xf0;
elseif(NUM==20)
P1=~P1+0x0f;
else//if(NUM==40)
P1=~P1;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 入门 实验 示例 程序