期中考试单片机程序.docx
- 文档编号:30706656
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:75
- 大小:295.58KB
期中考试单片机程序.docx
《期中考试单片机程序.docx》由会员分享,可在线阅读,更多相关《期中考试单片机程序.docx(75页珍藏版)》请在冰豆网上搜索。
期中考试单片机程序
1闪烁发光二极管
#include
sbitp1=P1^0;
voiddelay(void)
{
unsignedinti,j,k;
for(i=255;i>0;i--)
{
for(j=255;j>0;j--)
{
for(k=2;k>0;k--);
}
}
}
voidmain()
{
while
(1)
{
P1=1;
delay();
P1=0;
delay();
}
}
2定时器
#include
sbitp1_2=P1^2;
voidmain()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
while
(1)
{
if(TF0==1)
{
TF0=0;
p1_2=!
p1_2;
TH0=0x3c;
TL0=0xb0;
}
}
}
3定时器
(2)
①模式0
#include
sbitp1_2=P1^2;
voidmain()
{
TMOD=0x00;
TH0=0x63;
TL0=0x18;
TR0=1;
while
(1)
{
if(TF0==1)
{
TF0=0;
p1_2=!
p1_2;
TH0=0x63;
TL0=0x18;
}
}
}
图见上图
②模式2
#include
sbitp1_2=P1^2;
voidmain()
{
TMOD=0x02;
TH0=0x9c;
TL0=0x9c;
TR0=1;
while
(1)
{
if(TF0==1)
{
TF0=0;
p1_2=!
p1_2;
}
}
}
4定时器(3)
①GATE位
#include
voidmain()
{
unsignedintcou=0;
P1=0;
P2=0;
P3=0;
TMOD=0x09;//T0门控卫,定时器
TH0=0xfc;
TL0=0x18;
TR0=1;
while
(1)
{
if(TF0==1)
{
TF0=0;
cou+=1;
TH0=0xfc;
TL0=0x18;
}
P2=cou;
P1=cou>>8;
}
}
图见上图
②定时1S(模式0)
#include
sbitp1_2=P1^2;
voidmain()
{
unsignedcharcou=0;
TMOD=0x00;
TH0=0x63;
TL0=0x18;
TR0=1;
while
(1)
{
if(TF0==1)
{
TF0=0;
cou+=1;
TH0=0x63;
TL0=0x18;
}
if(cou==200)
{
p1_2=!
p1_2;
cou=0;
}
}
}
图见上图
③定时1S(模式1)
#include
sbitp1_2=P1^2;
voidmain()
{
unsignedcharcou=0;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
while
(1)
{
if(TF0==1)
{
TF0=0;
TH0=0x3c;
TL0=0xb0;
cou+=1;
}
if(cou==20)
{
p1_2=!
p1_2;
cou=0;
}
}
}
图见上图
④定时1S(模式2)
#include
sbitp1_2=P1^2;
voidmain()
{
unsignedintcou=0;
TMOD=0x02;
TH0=0x9c;
TL0=0x9c;
TR0=1;
while
(1)
{
if(TF0==1)
{
TF0=0;
cou+=1;
}
if(cou==10000)
{
cou=0;
p1_2=!
p1_2;
}
}
}
图见上图
⑤计数器
#include
voidmain()
{
P1=0;
P2=0;
TMOD=0x05;//T0模式2,计数器
TH0=0;
TL0=0;
TR0=1;
while
(1)
{
P2=TL0;
P1=TH0;
}
}
5中断
(2)
①定时器中断
#include
sbitp2_0=P2^0;
voiddelay()
{
unsignedchari,j;
for(i=0;i<2;i++)
{
for(j=0;j<1;j++);
}
}
voidtime0()interrupt1//定时器0中断响应函数
{
//delay();
TL0=0x18;
TH0=0xfc;
p2_0=!
p2_0;
}
voidmain()
{
//设定定时器
TMOD=0x01;
TL0=0x18;
TH0=0xfc;
TR0=1;
//打开中断
EA=1;
ET0=1;
while
(1)
{
}
}
②外部中断(边沿触发)
#include
unsignedchartemp;
voidint0()interrupt0
{
temp++;
P1=temp;
}
voidmain()
{
temp=0;
P1=temp;//P1口置0
IT0=1;//设置触发方式为边沿触发
EX0=1;//开INT0中断
EA=1;//开所有中断
while
(1);
}
③外部中断(电平触发)
#include
unsignedchartemp;
voiddelay()
{
unsignedchari,j,k,l;
for(i=0;i<255;i++)
{
for(j=0;j<255;j++)
{
for(k=0;k<20;k++);
}
}
}
voidint0()interrupt0
{
//delay();
temp++;
P1=temp;
}
voidmain()
{
temp=0;
P1=temp;//P1口置0
IT0=0;//设置触发方式为低电平触发
EX0=1;//开INT0中断
EA=1;//开所有中断
while
(1);
}
图见上图
④中断思考题
#include
unsignedchartemp;
unsignedcharcou;
sbitp3_2=P3^2;
voidint0()interrupt0
{
temp++;
P1=temp;
TR0=1;//开定时器0
}
voidt0()interrupt1
{
if(p3_2!
=0)//按键松开
{
TR0=0;//关闭定时器
cou=0;//计数器清零
}
else
{
TH0=0xd8;
TL0=0xf0;//定时时间10MS
if(cou==100)//10ms*100=1s
{
temp++;//按键次数+1
P1=temp;
cou=0;//计数器清零
}
else
{
cou++;
}
}
}
voidmain()
{
//设置定时器
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;//定时时间10MS
cou=0;
temp=0;
P1=temp;//P1口置0
IT0=1;//设置触发方式为边沿触发
ET0=1;//开定时器0中断
EX0=1;//开INT0中断
EA=1;//开所有中断
while
(1);
}
⑤中断思考题扩展
#include
unsignedchartemp;
unsignedcharcou;
unsignedcharfirsttime;
sbitp3_2=P3^2;
voidint0()interrupt0
{
temp++;
P1=temp;
firsttime=1;
TR0=1;//开定时器0
}
voidt0()interrupt1
{
if(p3_2!
=0)//按键松开
{
TR0=0;//关闭定时器
cou=0;//计数器清零
firsttime=0;//指示标志清零
}
else
{
TH0=0xd8;
TL0=0xf0;//定时时间50MS
if(firsttime==1)//首次连按
{
if(cou==100)//50ms*100=5s
{
temp++;
P1=temp;
cou=0;
firsttime=0;
}
else
{
cou++;
}
}
else//非首次连按
{
if(cou==10)//50ms*10=0.5s
{
temp++;
P1=temp;
cou=0;
}
else
{
cou++;
}
}
}
}
voidmain()
{
//设置定时器
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;//定时时间50MS
cou=0;
temp=0;
firsttime=0;
P1=temp;//P1口置0
IT0=1;//设置触发方式为边沿触发
ET0=1;//开定时器0中断
EX0=1;//开INT0中断
EA=1;//开所有中断
while
(1);
}
图见上图
6串行通信(3)
①串口模式0
发送(用164)
#include
voiddisplay(unsignedcharval)
{
SBUF=val;
while(TI==0);
TI=0;
}
voiddelay()
{
unsignedchari,j,k;
for(i=0;i<255;i++)
{
for(j=0;j<255;j++)
{
for(k=0;k<2;k++);
}
}
}
voidmain()
{
unsignedchari;
i=0;
SCON=0x00;
while
(1)
{
delay();
display(i);
P1=i;
i++;
}
}
接收(用164)
#include
voiddelay()
{
unsignedchari,j,k;
for(i=0;i<255;i++)
{
for(j=0;j<2;j++)
{
for(k=0;k<2;k++);
}
}
}
voidmain()
{
SCON=0x10;
while
(1)
{
while(RI==0);
delay();
RI=0;
P1=SBUF;
}
}
②应用
51与164
#include
voiddisplay(unsignedcharval)
{
SBUF=val;
while(TI==0);
TI=0;
}
voiddelay()
{
unsignedchari,j,k;
for(i=0;i<255;i++)
{
for(j=0;j<255;j++)
{
for(k=0;k<2;k++);
}
}
}
voidmain()
{
unsignedchari;
SCON=0x00;
i=0;
while
(1)
{
delay();
display(i);
i++;
}
}
用164做LED显示
用165做LED显示
③串口模式1带数据缓冲的串口模式1
之数据缓冲区
发送端
#include
voiddelay()
{
unsignedchari,j,k;
for(i=0;i<255;i++)
{
for(j=0;j<255;j++)
{
for(k=0;k<1;k++);
}
}
}
voidmain()
{
unsignedchari;
SCON=0x50;//设定串口为允许接收,模式1
TMOD=0x20;//定时器1工作在8位自重装模式
TH1=0xfd;//波特率为9600
TL1=0xfd;
TR1=1;//启动定时器
TI=0;//发送标志位置0
RI=0;//接收标志位置0
P1=0;
i=0;
while
(1)
{
delay();//减速
SBUF=i;
i++;
while(TI==0);
P1=i;
TI=0;
}
}
接收端
#include
unsignedcharbuf[100];//100字节数据缓冲区
unsignedcharp;
voiddelay()
{unsignedchari,j,k;
for(i=0;i<255;i++)
{
for(j=0;j<255;j++)
{
for(k=0;k<3;k++);
}
}
}
voiduart()interrupt4
{
buf[p]=SBUF;//接收数据放入缓冲区
p++;
RI=0;
if(p==100)//缓冲区循环利用
{
p=0;
}
}
voidmain()
{
unsignedchari;
p=0;
for(i=0;i<100;i++)
{
buf[i]=0xff;
}
SCON=0x50;
TMOD=0x20;//定时器1工作在模式2
TH1=0xfd;//波特率为9600
TL1=0xfd;
TR1=1;//启动定时器
RI=0;
ES=1;//开串行口中断
EA=1;//开总中断
i=0;
while
(1)
{
delay();//模拟低速数据处理过程
P1=buf[i];
i++;
}
}
带数据缓冲的串口模式1
之中断方式
发送端
#include
voidmain()
{
unsignedchari;
SCON=0x50;//设定串口为允许接收,模式1
TMOD=0x20;//定时器1工作在8位自重装模式
TH1=0xfd;//波特率为9600
TL1=0xfd;
TR1=1;//启动定时器
TI=0;//发送标志位置0
RI=0;//接收标志位置0
P1=0;
i=0;
while
(1)
{
i++;
SBUF=i;
while(TI==0);
P1=i;
TI=0;
}
}
接收端
#include
voiduart()interrupt4
{
P1=SBUF;
RI=0;
}
voidmain()
{
SCON=0x50;
TMOD=0x20;//定时器1工作在模式2
TH1=0xfd;//波特率为9600
TL1=0xfd;
TR1=1;//启动定时器
RI=0;
ES=1;//开串行口中断
EA=1;//开总中断
while
(1);
}
图见上图
发送和接收基础
发送端
#include
voiddelay()
{
unsignedchari,j,k;
for(i=0;i<255;i++)
{
for(j=0;j<255;j++)
{
for(k=0;k<10;k++);
}
}
}
voidmain()
{
unsignedchari;
SCON=0x50;//设定串口为允许接收,模式1
TMOD=0x20;//定时器1工作在8位自重装模式
TH1=0xfd;//波特率为9600
TL1=0xfd;
TR1=1;//启动定时器
TI=0;//发送标志位置0
RI=0;//接收标志位置0
P1=0;
i=0;
while
(1)
{
i++;
SBUF=i;
while(TI==0);
P1=i;
TI=0;
}
}
接收端
#include
voiddelay()
{
unsignedchari,j,k;
for(i=0;i<100;i++)
{
for(j=0;j<10;j++)
{
for(k=0;k<10;k++);
}
}
}
voidmain()
{
SCON=0x50;//设定串口为发送,模式1
TMOD=0x20;//定时器1工作在8位自重装模式
TH1=0xfd;//波特率为9600
TL1=0xfd;
TR1=1;//启动定时器
RI=0;//接收标志位置0
while
(1)
{
if(RI==1)
{
P1=SBUF;
RI=0;
//delay();//模拟接收端处理程序
}
}
}
图见上图
7LED与键盘
(1)
①74LS138
138的级联
#include
voiddelay()
{
unsignedchari,j,k;
for(i=0;i<255;i++)
{
for(j=0;j<255;j++)
{
for(k=0;k<1;k++);
}
}
}
voidmain()
{
unsignedchari;
i=0;
while
(1)
{
P2=i;
delay();
i++;
}
}
138
#include
sbitp2_3=P2^3;
unsignedcharpos;
unsignedcharxianshi[16];
unsignedcharleddata[]={
0xC0,//"0"
0xF9,//"1"
0xA4,//"2"
0xB0,//"3"
0x99,//"4"
0x92,//"5"
0x82,//"6"
0xF8,//"7"
0x80,//"8"
0x90,//"9"
};
unsignedcharposdata[]={
0x00,
0x01,
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
0x08,
0x09,
0x0a,
0x0b,
0x0c,
0x0d,
0x0e,
0x0f
};
voidtimer0()interrupt1
{
TL0=0x18;
TH0=0xfc;
if(pos==16)
{
pos=0;
}
P2=posdata[pos];//此语句必须在前,否则出错
P0=xianshi[pos];
pos++;
}
voidmain()
{
unsignedchari;
pos=0;
TMOD=0x01;
TL0=0x18;
TH0=0xfc;
ET0=1;
TR0=1;
EA=1;
xianshi[0]=leddata[2];
xianshi[1]=leddata[0];
xianshi[2]=leddata[1];
xianshi[3]=leddata[1]&0x7f;//如果是共阴极,应该是+
xianshi[4]=leddata[1];
xianshi[5]=leddata[0]&0x7f;
xianshi[6]=leddata[0];
xianshi[7]=leddata[1];
xianshi[8]=leddata[1];
xianshi[9]=leddata[9];
xianshi[10]=leddata[4];
xianshi[11]=leddata[9]&0x7f;//如果是共阴极,应该是+
xianshi[12]=leddata[1];
xianshi[13]=leddata[0]&0x7f;
xianshi[14]=leddata[0];
xianshi[15]=leddata[1];
while
(1);
}
②164实现静态锁存式LED显示
#include
unsignedcharxianshi[8];
unsignedcharleddata[]={
0xC0,//"0"
0xF9,//"1"
0xA4,//"2"
0xB0,//"3"
0x99,//"4"
0x92,//"5"
0x82,//"6"
0xF8,//"7"
0x80,//"8"
0x90,//"9"
};
voiddisplay()
{
unsignedchari;
for(i=0;i<8;i++)
{
SBUF=xianshi[i];
while(TI==0);
TI=0;
}
}
voidmain()
{
SCON=0x00;
xianshi[7]=leddata[2];
xianshi[6]=leddata[0];
xianshi[5]=leddata[1];//如果是共阴极,应该是+
xianshi[4]=led
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 期中考试 单片机 程序