基于单片机的数字电子钟及波形发生器设计报告.docx

上传人:b****2 文档编号:11786821 上传时间:2023-06-02 格式:DOCX 页数:21 大小:316.36KB
下载 相关 举报
基于单片机的数字电子钟及波形发生器设计报告.docx_第1页
第1页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第2页
第2页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第3页
第3页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第4页
第4页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第5页
第5页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第6页
第6页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第7页
第7页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第8页
第8页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第9页
第9页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第10页
第10页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第11页
第11页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第12页
第12页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第13页
第13页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第14页
第14页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第15页
第15页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第16页
第16页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第17页
第17页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第18页
第18页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第19页
第19页 / 共21页
基于单片机的数字电子钟及波形发生器设计报告.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的数字电子钟及波形发生器设计报告.docx

《基于单片机的数字电子钟及波形发生器设计报告.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字电子钟及波形发生器设计报告.docx(21页珍藏版)》请在冰点文库上搜索。

基于单片机的数字电子钟及波形发生器设计报告.docx

基于单片机的数字电子钟及波形发生器设计报告

数字电子钟及波形发生器实验报告

1.设计题目

LED显示器件显示的电子时钟

2.设计要求

要求电子钟有复位功能,整点报时,六只LED数码管显示当前的时分秒,并且具有闹钟功能。

3.所用设备与器材

电子钟有以下几个部件组成:

单片机89c51等,电源,时分秒显示部件。

4.硬件方案

时分秒显示采用动态扫描,以降低对单片机端口数的要求,同时也降低了系统的功耗。

电源部分:

电源部分有两部分组成。

一部分是由220v的市电通过变压,整流稳压来得到+5v电压,维持系统的正常工作。

5.软件方案

该系统的软件方案主要分为主程序和定时器中断程序两大模块。

主程序完成系统的初始化。

中断程序完成时间计数,时间调整,误差消除等功能。

#include//

#defineuintunsignedint

uintflag;

sbitLED=P3^6;//定义LED端口

sbitLED1=P3^7;//定义LED端口

sbitLED2=P0^0;//定义LED端口

sbitkey1=P3^0;//定义按键位置

sbitkey2=P3^1;

//codeunsignedchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0-9

codeunsignedchartab[]={0xc0,0xf9,0xA4,0xB0,0x99,//0-4

0x92,0x82,0xf8,0x80,0x90//5-9

};

unsignedcharh_shiwei;//定义十位

unsignedcharh_gewei;//定义个位

unsignedcharm_shiwei;//定义十位

unsignedcharm_gewei;//定义个位

unsignedchars_shiwei;//定义十位

unsignedchars_gewei;//定义个位

unsignedcharcolck_h_shiwei;//定义十位

unsignedcharcolck_h_gewei;//定义个位

unsignedcharcolck_m_shiwei;//定义十位

unsignedcharcolck_m_gewei;//定义个位

unsignedcharcolck_s_shiwei;//定义十位

unsignedcharcolck_s_gewei;//定义个位

unsignedcharhour=0,minute=0,second=0,count=0,AA=0,zd_flag,zd_count;

unsignedcharcolck_hour=0,colck_minute=0,colck_second=0,colck_flag,colck_count;

voiddelayms(unsignedintdelay)//1ms延时函数

{

unsignedinti,x;

for(x=0;x

{

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

}

}

voiddelay(unsignedintcnt)

{

while(--cnt);

}

voidInit_shumaguan(void)

{

h_shiwei=tab[0];

h_gewei=tab[0];

m_shiwei=tab[0];

m_gewei=tab[0];

s_shiwei=tab[0];

s_gewei=tab[0];

colck_h_shiwei=tab[0];

colck_h_gewei=tab[0];

colck_m_shiwei=tab[0];

colck_m_gewei=tab[0];

colck_s_shiwei=tab[0];

colck_s_gewei=tab[0];

}

voidInit_Timer1(void)

{

TMOD|=0x10;//使用模式1,16位定时器

TH1=(65535-50000)/256;//给定初值TL1=(65535-50000)%256;

EA=1;//总中断打开

EX0=1;//外部中断0开

IT0=1;//电平触发

EX1=1;//外部中断1开

IT1=1;//电平触发

ET1=1;//定时器中断打开

TR1=1;//定时器开关打开

}

/*------------------------------------------------

主程序

------------------------------------------------*/

main()

{

Init_Timer1();

Init_shumaguan();

LED1=0;

LED=0;

second=30;

while

(1)

{

if(flag==2)

{

P2=0x01;

P1=colck_h_shiwei;//显示秒十位

delay(300);//短暂延时

P2=0x02;

P1=colck_h_gewei;//显示秒个位

delay(300);

P2=0x08;

P1=colck_m_shiwei;//显示秒十位

delay(300);//短暂延时

P2=0x10;

P1=colck_m_gewei;//显示秒个位

delay(300);

P2=0x40;

P1=s_shiwei;//显示秒十位

delay(300);//短暂延时

P2=0x80;

P1=s_gewei;//显示秒个位

delay(300);

}

else

{

P2=0x01;

P1=h_shiwei;//显示秒十位

delay(300);//短暂延时

P2=0x02;

P1=h_gewei;//显示秒个位

delay(300);

P2=0x08;

P1=m_shiwei;//显示秒十位

delay(300);//短暂延时

P2=0x10;

P1=m_gewei;//显示秒个位

delay(300);

P2=0x40;

P1=s_shiwei;//显示秒十位

delay(300);//短暂延时

P2=0x80;

P1=s_gewei;//显示秒个位

delay(300);

}

if(!

key1)

{

delayms

(1);

if(!

key1)

{

while(!

key1);

if(flag==1)

{minute++;

if(minute==60)

{

minute=0;

}

m_shiwei=tab[minute/10];//十位显示值处理

m_gewei=tab[minute%10];//个位显示处理

}

if(flag==2)

{colck_minute++;

if(colck_minute==60)

{

colck_minute=0;

}

colck_m_shiwei=tab[colck_minute/10];//十位显示值处理

colck_m_gewei=tab[colck_minute%10];//个位显示处理

}

}

}

if(!

key2)

{

delayms

(1);//去抖动

if(!

key2)//检测按键确实按下,进行按键处理

{

while(!

key2);

if(flag==1)

{

hour++;

if(hour==24)

{

hour=0;

}

h_shiwei=tab[hour/10];//十位显示值处理

h_gewei=tab[hour%10];//个位显示处理

}

if(flag==2)

{

colck_hour++;

if(colck_hour==24)

{

colck_hour=0;

}

colck_h_shiwei=tab[colck_hour/10];//十位显示值处理

colck_h_gewei=tab[colck_hour%10];//个位显示处理

}

}

}

}

}

/*------------------------------------------------

*名称:

Time0_Int()

*功能:

定时器中断

------------------------------------------------*/

voidTimer1_Int(void)interrupt3using1

{

TH1=(65535-50000)/256;//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出

TL1=(65535-50000)%256;

//LED=~LED;//指示灯反相,可以看到闪烁

count++;

if(count==20)

{

second++;

if(zd_flag==1)

{

zd_count++;

LED=1;

if(zd_count>5)

{

LED=0;

zd_count=0;

zd_flag=0;

}

}

if(colck_flag==1)

{

colck_count++;

LED1=1;

if(colck_count>15)

{

LED1=0;

colck_count=0;

colck_flag=0;

}

}

count=0;

}

if(second==60)

{

minute++;

second=0;

if(minute==60)

{

zd_flag=1;

hour++;

minute=0;

if(hour==24)

{

hour=0;

}

h_shiwei=tab[hour/10];//十位显示值处理

h_gewei=tab[hour%10];//个位显示处理

}

if(minute==colck_minute&&hour==colck_hour)

{

colck_flag=1;

}

m_shiwei=tab[minute/10];//十位显示值处理

m_gewei=tab[minute%10];//个位显示处理

}

s_shiwei=tab[second/10];//十位显示值处理

s_gewei=tab[second%10];//个位显示处理

}

/*------------------------------------------------

*名称:

中断函数

*功能:

------------------------------------------------*/

voidISR_Key(void)interrupt0using1//调时调分

{

AA=~AA;

TR1=AA;//定时器开关打开

if(AA==0)

{

flag=1;

//LED1=1;

}

else

{

flag=0;

//LED1=0;

}

}

/*------------------------------------------------

*名称:

中断函数

*功能:

naoling

------------------------------------------------*/

voidISR_Key2(void)interrupt2

{

AA=~AA;

TR1=AA;//定时器开关打开

if(AA==0)

{

flag=2;

//LED=1;

}

else

{

flag=0;

//LED=0;

}

}

}

6.方案论证

P1口对应赋值的四个switch按键,由上到下分别控制秒分时,复位和闹钟。

P2口对应显示位显示,,P0口对应显示段显示,abcdefg每个代表一段。

还有晶振电路,蜂鸣器电路。

中断程序采用单片机内部T0实现,定时时间为125ms,当时间到达125乘以8,即1秒时,秒计数缓冲器增加1,到达一分钟时,分计数缓冲器加1,到达一小时时,时计数缓冲器增加1,并将秒分时的个位十位百位放入显示缓冲器。

当秒分时计数缓冲器分别到达60sec60min24h时,则对他们清零,以便重新计数。

7.调试过程

8.运行结果及收获体会

电子钟有复位功能,整点报时,六只LED数码管显示当前的时分秒,并且具有闹钟功能。

通过这次设计是我认识到我对单片机方面知识的匮乏,对于书本上的很多知识不能熟练应用,有很多知识需要自己去掌握,等待自己去认真学习,我会在以后的学习生活中弥补我所缺少的知识。

本次试验使我学到了一些重要的东西,理论到实践的转化,怎样将自己学到的东西用到以后的工作中去。

在大学课堂的学习仅仅只是被灌输了专业知识,而对与实践却是少之又少,此次电子钟设计给自己奠定了实践基础,我会在以后的学习生活中磨练自己,使自己适应于以后的竞争。

 

波形发生器的设计

1.设计题目

设计一个能产生正弦波、方波、三角波、梯形波、锯齿波的波形发生器。

2.设计要求

利用单片机P1.0引脚输出频率范围1HZ~1000HZ的正弦波方波、三角波、梯形波、锯齿波并用示波器观察。

3.所用设备与器材

DAC0832、89C51、OPAMP、button、GROUND、示波器、电源。

4.硬件方案

采用单片机和数模转换DAC0832实现波形产生,波形的产生是通过AT89C51执行波形程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路输出端得到相关电压波形。

以AT89C51单片机为控制核心,P0口接DAC0832信号输入并进行数模转换,P2口接button。

5.软件方案

DAC0832采用单缓冲方式。

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineDAC0832_AdrXBYTE[0x7FFF]

charcodesindat[]={

0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,

0xab,0xae,0xb1,0xb4,0xb7,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,

0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xel,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,

0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfa,0xfb,0xfc,0xfd,0xfd,

0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,

0xf4,0xf3,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,

0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,

0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,

0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,

0x66,0x63,0x60,0x5d,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,

0x40,0x3d,0x3a,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,

0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,

0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,

0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,

0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,

0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,

0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};

bitflag=0;

voiddelay(uintN)

{

uinti;

for(i=0;i

}

voidDAC0832_ConversionOnce(ucharout_data)

{

DAC0832_Adr=out_data;

delay(10);

}

ucharKey_Scan(void)

{

ucharkey;

if(P2!

=0xff)

{

delay(10);

key=P2;

if(key!

=0xff)

flag=~flag;

return(key);

}

elsereturn(key=0xff);

}

voidFun_Triangle(void)

{

uchari;

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

DAC0832_ConversionOnce(i);

for(;i>0;i--)

DAC0832_ConversionOnce(i);

}

voidFun_Rectangular(void)

{

DAC0832_ConversionOnce(0xff);

delay(1000);

DAC0832_ConversionOnce(0x00);

delay(1000);

}

voidFun_SawTooth(void)

{

uchari;

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

DAC0832_ConversionOnce(i);

}

voidFun_Sin(void)

{

uchari;

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

{

DAC0832_ConversionOnce(sindat[i]);

}

}

voidmain()

{

ucharKey_Num;

while

(1)

{

Key_Num=Key_Scan();

switch(Key_Num)

{

case0xfe:

do{

Fun_Triangle();

}while(Key_Scan()&&(flag==1));break;

case0xfd:

do{

Fun_SawTooth();

}while(Key_Scan()&&(flag==1));break;

case0xfb:

do{

Fun_Rectangular();

}while(Key_Scan()&&(flag==1));break;

case0xf7:

do{

Fun_Sin();

}while(Key_Scan()&&(flag==1));break;

default:

break;

}

}

}

6.方案论证

采用AT89C51单片机作为控制器,波形选择通过按键选择,波形通过DAC0832。

这样设计占用单片机端口少,具有电路简单,设计方便,显示亮度高,可靠性高等特点。

7.调试过程

按下P2.0

按下P2.1

按下P2.2

按下P2.3

9.运行结果及收获体会

实现了利用AT89C51单片机输出正弦波、矩形波、三角波、锯齿波。

通过对波形发生器的设计,是我收获很多,虽然实验结果不完美,但是这次设计真正是自己长进很多,是我更加深一步的了解了单片机系统的软硬件设计过程,方法及实现,培养了我分析问题解决问题的能力,为以后的设计和实现更难的设计打下良好基础。

要设计一个成功的电路,必须要有耐心,要有坚持的毅力,同时还要有较强的查阅资料的能力,我希望在以后的实践和工作中能在这些方面得到更大更好的提升。

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

当前位置:首页 > 解决方案 > 学习计划

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

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