单片机C语言实训报告.docx
《单片机C语言实训报告.docx》由会员分享,可在线阅读,更多相关《单片机C语言实训报告.docx(29页珍藏版)》请在冰点文库上搜索。
单片机C语言实训报告
单片机C语言实训报告
专业:
电子信息工程技术
姓名:
班级学号:
指导教师:
成绩:
实训时间:
2012-5-14—2012-5-28
摘要:
近年来,随着单片机制造技术的飞速发展及其开发条件的普及,“软件就是硬件”已成为一件平凡的事情,用一片体积很小的单片机替代复杂而庞大的传统数字电路和模拟电路也成为电子产品开发的趋势。
而《单片机原理与应用》是一门理论性与实践性较强的专业课程,对学生培养单片机开发与应用能力有着重要的作用。
实训环节是对课程理论的巩固,也是学生掌握课程核心内容的一种有效途径和方式,通过实训可以使学生对单片机项目的开发流程、熟悉掌握单片机的硬件设计及软件编程。
关键词:
学生、软件编程、软件就是硬件
目录
摘要................................................................2
关键词..............................................................2
目录.............................................................3
1.1单片机最小系统的制作............................................4
2.1编程实现流水灯..................................................4
2.2流水灯的程序流程图..............................................4
2.3流水灯的程序代码及分析..........................................4
3.1数码管显示学号..................................................5
3.2数码管显示的程序流程图..........................................5
3.3数码管显示的程序代码及分析......................................5
4.1按键编码........................................................6
4.2按键编码的程序流程图............................................6
4.3按键编码的程序代码及分析........................................6
5.1制作时钟........................................................8
5.2制作时钟的程序流程图............................................8
5.3制作时钟的程序代码及分析........................................9
6.1制作闹钟.......................................................12
6.2制作闹钟的程序流程图...........................................12
6.3制作闹钟的程序代码及分析.......................................12
7.1光照检测.......................................................16
7.2光照检测的程序流程图...........................................16
7.3光照检测的程序代码及分析.......................................16
总结………………………………………………………………………………….19
参考文献........................................................19
致谢.............................................................19
1.1单片机最小系统的制作:
单片机最小系统指的是能单独运行的最简单系统,它包括5V电源、晶振电路、行列式键盘、数码管显示等。
而单片机最小系统的制作主要是按照老师发的元器件在规定的时间内焊接完成。
2.1编程实现流水灯:
即通过编程实现LED逐个单独点亮,若L1亮其它灭→L2亮其它灭→L3亮其它灭…L8亮其它灭→L1亮其它灭。
2.2流水灯的程序流程图,如下图1所示:
图1
2.3流水灯程序代码及分析:
#include
/***********/
voiddelay(void)
{
unsignedintn;
for(n=0;n<30000;n++);
}
/******************/
voidmain(void)
{
unsignedchari;
while
(1)
{
P0=0xfe;
delay();for(i=0;i<8;i++)
{
P0=P0<<1;P0++;
delay();
}
}
}
程序性能分析:
将流水灯程序下载进单片机,使LED灯延迟左移逐个逐个的点亮,LED从L1、L2…L8、L1循环逐个点亮,就LED灯在流动。
3.1数码管显示学号:
即使用动态扫描的方式在实验板的LED数码管上显示本人学号的后四位。
3.2数码管显示的程序流程图,如下图2所示:
图2
3.3数码管显示的程序代码及分析:
//数码管显示学号“0714”
#include
/****************/
voiddelay(void)
{
unsignedchari;for(i=0;i<200;i++);
}
/***************/
voidmain(void)
{
while
(1){
P1=0xfe;P0=0x99;delay();
P1=0xfd;
P0=0xf9;delay();
P1=0x7b;P0=0xf8;delay();
P1=0xf7;P0=0xc0;
delay();
P1=0xff;
}
}
程序性能分析:
先点亮1号LED数码管,使其显示数字7,短暂延时,点亮下一位数码管显示数字1,再短暂延时点亮下一位显示数字7,最后点亮的是显示0的,每次只点亮1个LED数码管,当延时足够短时,就会显示数字0714的字样。
4.1按键编码:
对单片机最小系统上4X4的行列式键盘进行编码,然后用数码管显示按下的按键。
比如按下2号按键,则在数码管上显示02,按下11号按键,在数码管上显示11。
4.2按键编码的程序流程图,如下图3为显示子流程图,图4为矩阵键盘扫描子程序流程图:
图3图4
4.3按键编码的程序代码及分析:
//矩阵式键盘按键值的数码管显示
#include
sbitP20=P2^0;
sbitP21=P2^1;
sbitP22=P2^2;
sbitP23=P2^3;
sbitsound=P1^7;
unsignedcharcode
Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsignedcharkeyval;
unsignedchara;
/*************/
voidled_delay(void)
{
unsignedintj;for(j=0;j<900;j++);
}
/*************/
voiddisplay(unsignedintk)
{
P1=0xfe;P0=Tab[k%10];led_delay();
P1=0xfd;P0=Tab[k/10];
led_delay();
}
/*************/
voiddelayms(void)
{
unsignedchari;for(i=0;i<255;i++);
}
/*********************/
voidmain(void)
{
EA=1;ET0=1;TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;TR0=1;keyval=0x00;
while
(1)
{
display(keyval);
}
}
/********/
voidT0_ms(void)interrupt1
{
TR0=0;P2=0x0f;if((P2&0x0f)!
=0x0f)delayms();if((P2&0x0f)!
=0x0f)
{
P2=0xef;if(P20==0)keyval=1;if(P21==0)keyval=2;if(P22==0)keyval=3;if(P23==0)
keyval=4;
P2=0xdf;if(P20==0)keyval=5;if(P21==0)keyval=6;if(P22==0)keyval=7;if(P23==0)keyval=8;
P2=0xbf;if(P20==0)keyval=9;if(P21==0)keyval=10;if(P22==0)keyval=11;if(P23==0)keyval=12;
P2=0x7f;if(P20==0)keyval=13;if(P21==0)keyval=14;if(P22==0)keyval=15;if(P23==0)keyval=16;for(a=0;a<50;a++)
{
sound=0;delayms();
}
}
TR0=1;TH0=(65536-500)/256;TL0=(65536-500)%256;
}
程序性能分析:
使用定时器T0中断方式1扫描按键来获取按键码,通过显示函数在LED数码管上显示出获取的按键码。
5.1制作时钟:
即基于单片机定时器或者RTC制作一个时钟,4个LED数码管使用动态扫描的方式显示时间,前两位显示小时,后两位显示分钟,4个点用来显示秒,每两秒闪烁一次。
5.2制作时钟的程程图如下图6所示:
序流程图,按键子程序流程图如下图5所示,时间计算程序流
图5图6
5.3制作时钟的程序代码及分析:
//制作时钟
#include
unsignedcharcodeTab[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsignedcharint_time,s=0;
unsignedcharsecond;
unsignedcharminute;
unsignedcharhour;
sbitS1=P2^0;
sbitS2=P2^1;
sbitS3=P2^2;
/*******************/
voiddelay(void)
{
unsignedcharj;
for(j=0;j<200;j++);
}
/**************/
voiddelay50ms(void)
{
unsignedchari,j;
for(i=0;i<150;i++)for(j=0;j<166;j++);
}
/**********/
voidDisplaySecond()
{
P1=0xf0;
if(s<20)
P0=0x7f;
else
P0=0xff;
if(s==40)
s=0;
delay();
}
/**************/
voidDisplayMinute(unsignedcharm)
{
P1=0xfd;P0=Tab[m/10];
delay();
P1=0xfe;
P0=Tab[m%10];
delay();
P1=0xff;
}
/**************/
voidDisplayHour(unsignedcharh)
{
P1=0xf7;
P0=Tab[h/10];
delay();
P1=0xfb;P0=Tab[h%10];
delay();
P1=0xff;
}
/*******************/
voidkey_scan(void)
{
P2=0x0f;if((P2&0x0f)!
=0x0f)
{
delay50ms();
if((P2&0x0f)!
=0x0f)
{
if(S1==0)
{
minute++;
while(S1!
=S1)
}
if(S2==0)
{
hour++;
while(S2!
=S2)
}
if(S3==0)
{
second=0;
minute=0;
hour=0;
while(S3!
=S3)
}
}
}
}
/***********/
voidmain(void)
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
TR0=1;
int_time=0;
second=0;
minute=0;
hour=0;
while
(1)
{
DisplaySecond();DisplayMinute(minute);DisplayHour(hour);
}
}
/*************/
voidinterserve(void)interrupt1using1
{
TR0=0;
int_time++;
if(int_time==20)
{
int_time=0;second++;
}
if(second==60)
{
second=0;minute++;}
if(minute==60)
{
minute=0;hour++;
}
if(hour==24)
{
hour=0;
}
s++;
key_scan();TH0=(65536-46083)/256;TL0=(65536-46083)%256;
TR0=1;
}
程序性能分析:
设置50ms定时器T0中断计时,用while循环不断地扫描调用秒的显示子函数、分的显示子函数、时的显示子函数、按键子函数,将时分秒通过短暂的延时,交替显示在LED数码管上,当时间足够短时,我们看到的就是一个小数点过两秒就闪烁一次的时钟,另外通过按键还可以不断设置时间。
6.1制作闹钟:
在时钟的基础上制作一个简单闹钟,当当时时间和设定的闹钟时间相同时,蜂鸣器鸣叫,只有当有人按键时,蜂鸣器才停止鸣叫。
闹钟的时间通过按键设置。
6.2制作闹钟的程序流程图,其主函数程序流程图如下图7所示:
图7
6.3制作闹钟的程序代码及分析:
//制作闹钟
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitshezhi=P2^0;
sbitmoshi=P2^3;
sbitjia=P2^1;
sbitjian=P2^2;
sbitdi=P2^4;
sbitsounder=P1^7;
ucharzhuan,key,ns,nf,shi,fen;
ucharcount,xs,xf,miao;
ucharcodeyima[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
/****************/
voiddianshi()
{
ET0=1;
EA=1;TMOD=0x01;TH0=(65536-46083)/256;
TL0=(65536-46083)%256;TR0=1;}
/**************/
voiddelayms(uintx)
{
uinti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/***********************/
voiddisplay()
{
if(key==0||key==1||key==2)
{
xs=shi;
xf=fen;
}
if(key==3||key==4)
{
xs=ns;
xf=nf;
}
P1=0xfe;P0=yima[xf%10];delayms(3);
P1=0xfd;
P0=yima[xf/10];
delayms(3);
P1=0xfb;
P0=yima[xs%10];
delayms(3);
P1=0xf7;
P0=yima[xs/10];
delayms(3);
}
/***********/
voidchangtime()
{
if(key==1)
{
if(jia==0)
{
shi++;
if(shi==24)
shi=0;while(!
jia);
}
if(jian==0)
{
if(shi==0)
shi=24;
shi--;
while(!
jian);
}
}
if(key==2)
{
if(jia==0)
{
fen++;
if(fen==60)
fen=0;
while(!
jia);
}
if(jian==0)
{
if(fen==0)
fen=60;
fen--;
while(!
jian);
}
}
if(key==3)//{
if(jia==0)
{
ns++;
if(ns>=24)ns=0;
while(!
jia);
}
if(jian==0)
{
if(ns==0)
ns=24;
ns--;
while(!
jian);
}
}
if(key==4){
if(jia==0)
{
nf++;
if(nf==60)
nf=0;
while(!
jia);
}
if(jian==0)
{
if(nf==0)
nf=60;
nf--;
while(!
jian);
}
}
if(key>=5);
}
/**********************/
voidT0_ms(void)interrupt1using0
{
count++;
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;if(count==20){
count=0;
miao++;
if(miao>=59){
miao=0;
fen++;
if(fen>=60)
{
fen=0;
shi++;
if(shi>=24)
shi=0;
}
}
}
if(ns==shi&&nf<=fen)
{
sounder=0;
if(jian==0)ns=24;
}
}
/*******************/
voidmain(void)
{
di=0;
ns=24;
jian=1;
dianshi();
while
(1)
{
if(miao%2==0)
{
P1=0xf0;
P0=0x7f;
delayms(3);
}
display();
changtime();
if(shezhi==0)
{
sounder=1;
zhuan=~zhuan;
while(!
shezhi);
key=0;
while(zhuan)
{
display();
if(shezhi==0)
{
zhuan=~zhuan;
key=0;
while(!
shezhi);
}
if(moshi==0)
{
key++;
while(!
moshi);
}
changtime();
}
}
}
}
程序性能分析:
使用定时器T0的定时方式1进行中断计时,且在中断中进行判断闹钟时间是否到与产生闹铃。
有按键按下,闹铃就会停止,若没人按下,闹钟将响1小时才停。
7.1光照检测:
焊接调试光照检测电路,并使用AD转换器对光照度的输出进行采集,然后用LED显示。
7.2光照检测的程序流程图,如图8所示:
图8
7.3光照检测的程序代码及分析:
#include
#defineuintunsignedint
#defineucharunsignedchar
Ucharcode
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
ucharbuf[4]={0,0,0,0};
sbitCS=P1^6;sbitDI=P2^0;
sbitDO=P2^1;
sb