单片机C语言实训报告.docx

上传人:b****8 文档编号:12813042 上传时间:2023-06-08 格式:DOCX 页数:29 大小:164.68KB
下载 相关 举报
单片机C语言实训报告.docx_第1页
第1页 / 共29页
单片机C语言实训报告.docx_第2页
第2页 / 共29页
单片机C语言实训报告.docx_第3页
第3页 / 共29页
单片机C语言实训报告.docx_第4页
第4页 / 共29页
单片机C语言实训报告.docx_第5页
第5页 / 共29页
单片机C语言实训报告.docx_第6页
第6页 / 共29页
单片机C语言实训报告.docx_第7页
第7页 / 共29页
单片机C语言实训报告.docx_第8页
第8页 / 共29页
单片机C语言实训报告.docx_第9页
第9页 / 共29页
单片机C语言实训报告.docx_第10页
第10页 / 共29页
单片机C语言实训报告.docx_第11页
第11页 / 共29页
单片机C语言实训报告.docx_第12页
第12页 / 共29页
单片机C语言实训报告.docx_第13页
第13页 / 共29页
单片机C语言实训报告.docx_第14页
第14页 / 共29页
单片机C语言实训报告.docx_第15页
第15页 / 共29页
单片机C语言实训报告.docx_第16页
第16页 / 共29页
单片机C语言实训报告.docx_第17页
第17页 / 共29页
单片机C语言实训报告.docx_第18页
第18页 / 共29页
单片机C语言实训报告.docx_第19页
第19页 / 共29页
单片机C语言实训报告.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机C语言实训报告.docx

《单片机C语言实训报告.docx》由会员分享,可在线阅读,更多相关《单片机C语言实训报告.docx(29页珍藏版)》请在冰点文库上搜索。

单片机C语言实训报告.docx

单片机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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2