硬件课程设计报告.doc

上传人:wj 文档编号:4732031 上传时间:2023-05-07 格式:DOC 页数:53 大小:2.43MB
下载 相关 举报
硬件课程设计报告.doc_第1页
第1页 / 共53页
硬件课程设计报告.doc_第2页
第2页 / 共53页
硬件课程设计报告.doc_第3页
第3页 / 共53页
硬件课程设计报告.doc_第4页
第4页 / 共53页
硬件课程设计报告.doc_第5页
第5页 / 共53页
硬件课程设计报告.doc_第6页
第6页 / 共53页
硬件课程设计报告.doc_第7页
第7页 / 共53页
硬件课程设计报告.doc_第8页
第8页 / 共53页
硬件课程设计报告.doc_第9页
第9页 / 共53页
硬件课程设计报告.doc_第10页
第10页 / 共53页
硬件课程设计报告.doc_第11页
第11页 / 共53页
硬件课程设计报告.doc_第12页
第12页 / 共53页
硬件课程设计报告.doc_第13页
第13页 / 共53页
硬件课程设计报告.doc_第14页
第14页 / 共53页
硬件课程设计报告.doc_第15页
第15页 / 共53页
硬件课程设计报告.doc_第16页
第16页 / 共53页
硬件课程设计报告.doc_第17页
第17页 / 共53页
硬件课程设计报告.doc_第18页
第18页 / 共53页
硬件课程设计报告.doc_第19页
第19页 / 共53页
硬件课程设计报告.doc_第20页
第20页 / 共53页
亲,该文档总共53页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

硬件课程设计报告.doc

《硬件课程设计报告.doc》由会员分享,可在线阅读,更多相关《硬件课程设计报告.doc(53页珍藏版)》请在冰点文库上搜索。

硬件课程设计报告.doc

硬件课程设计报告

硬件课程设计报告

专业

班级

学号

姓名

中国矿工业大学计算机科学与技术学院

2011年12月

目录

一、概要 3

二、焊接工艺总结 3

三、程序设计 3

(一)LED灯应用 3

(二)数码管显示 12

(三)蜂鸣器播放音乐 21

(四)按键识别 23

(五)串口通信 26

(六)时钟——定时器中断应用 33

(七)时钟日历——时钟芯片DS1302应用 37

(八)数字温度计——温度传感器DS18B20应用 47

四、体会与建议 53

一、概要

实验开发板配置为STC89C52RC单片机,内置8K的ROM程序存储器,支持串口ISP在线下载。

实验板上有8位数码管,可做静态显示、动态扫描以及数字时钟显示等;16位LED发光二极管,可进行流水灯等实验;6个按键可实现按键查询、按键中断等;利用蜂鸣器可进行报警提示、播放音乐等;利用DS1302时钟芯片可进行时钟精确计时,制作简易的时钟日历;通过温度传感器DS18B20接口可编程获取环境温度,制作数字温度计;MAX232芯片构成标准的RS232串行通信接口,可与PC机、单片机开发板进行串行通信,也可由计算机直接下载程序至单片机进行程序的烧录。

通过编程设计与本开发板配套的程序,完成相关硬件设备的应用,充分理解与掌握单片机的原理与应用,提高动手实践与编程的综合能力。

二、焊接工艺总结

本实验板为双面板,2条腿以上的元件,焊上后拆下重焊比较困难。

应按照顺序先焊易焊元件如电阻、小电容、12M和32768HZ的晶振、小开关等无极性元件。

在焊电路板时,首先焊接电源部分的元器件,J1、J2、S1、E1、E2、R5,然后接电源,检查电路板是否正常;然后焊接7段LED显示器下面的元件,并安装好7段LED显示器下的一个橡胶垫;然后焊其它元件,焊接元件按低高顺序,先焊低的,后焊高的,再焊集成电路插座,最后焊接7段LED显示器和串口插座等。

焊接过程中应注意排阻的公共端不能焊反,以及四位的LED数码管和LED发光二极管等具有极性的元件的电极也不能焊反。

三、程序设计

(一)LED灯应用

1. 流水灯

(1)实现功能

在实验板上点亮第一个LED灯后,再熄灭第一个LED灯,然后延时一段时间,接着再点亮第二个LED灯,接着再熄灭第二个LED灯……直至16个灯依次被点亮和熄灭,如此循环构成16个LED灯亮灭显示的流水灯。

(2)编程思想

①利用循环移位

先将P2赋值为0xff关闭右边8个灯,再将P0口赋值为0xfe点亮第一个LED灯,延时50ms后,将0xfe循环左移一位再赋给P0,接着再延时50ms,如此循环下去,待P0口控制的8个灯循环完毕后,再将P0赋值为0xff关闭左边8个灯将P2口赋值为0xfe,重复上述的循环操作。

这样可使16个LED灯实现右移的流水灯。

实现左移的流水灯时,可先将P0赋值为0xff关闭左边8个灯,再将P2口赋值为0x7f,然后延时50ms,接着将0x7f循环右移一位再赋给P2,如此循环下去,循环完毕后再将P0口赋值为0x7f重复上述循环操作。

这样可使16个LED灯实现左移的流水灯。

②利用取表方式

定义两个数组a,b,数组a中存放依次点亮8个灯时P0和P2口应赋的8个值,然后让P0和P2循环取遍a中的值,如此可构成右移的流水灯,数组b中反序存放数组a中8个值,然后让P0和P2循环取遍b中的值,如此可构成左移的流水灯。

(3)程序框图

①循环移位方式

主程序框图:

右移函数框图:

P0=0xff,P2=0xfe

开始

P2=0xff,P0=0xfe

延时50ms

延时50ms

P2口的值0xfe循环左移1位

P0口的值0xfe循环左移1位

循环8次?

循环8次?

否否

结束

是是

左移函数框图:

P2=0xff,P0=0x7f

开始

P2=0x7f,P0=0xff

延时50ms

延时50ms

P0口的值0x7f循环右移1位

P2口的值0x7f循环右移1位

循环8次?

循环8次?

结束

是是

②取表方式

主程序框图:

右移函数框图:

P0=0xff

开始

P2=0xff

P2=a[i]

延时50ms

P0=a[i]

延时50ms

i自增1

i自增1

循环8次

循环8次?

结束

是是

左移函数框图:

P2=0xff

开始

P0=0xff

P0=b[i]

延时50ms

P2=b[i]

延时50ms

i自增1

i自增1

循环8次?

循环8次?

否否

结束

是是

(4)程序代码

①循环移位方式

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

uchartemp,i,j;

voiddelayms(uchar);

voidyouyi();

voidzuoyi();

voidmain()

{while

(1)

{youyi();

zuoyi();

}

}

voidyouyi()

{temp=0xfe;

P2=0xff;

P0=temp;

for(i=0;i<8;i++)

{ delayms(50);

temp=_crol_(temp,1);

P0=temp;

}

P0=0xff;

temp=0xfe;

P2=temp;

for(j=0;j<8;j++)

{delayms(50);

temp=_crol_(temp,1);

P2=temp;

}

}

voidzuoyi()

{temp=0x7f;

P0=0xff;

P2=temp;

for(i=0;i<8;i++)

{

delayms(50);

temp=_cror_(temp,1);

P2=temp;

}

P2=0xff;

temp=0x7f;

P0=temp;

for(j=0;j<8;j++)

{delayms(50);

temp=_cror_(temp,1);

P0=temp;

}

}

voiddelayms(ucharz)//z取值(1~127)

{ucharx,y;

for(x=2*z;x>0;x--)

for(y=248;y>0;y--);

}

②取表方式

#include

#defineuintunsignedint

#defineucharunsignedchar

uchartemp,i,j;

ucharcodea[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

ucharcodeb[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

voiddelayms(uchar);

voidyouyi();

voidzuoyi();

voidmain()

{while

(1)

{youyi();

zuoyi();

}

}

voidyouyi()

{P2=0xff;

for(i=0;i<8;i++)

{ P0=a[i];

delayms(50);

}

P0=0xff;

for(j=0;j<8;j++)

{P2=a[j];

delayms(50);

}

}

voidzuoyi()

{P0=0xff;

for(i=0;i<8;i++)

{ P2=b[i];

delayms(50);

}

P2=0xff;

for(j=0;j<8;j++)

{ P0=b[j];

delayms(50);

}

}

voiddelayms(ucharz)//z取值(1~127)

{ucharx,y;

for(x=2*z;x>0;x--)

for(y=248;y>0;y--);

}

2.闪烁灯

(1)实现功能

在实验板上点亮第一个LED灯后延时一段时间再熄灭第一个LED灯,然后再点亮第一个LED灯延时一段时间再熄灭第一个LED灯,让第一个灯总共这样亮灭4次,接着再让第二个LED灯亮灭4次,如此下去实现16个灯的亮灭闪烁并且能循环右移和左移。

(2)编程思想

定义两个数组a,b,数组a中存放依次点亮8个灯时P0和P2口应赋的8个值,然后让P0和P2循环取遍a中的值,每取a中的一个值时按如下方式循环4次:

P0和P2每次取值后先延时100ms再赋值为0xff再延时100ms。

这样下去可构成循环右移的闪烁灯。

数组b中反序存放数组a中8个值,然后让P0和P2按上述方式循环取遍b中的值,如此可构成循环左移的闪烁灯。

(3)程序框图

主程序框图:

右移闪烁函数程序框图:

左移闪烁函数程序框图:

(4)程序代码

#include

#defineuintunsignedint

#defineucharunsignedchar

uchartemp,i,j;

ucharcodea[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

ucharcodeb[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

voiddelayms(uchar);

voidyoushan();

voidzuoshan();

voidmain()

{while

(1)

{youshan();

zuoshan();

}

}

voidyoushan()

{P2=0xff;

for(i=0;i<8;i++)

{ for(j=4;j>0;j--)//每个灯闪烁4次

{ P0=a[i];

delayms(100);

P0=0xff;

delayms(100);

}

}

P0=0xff;

for(i=0;i<8;i++)

{for(j=4;j>0;j--)

{ P2=a[i];

delayms(100);

P2=0xff;

delayms(100);

}

}

}

voidzuoshan()

{P0=0xff;

for(i=0;i<8;i++)

{ for(j=4;j>0;j--)//亮灭4次

{ P2=b[i];

delayms(100);

P2=0xff;

delayms(100);

}

}

P2=0xff;

for(i=0;i<8;i++)

{ for(j=4;j>0;j--)

{

P0=b[i];

delayms(100);

P0=0xff;

delayms(100);

}

}

}

voiddelayms(ucharz)//z取值(1~127)

{ucharx,y;

for(x=2*z;x>0;x--)

for(y=248;y>0;y--);

}

(二)数码管显示

1.数码管静态显示

1.1数码管1位静态显示

(1)实现功能

在实验板上让第一个数码管显示数字1,然后第一个数码管熄灭,接着第二个数码管显示数字2,然后第二个数码管熄灭,如此依次让8个依次循环显示数字1到8。

(2)编程思想

定义两个数组a,b,数组a中存放数码管要显示的数字的编码值,数组b中存放数码管的位选值,P0通过取a中的值来显示相应数字,P2通过取b中的值来决定哪一位显示,利用for循环来循环8次每次分别让P0和P2取数字1到8相对应的数组中的编码值和位选值,每取一次取值后延时300ms显示,接着给P2赋值0xff关闭位选为下一次显示消影。

(3)程序框图

(4)程序代码

#include

#defineuintunsignedint

#defineucharunsignedchar

uchartemp,i,j;

voiddelay100ms(uchar);

ucharcodea[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0X6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0-F

ucharcodeb[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选

voidmain()

{while

(1)

{for(i=1;i<9;i++)

{P0=a[i];

P2=b[i-1];

delay100ms(3);

P2=0xff;

//P0=0;

}

}

}

voiddelay100ms(uchart)//z取值ֵ(1~127)

{ucharx,y,z;

for(x=t;x>0;x--)

for(y=200;y>0;y--)

for(z=248;z>0;z--);

}

1.2数码管8位静态显示

(1)实现功能

在实验板上同时让8个数码管显示数字0,然后让8个数码管同时熄灭,接着再让8个数码管同时显示数字1,然后再让8个数码管同时熄灭,如此让8个数码管同时显示数字0到9以及16进制的A到F并且循环显示。

(2)编程思想

定义数组a,数组a中存放数码管要显示的数字的编码值,P0通过取a中的值来显示相应数字,P2赋值为0即打开所有的位选,在for循环中依次让P0取遍a中的值,每取一次取值后延时300ms显示。

(3)程序框图

(4)程序代码

#include

#defineuintunsignedint

#defineucharunsignedchar

uchartemp,i,j;

voiddelay100ms(uchar);

ucharcodea[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0X6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

voidmain()

{

P2=0;

while

(1)

{for(i=0;i<16;i++)

{P0=a[i];

delay100ms(3);

}

}

}

voiddelay100ms(uchart)//zȡֵ(1~127)

{ucharx,y,z;

for(x=t;x>0;x--)

for(y=200;y>0;y--)

for(z=248;z>0;z--);

}

2.数码管动态显示

2.1数码管动态显示“12345678”

(1)实现功能

在实验板上让8个数码管同时显示且第一个数码管显示数字1,第二个数码管显示数字2,……第8个数码管显示数字8。

(2)编程思想

定义两个数组a,b,数组a中存放数码管要显示的数字的编码值,数组b中存放数码管的位选值,P0通过取a中的值来显示相应数字,P2通过取b中的值来决定哪一位显示,利用for循环来循环8次每次分别让P0和P2取数字1到8相对应的数组中的编码值和位选值,每取一次值后延时50us,接着给P2赋值0xff关闭位选为下一次显示消影。

(3)程序框图

(4)程序代码

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

uchartemp,i,j;

voiddelay50us();

ucharcodea[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0X6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0-F

ucharcodeb[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选

voidmain()

{P2=0xff;;

while

(1)

{for(i=1;i<9;i++)

{P0=a[i];

P2=b[i-1];

delay50us();

P2=0xff;

}

}

}

voiddelay50us()//误差0us

{ucharx;

for(x=15;x>0;x--)

{

_nop_();

}

}

2.2数码管拉幕式显示“12345678”

(1)实现功能

在实验板上让第1个数码管显示数字1,延时一段时间后在第1个数码管显示数字1的同时让第2个数码管显示数字2,延时一段时间后在前两个数码管显示数字1和2的同时让第3个数码管显示数字3……如此下去让8个数码管显示的位数依次增加并且能够从左到右和从右到左显示。

(2)编程思想

定义变量u来统计显示的位数,定义变量flg来标识是否8位显示已满,定义两个数组a,b,数组a中存放数码管要显示的数字的编码值,数组b中存放数码管的位选值,数组a中存放数码管要显示的数字的编码值,数组b中存放数码管的位选值,P0通过取a中的值来显示相应数字,P2通过取b中的值来决定哪一位显示。

在主函数中利用两个for循环来分别实现从左到右和从右到左的显示,通过标志位flg来决定执行哪个for循环,在每个for循环中通过循环u次来显示u位数,每次分别让P0和P2取数字1到8相对应的数组中的编码值和位选值,每取一次值后延时50us,接着给P2赋值0xff关闭位选为下一次显示消影。

同时在主函数中设置定时器0为工作方式1并开定时器0中断,在定时器0的中断函数中每到400ms时让显示位数u加1,当显示位数达到8位时将u清零同将标志位flg取反,以便在主函数中执行从右到左显示的for循环。

(3)程序框图

(4)程序代码

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

uchari,u=1,t=0;

voiddelay50us();

ucharcodea[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0X6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0-F

ucharcodeb[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选

bitflg=0;

voidmain()

{TMOD=0x01;//定时/计数器0设为方式1

TH0=(65536-50000)/256;//定时50ms初值的高8位送TH0

TL0=(65536-50000)%256;//定时50ms初值的低8位送TH0

TR0=1;//启动定时器

ET0=1;//开定时/计数器0的中断

EA=1;//开CPU中断

P2=0xff;

P0=0;

while

(1)

{if(!

flg)

{for(i=1;i

{P2=0xff;

P0=a[i];

P2=b[i-1];

delay50us();

P2=0xff;

}

}

if(flg)

{for(i=1;i

{P2=0xff;

P0=a[9-i];

P2=b[8-i];

delay50us();

P2=0xff;

}

}

}

}

voidt0()interrupt1

{TH0=(65536-50000)/256;//重新将定时50ms初值的高8位送TH0

TL0=(65536-50000)%256;//重新将定时50ms初值的低8位送TH0

t++;

if(t==8)//每400ms显示增加一位

{t=0;

u++;

if(u==10)

{u=0;

flg=~flg;

}}

}

voiddelay50us()//误差0us

{ucharx;

for(x=15;x>0;x--)

{_nop_();}

}

3.数码管显示

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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