实验内容及原理图.docx
《实验内容及原理图.docx》由会员分享,可在线阅读,更多相关《实验内容及原理图.docx(24页珍藏版)》请在冰豆网上搜索。
实验内容及原理图
说明:
(a)假如I/O管脚冲突,如此自行调整。
每组至少完成8个实验。
(b)每组根据自愿可自加实验内容1个〔例如:
数字电子钟、A/D转换、D/A转换、4x4矩阵键盘、8*8点阵、乐曲、温度采集、步进电机控制等〕,将电路元件参加其中,并编制软件调试。
(c)电路板在加工前一定要小组内仔细检查。
(d)建议每位同学搞清楚每个实验,切记不可抄袭。
(e)参考程序仅供参考。
表1端口分配表
参考供电电路:
实验一闪烁灯实验
1实验任务与原理图
如图1所示:
在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为1秒。
图1闪烁灯原理图
2C语言源程序
#include
sbitL1=P1^0;
{unsignedchari,j,k;//时间需要在keil中调试,这儿是随便给的循环次数
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
voidmain(void)
{while
(1)
{L1=0;delay02s();L1=1;delay02s();}
}
实验二模拟开关灯实验
1实验任务与原理图
如图2所示,监视开关K1〔接在P3.0端口上〕,用发光二极管L1〔接在单片机P1.0端口上〕显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
图2模拟开关灯原理图
2程序框图
3C语言源程序
#include
sbitK1=P3^0;
sbitL1=P1^0;
voidmain(void)
{
while
(1)
{
if(K1==0)
{
L1=0;//灯亮}
else
{
L1=1;//灯灭}
}
}实验3按键〔开关〕识别
1实验任务与原理图
实验任务如图3所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。
〔开关闭合,对应的灯亮,开关断开,对应的灯灭〕。
图3按键〔开关识别〕
2c语言程序
方法一〔C语言源程序〕
#include
unsignedchartemp;
voidmain(void)
{
while
(1)
{
temp=P1>>4;
temp=temp|0xf0;
P1=temp;
}
}
方法二〔C语言源程序〕
#include
voidmain(void)
{
while
(1)
{
if(P1_4==0)
{
P1_0=0;
}
else
{
P1_0=1;
}
if(P1_5==0)
{
P1_1=0;
}
else
{
P1_1=1;
}
if(P1_6==0)
{
P1_2=0;
}
else
{
P1_2=1;
}
if(P1_7==0)
{
P1_3=0;
}
else
{
P1_3=1;
}
}
}
实验4流水灯设计
1实验任务与原理图
让8个发光二极管按照一定顺序循环闪烁,时间间隔为1s。
用8芯排线连接到“八路发光二极管指示模块〞区域中的L1-L8端口上,要求:
P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。
图4流水灯〔广告灯〕设计
2程序框图
3c语言程序
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
说明
L8
L7
L6
L5
L4
L3
L2
L1
1
1
1
1
1
1
1
0
L1亮
1
1
1
1
1
1
0
1
L2亮
1
1
1
1
1
0
1
1
L3亮
1
1
1
1
0
1
1
1
L4亮
1
1
1
0
1
1
1
1
L5亮
1
1
0
1
1
1
1
1
L6亮
1
0
1
1
1
1
1
1
L7亮
0
1
1
1
1
1
1
1
L8亮
方法1〔左移或右移〕
#include
unsignedchari;
unsignedchartemp;
unsignedchara,b;
voiddelay(void)
{
unsignedcharm,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
voidmain(void)
{
while
(1)
{
temp=0xfe;
P1=temp;
delay();
for(i=1;i<8;i++)
{
a=temp<
b=temp>>(8-i);
P1=a|b;
delay();
}
for(i=1;i<8;i++)
{
a=temp>>i;
b=temp<<(8-i);
P1=a|b;
delay();
}
}
}
方法2〔数组方式〕
C语言源程序#include
unsignedcharcodetable[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,
0x00,0xff,0x00,0xff,
0x01};
unsignedchari;
voiddelay(void)
{unsignedcharm,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
voidmain(void)
{while
(1)
{if(table!
=0x01)
{P1=table;
i++;
delay();
}
else
{
i=0;
}
}
}
实验五报警器
1任务与原理图
用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进展,P1.7接一开关进展控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。
图5报警器电路〔请参考LM386资料〕
2程序框图
3c语言程序
#include
#include
bitflag;
unsignedcharcount;
voiddely500(void)
{
unsignedchari;
for(i=250;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();
}
}
}
实验六键盘防抖动与按键识别
1实验任务与原理图
每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。
图6键盘防抖动与按键识别
2程序框图
3C语言源程序#include
unsignedcharcount;
voiddelay10ms(void)
{
unsignedchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
voidmain(void)
{
while
(1)
{
if(P3_7==0)
{
delay10ms();
if(P3_7==0)
{
count++;
if(count==16)
{
count=0;
}
P1=~count;
while(P3_7==0);
}
}
}
}
实验7〔数码管应用〕
1任务与实验原理图
图7
2程序框图
3c语言程序
〔1.单片机对按键的识别的过程处理
〔2.单片机对正确识别的按键进展计数,计数满时,又从零开始计数;
〔3.单片机对计的数值要进展数码显示,计得的数是十进数,含有十位和个位,我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示。
如何拆开十位和个位我们可以把所计得的数值对10求余,即可得个位数字,对10整除,即可得到十位数字了。
〔4.通过查表方式,分别显示出个位和十位数字。
#include
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsignedcharCount;
voiddelay10ms(void)
{
unsignedchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
voidmain(void)
{
Count=0;
P0=table[Count/10];
P2=table[Count%10];
while
(1)
{
if(P3_7==0)
{
delay10ms();
if(P3_7==0)
{
Count++;
if(Count==100)
{
Count=0;
}
P0=table[Count/10];
P2=table[Count%10];
while(P3_7==0);
}
}
}
}
实验8定时计数器的应用
1实验任务与电路原理图
用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。
图8定时计数器的应用
2程序框图
3c语言程序
AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。
只要通过设置特殊功能存放器TMOD,即可完成。
定时/计数器何时工作也是通过软件来设定TCON特殊功能存放器来完成的。
现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。
对于这20次我们就可以采用软件的方法来统计了。
因此,我们设定TMOD=00000001B,即TMOD=01H
下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算出
TH0=〔216-50000〕 / 256
TL0=〔216-50000〕 MOD 256
当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON特殊功能存放器中的TF0标志位,如果TF0=1表示定时时间已到。
(1)C语言源程序〔查询法〕#include
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsignedcharsecond;
unsignedchartcount;
voidmain(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
tcount=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
while
(1)
{
if(TF0==1)
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
TF0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
}
}〔2〕C语言源程序〔中断法〕
#include
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsignedcharsecond;
unsignedchartcount;
voidmain(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
tcount=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
while
(1);
}
voidt0(void)interrupt1using0
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
实验9串口实验
1实验任务与原理图
实验十LCD1602显示实验
1实验任务与原理图
实验10LCD1602显示实验