文档库 最新最全的文档下载
当前位置:文档库 › 51单片机+ds1302+DS18b20温度时钟(电路图+C语言程序)

51单片机+ds1302+DS18b20温度时钟(电路图+C语言程序)

51单片机+ds1302+DS18b20温度时钟(电路图+C语言程序)
51单片机+ds1302+DS18b20温度时钟(电路图+C语言程序)

时钟电路图:

PCB板:

单片机程序:

/*=========================================================== =========

调试要求:

1.MCU:AT89S52芯片或AT89C52

2.晶振:12MHz

功能:多功能时钟+温度计

============================================================= =======*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit dis_bit1=P2^7;//定义数码管控制口

sbit dis_bit2=P2^6;//定义数码管控制口

sbit dis_bit3=P2^4;//定义数码管控制口

sbit dis_bit4=P2^3;//定义数码管控制口

sbit dis_bit5=P2^1;//定义数码管控制口

sbit dis_bit6=P2^0;//定义数码管控制口

sbit led1_bit=P2^2;//定时LED的控制口

sbit led2_bit=P2^5;//定时LED的控制口

sbit s1_bit=P1^0; //定义S1控制口

sbit s2_bit=P1^1; //定义S2控制口

sbit s3_bit=P1^2; //定义S3控制口

sbit dq_ds18b20=P3^3;//定义控制DS18B20

sbit speak=P3^7; //定义蜂鸣器控制口

sbit clk_ds1302=P3^6;//定义控制DS1302的时钟线

sbit io_ds1302=P3^5;//定义控制DS1302的串行数据

sbit rest_ds1302=P3^4;

#define smg_data P0//定义数码管数据口

void delay_3us();//3US的延时程序

void delay_8us(uint t);//8US延时基准程序

void delay_50us(uint t);//延时50*T微妙函数的声明

void display1(uchar dis_data);//数码管1显示子程序

void display2(uchar dis_data);//数码管2显示子程序

void display3(uchar dis_data);//数码管3显示子程序

void display4(uchar dis_data);//数码管4显示子程序

void display5(uchar dis_data);//数码管5显示子程序

void display6(uchar dis_data);//数码管6显示子程序

void init_t0();//定时器0初始化函数

void dis_led();//LED处理函数

void judge_s1();//S1按键处理函数

void judge_s2();//S2按键处理函数

void judge_s3();//S3按键处理函数

void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1);//显示子程序

void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san);//闪烁显示子程序

void judge_dis();//显示处理函数

void judge_clock();//显示处理函数

void set_ds1302();//设置时间

void get_ds1302();//读取当前时间

void w_1byte_ds1302(uchar t);//向DS1302写一个字节的数据

uchar r_1byte_ds1302();//从DS1302读一个字节的数据

//******************************************************************** ***

//DS18B20测温函数定义

void w_1byte_ds18b20(uchar value);//向DS18B20写一个字节

uchar r_1byte_ds18b20(void);//从DS18B20读取一个字节的数据

void rest_ds18b20(void);//DS18B20复位程序

void readtemp_ds18b20(void);//读取温度

void dis_temp();//温度显示函数

//共阳数码管断码表

const uchar tabl1[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,

// 0 1 2 3 4 5

0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,

//6 7 8 9 E T B

0xc6,0xbf,0xff};

// C -

const uchar tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x0 8,0x09,0x09};

uchar t0_crycle;

uchar hour_count,minute_count,second_count,msecond_count;

uchar clock_hour,clock_minute;

uchar countdown_second;

uchar countdown_hour,countdown_minute;

uchar clock_en;//闹钟关闭和开启的标志,1开启,0关闭

uchar flag1,second_flag,zancun1,zancun2,zancun3;

uchar zancun4,zancun5,zancun6,zancun7;

uchar clock_flag,countdown_flag;

uchar msecond_minute,msecond_second,msecond_msecond,msecond_flag;//秒表相关参数

uint speak_count;

uchar templ,temph,temp_flag;

uchar t_b,t_s,t_g,t_x,temp_flag2;//从左到右分别存储温度百位,十位,个位,小数位

uchar tab23[3];//={0x40,0x59,0x23,0x28,0x11,0x06,0x09};//上电时默认的时间

//主程序

void main()

{

P3=0x00;

flag1=0;

zancun3=0;

msecond_minute=0;//置秒表相关参数为0

msecond_second=0;

msecond_msecond=0;

speak=1;//关闭蜂鸣器

speak_count=0;

clock_hour=0;

clock_minute=0;

clock_flag=0;

countdown_flag=0;//倒计时标志位为0

clock_en=0;//开机时默认关闭闹钟

init_t0();

TR0=1;//

// set_ds1302();//设置DS1302的初始时间

//接下来开始编写让数码管显示的程序

while(1)

{

get_ds1302();

judge_dis();//显示处理

judge_s1();

judge_s2();

judge_s3();

judge_clock();//闹钟处理程序

}

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t0_crycle++;

if(t0_crycle==2)// 0.1秒

{

t0_crycle=0;

msecond_flag=1;

msecond_count++;

if(msecond_count==10)//1秒

{

msecond_count=0;

second_flag=1;

}

}

}

//************************************************** //显示处理函数

void judge_dis()

{

if(flag1==0)

{

if(second_flag==1)

{

zancun7++;

second_flag=0;

}

if(zancun7<1)

{

if(temp_flag2==1)

{

readtemp_ds18b20();//读取温度

temp_flag2=0;

}

dis_temp();//温度显示函数

}

if(zancun7>=1)

{

temp_flag2=1;

zancun4=hour_count&0xf0;

zancun4>>=4;

zancun5=minute_count&0xf0;

zancun5>>=4;

zancun6=second_count&0xf0;

zancun6>>=4;

dis(zancun4,hour_count&0x0f,zancun5,minute_count&0x0f,zancun6,second_count& 0x0f);

dis_led();

if(zancun7==5)zancun7=0;

}

}

if(flag1!=0)

{

switch(flag1)

{

case 1:

dis(5,10,11,1,12,12);//显示SET1

led1_bit=1;

led2_bit=1;

break;

case 2:

dis(5,10,11,2,12,12);//显示SET2

break;

case 3:

dis(5,10,11,3,12,12);//显示SET3

break;

case 4:

dis(5,10,11,4,12,12);//显示SET4

break;

case 5:

dis(5,10,11,5,12,12);//显示SET5

break;

case 6:

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,1);

break;

case 7:

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,2);

break;

case 8:

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,3);

break;

case 9://进入修改时间,时间分位个位闪烁

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,4);

break;

case 10://进入修改闹钟,闹钟小时十位闪烁

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,1);

break;

case 11://进入修改闹钟,闹钟小时个位闪烁

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,2);

break;

case 12://进入修改闹钟,闹钟小时十位闪烁

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,3);

break;

case 13://进入修改闹钟,闹钟小时个位闪烁

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,4);

break;

case 14://进入修改闹钟的开关

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,6);

break;

case 15:

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10, 1);

break;

case 16:

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10, 2);

break;

case 17:

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10, 3);

break;

case 18:

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10, 4);

break;

case 19:

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10, 5);

break;

case 20:

dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,zancun3/10,zancun3%10, 6);

break;

case 21:

if(second_flag==1)

{

second_flag=0;

countdown_second--;

if(countdown_second==255)

{

countdown_second=59;

countdown_minute--;

if(countdown_minute==255)

{

countdown_minute=59;

countdown_hour--;

if(countdown_hour==255)

{

flag1=22;

countdown_minute=0;

countdown_hour=0;

countdown_second=0;

countdown_flag=1;

}

}

}

}

dis(countdown_hour/10,countdown_hour%10,countdown_minute/10,countdown_min ute%10,countdown_second/10,countdown_second%10);//

break;

case 22:

if(countdown_flag>0 && countdown_flag<7)

{

speak=0;

if(second_flag==1)

{

second_flag=0;

countdown_flag++;

}

}

else

{

speak=1;

}

dis(countdown_hour/10,countdown_hour%10,countdown_minute/10,countdown_min ute%10,countdown_second/10,countdown_second%10);//

break;

case 23:

dis(msecond_minute/10,msecond_minute%10,msecond_second/10,msecond_second %10,msecond_msecond%10,12);

break;

case 24:

if(msecond_flag==1)

{

msecond_flag=0;

msecond_msecond++;

if(msecond_msecond==10)

{

msecond_msecond=0;

msecond_second++;

if(msecond_second==60)

{

msecond_second=0;

msecond_minute++;

if(msecond_minute==100)

{

msecond_minute=99;

flag1=23;

}

}

}

}

dis(msecond_minute/10,msecond_minute%10,msecond_second/10,msecond_second %10,msecond_msecond%10,12);

break;

case 25:

dis(zancun3/10,zancun3%10,zancun2/10,zancun2%10,zancun1/10,zancun1%10);

break;

default:

break;

}

}

}

//**************************************************

//S1按键处理函数

void judge_s1()

{

s1_bit=1;//置IO为1,准备读入收据

if(s1_bit==0)//判断是否有按键按下

{

delay_50us(1);// 延时,去除机械抖动

if(s1_bit==0)

{

switch(flag1)

{

case 0:

case 1:

case 2:

case 3:

case 4:

case 6:

case 7:

case 8:

case 10:

case 11:

case 12:

case 13:

case 15:

case 16:

case 17:

case 18:

case 19:

flag1++;

break;

case 9:

flag1=6;

break;

case 14:

flag1=10;

break;

case 20:

flag1=15;

break;

case 5:

case 21:

case 22:

case 23://系统从秒表状态复位

case 24://系统从秒表状态复位

case 25://系统从计数器复位

flag1=0;

break;

default:

break;

}

while(s1_bit==0)

{

judge_dis();

}//等待按键释放

}

}

}

//************************************************** //S2按键处理函数

void judge_s2()

{

s2_bit=1;//置IO为1,准备读入收据

if(s2_bit==0)//判断是否有按键按下

{

delay_50us(1);// 延时,去除机械抖动

if(s2_bit==0)

{

switch (flag1)

{

case 1: //在显示SET1状态下按S2件,进入修改时间flag1=6;

zancun4=hour_count&0xf0;

zancun4>>=4;

zancun6=hour_count&0x0f;

zancun1=zancun4*10+zancun6;

//zancun1=hour_count;

zancun5=minute_count&0xf0;

zancun5>>=4;

zancun6=minute_count&0x0f;

zancun2=zancun5*10+zancun6;

// zancun2=minute_count;

break;

case 2://在显示SET2状态下按S2,进入设置闹钟zancun1=clock_hour;

zancun2=clock_minute;

flag1=10;

break;

case 6://修改时钟小时十位状态下按S2件

case 7://修改时钟小时个位状态下按S2件

case 8://修改时钟分钟十位状态下按S2件

case 9://修改时钟分钟个位状态下按S2件

//zancun4=zancun1/10;

tab23[2]=zancun1/10*16+zancun1%10;

//zancun5=zancun2&0xf0;

//zancun5>>=4;

tab23[1]=zancun2/10*16+zancun2%10;

hour_count=tab23[2];

minute_count=tab23[1];

second_count=0;

tab23[0]=0;

set_ds1302();//设置DS1302的初始时间

flag1=0;

break;

case 10://修改闹钟小时十位状态下按S2

case 11://修改闹钟小时个位状态下按S2

case 12://修改闹钟分钟十位状态下按S2

case 13://修改闹钟分钟个位状态下按S2

case 14://修改闹钟使能状态下按S2 clock_hour=zancun1;

clock_minute=zancun2;

clock_en=zancun3;

flag1=0;

break;

case 3:

flag1=15;

zancun1=countdown_hour;

zancun2=countdown_minute;

zancun3=countdown_second;

break;

case 15:

case 16:

case 17:

case 18:

case 19:

case 20:

countdown_hour=zancun1;

countdown_minute=zancun2;

countdown_second=zancun3;

flag1=21;

countdown_flag=0;

break;

case 22:

flag1=21;

break;

case 21:

flag1=22;

break;

case 4:

flag1=23;//秒表暂停

msecond_minute=0;

msecond_second=0;

msecond_msecond=0;

break;

case 23:

flag1=24;

break;

case 24:

flag1=23;

break;

case 5:

flag1=25;//进入计数器模式

zancun2=0;

zancun3=0;

break;

default:

break;

}

while(s2_bit==0)

{

judge_dis();

}//等待按键释放

}

}

}

//**************************************************

//S3按键处理函数

void judge_s3()

{

s3_bit=1;//置IO为1,准备读入收据

if(s3_bit==0)//判断是否有按键按下

{

delay_50us(1);// 延时,去除机械抖动

if(s3_bit==0)

{

switch (flag1)

{

case 6://修改时间小时的十位数

zancun1+=10;

if(zancun1>=24)zancun1=zancun1%10;

break;

case 7://修改时间小时的个位数

zancun1=zancun1/10*10+(zancun1%10+1)%10;

if(zancun1>=24)zancun1=20;

break;

case 8://修改时间分钟的十位数

zancun2+=10;

if(zancun2>=60)zancun2-=60;

break;

case 9://修改时间分钟的个位数

zancun2=zancun2/10*10+(zancun2%10+1)%10;

break;

case 10://修改闹钟小时的十位数

if(zancun1>=24)zancun1=zancun1%10;

break;

case 11://修改闹钟小时的个位数

zancun1=zancun1/10*10+(zancun1%10+1)%10;

if(zancun1>=24)zancun1=20;

break;

case 12://修改闹钟分钟的十位数

zancun2+=10;

if(zancun2>=60)zancun2-=60;

break;

case 13://修改闹钟分钟的个位数

zancun2=zancun2/10*10+(zancun2%10+1)%10;

break;

case 14:

zancun3^=1;

break;

case 15://修改倒计时小时的十位数

zancun1+=10;

if(zancun1>=100)zancun1-=100;

break;

case 16: //修改倒计时小时的个位数

zancun1=zancun1/10*10+(zancun1%10+1)%10;

break;

case 17://修改倒计时分钟的十位数

zancun2+=10;

if(zancun2>=60)zancun2-=60;

break;

case 18: //修改倒计时分钟的个位数

zancun2=zancun2/10*10+(zancun2%10+1)%10;

break;

case 19://修改倒计时秒的十位数

zancun3+=10;

if(zancun3>=60)zancun3-=60;

break;

case 20: //修改倒计时秒的个位数

zancun3=zancun3/10*10+(zancun3%10+1)%10;

break;

case 21:

case 22://

countdown_hour=zancun1;

countdown_minute=zancun2;

countdown_second=zancun3;

flag1=21;

break;

case 23:

case 24://秒表复位

flag1=24;

msecond_minute=0;

msecond_second=0;

msecond_msecond=0;

break;

case 25:

zancun1++;

if(zancun1==100)

{

zancun1=0;

zancun2++;

if(zancun2==100)

{

zancun2=0;

zancun3++;

}

}

break;

default:

break;

}

while(s3_bit==0)

{

judge_dis();

}//等待按键释放

}

}

}

//**************************************** //显示处理函数

void judge_clock()

{

zancun4=hour_count&0xf0;

zancun4>>=4;

zancun6=hour_count&0x0f;

zancun4*=10;

zancun4+=zancun6;

zancun5=minute_count&0xf0;

zancun5>>=4;

zancun6=minute_count&0x0f;

zancun5*=10;

zancun5+=zancun6;

if(clock_hour==zancun4 && clock_minute==zancun5)

{

if(clock_en==1 && clock_flag==0)

{

speak_count=0;//开启蜂鸣器

clock_flag=1;

speak_count=0;

}

}

else

{

clock_flag=0;

}

if(clock_flag==1 && speak_count<400)

{

if(msecond_count<=5)

{

speak=0;

speak_count++;

}

else

{

speak=1;

}

}

else

{

speak=1;

}

}

//****************************************

////闪烁显示子程序

void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san) {

if(san==1)

{

if(msecond_count<5)

{

display1(s6);

}

else

{

display1(s6);

}

if(san==2)

{

if(msecond_count<5)

{

display2(s5);

}

}

else

{

display2(s5);

}

if(san==3)

{

if(msecond_count<5)

{

display3(s4);

}

}

else

{

display3(s4);

}

if(san==4)

{

if(msecond_count<5)

{

display4(s3);

}

}

else

{

display4(s3);

}

if(san==5)

{

if(msecond_count<5)

{

display5(s2);

}

else

{

display5(s2);

}

if(san==6)

{

if(msecond_count<5)

{

display6(s1);

}

}

else

{

display6(s1);

}

}

//****************************************

//时钟显示程序

void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1)

{

display1(s6);

display2(s5);

display3(s4);

display4(s3);

display5(s2);

display6(s1);

}

//******************************************************************** ************************

void init_t0()

{

TMOD=0x01;//设定定时器工作方式1,定时器定时50毫秒

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;//开总中断

ET0=1;//允许定时器0中断

t0_crycle=0;//定时器中断次数计数单元

}

//**************************************************

//LED处理函数

void dis_led()

{

if(msecond_count<5)

{

led1_bit=1;

led2_bit=1;

}

else

{

led1_bit=0;

led2_bit=0;

}

}

//*************************************************************** //功能:把数据1显示在数码管1上

void display6(uchar dis_data)

{

smg_data=tabl1[dis_data];//送显示断码

dis_bit6=0;//锁存数据

delay_50us(40);

dis_bit6=1;

}

//*************************************************************** //功能:把数据1显示在数码管1上

void display5(uchar dis_data)

{

smg_data=tabl1[dis_data];//送显示断码

dis_bit5=0;//锁存数据

delay_50us(40);

dis_bit5=1;

}

//*************************************************************** //功能:把数据1显示在数码管1上

void display4(uchar dis_data)

{

smg_data=tabl1[dis_data];//送显示断码

dis_bit4=0;//锁存数据

delay_50us(40);

dis_bit4=1;

}//*************************************************************** //功能:把数据1显示在数码管1上

void display3(uchar dis_data)

{

smg_data=tabl1[dis_data];//送显示断码

dis_bit3=0;//锁存数据

delay_50us(40);

单片机时钟电路的设计

单片机时钟电路的设计 单片机内部虽有振荡电路,但要形成时钟必须在外总附加电路。 MCS-51单片机的时钟产生方法有如下两种。 1内部时钟方式 利用芯片内部的振荡电路,在XTAL1和XTAL2引脚上外接定时元件,内部振荡电路便产生自激振荡,用示波器可以观察到XTAL2输出时的时钟信号。 最常用的内部时钟方式是采用外接晶体(在频率稳定性要求不高而希望尽可能廉价时,可选用陶瓷谐振器)和电容组成的并联谐振回路,HMOS型和CHMOS型单片机和并联,谐振回路及参数相同。 振荡晶体可在1. 2MHz~12MHz之间。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,CX1和CX2可在20p~100pF间取值,但在60PF~70PF时振荡器有较高的频率稳定性。 在设计PCB板时,晶体或陶瓷谐振器和电容应尽可能靠近单片机芯片安装,以减少寄生电容,更好的保护振荡电路稳定可靠的工作。为了提高温度稳定性,采用NPO电容。2外部时钟方式 外部时钟方式是利用外部振荡信号源直接接入XRAL1或XTAL2。由于HMOS和CHMOS单片机内部时钟进入的引脚不同(CHMOS型单片同由XTAL1进入,HMOS 型单片机由XTAL2进入),其外部振荡信号源的接入方法也不同。HMOS型单片机的外部振荡信号接至XTAL2,而内部的反相放大器的输入端XTAL1应接地。由于XTAL2端的逻辑电平不是TTL的,故建议外接一个上拉电阻。而XTAL2不可以接地。 在CMOS电路中,因内部时钟引入端取自反相放大器的输入端(即与非门的输入端),故采用外部振荡信号源时接线方式与HNOS型有所不同,外部信号接至XTAL1,而XTAL2不可以接地。外部振荡信号通过去一个2分频的触发器而成为一个时钟信号。故对外部信号的占空比没什么要求,但高电平持续时间和低电平持续时间应大于20ns.

基于51单片机的4位数码管秒表

原理图: 源程序: /************************************************************* 标题:定时器中断精确到00.01的秒表 效果:能清零重新开始,暂停,继续计时,能精确到0.01秒 作者:皖绩小挺 说明:使用12M晶振,四位数码管,3个按键 ****************************************************************/ #include #define uint unsigned int #define uchar unsigned char uint temp,tt,qian,bai,shi,ge; sbit smg_q=P1^0; sbit smg_b=P1^1; sbit smg_s=P1^2; sbit smg_g=P1^3; sbit key1 = P3^7; sbit key2 = P3^6; sbit key3 = P3^5; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90};

uchar code table1[]={0x40,0x79,0x24,0x30,0x19, 0x12,0x02,0x78,0x00,0x10}; //带小数点 void keyscan(); void display(uint shi,uint ge); void delay(uint z); void init(); /************************************************************** 主函数 ******************************************************************/ void main() { init();//初始化子程序 while(1) { if(tt==1) { tt=0; temp++; if(temp==10000) { temp=0; } qian=temp/1000; bai=temp%1000/100; shi=temp%100/10; ge=temp%10; } keyscan(); display(shi,ge); } } /********************************************************************* 延时 ***********************************************************************/ void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /*********************************************************************

51单片机作的电子钟程序及电路图

51单片机作的电子钟程序在很多地方已经有了介绍,对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分,计算部分,时钟调整部分构成。 时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间,其他位均以此为基准往上累加。 开始程序定义了秒,十秒,分,十分,小时,十小时,共6位的寄存器,分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。

以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 中断入口程序 ;; (仅供参考) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ORG 0000H ;程序执行开始地址 LJMP START ;跳到标号START执行 ORG 0003H ;外中断0中断程序入口 RETI ;外中断0中断返回 ORG 000BH ;定时器T0中断程序入口 LJMP INTT0 ;跳至INTTO执行 ORG 0013H ;外中断1中断程序入口

RETI ;外中断1中断返回 ORG 001BH ;定时器T1中断程序入口 LJMP INTT1 ;跳至INTT1执行 ORG 0023H ;串行中断程序入口地址 RETI ;串行中断程序返回 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 主程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; START: MOV R0,#70H ;清70H-7AH共11个内存单元MOV R7,#0BH ;clr P3.7 ; CLEARDISP: MOV @R0,#00H ; INC R0 ; DJNZ R7,CLEARDISP ; MOV 20H,#00H ;清20H(标志用) MOV 7AH,#0AH ;放入"熄灭符"数据 MOV TMOD,#11H ;设T0、T1为16位定时器 MOV TL0,#0B0H ;50MS定时初值(T0计时用)MOV TH0,#3CH ;50MS定时初值 MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)MOV TH1,#3CH ;50MS定时初值 SETB EA ;总中断开放 SETB ET0 ;允许T0中断 SETB TR0 ;开启T0定时器 MOV R4,#14H ;1秒定时用初值(50M S×20)START1: LCALL DISPLAY ;调用显示子程序 JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序SJMP START1 ;P3.7口为1时跳回START1 SETMM1: LJMP SETMM ;转到时间调整程序SETMM ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;T0中断服务程序 INTT0: PUSH ACC ;累加器入栈保护 PUSH PSW ;状态字入栈保护

简单51单片机数字时钟设计

题目:简单51单片机数字时钟设计 院系: 物理与电气工程学院 专业:自动化专业 班级:10级自动化 姓名:苏吉振 学号:2 老师:李艾华

引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。 目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS 化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。 单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。 单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。 数字钟是采用数字电路实现对时,分,秒数字显示的计时装置,广泛用于个 人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

基于51单片机的实时时钟设计报告

课程设计(论文)任务书 信息工程学院信息工程专业(2)班 一、课程设计(论文)题目嵌入式课程设计 二、课程设计(论文)工作自 2014 年 6 月 9 日起至2014年 6月15日止。 三、课程设计(论文) 地点: 5-402 单片机实验室 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)使学生掌握单片机各功能模块的基本工作原理; (2)培养学生单片机应用系统的设计能力; (3)使学生能够较熟练地使用proteus工具完成单片机系统仿真。 (4)培养学生分析、解决问题的能力; (5)提高学生的科技论文写作能力。 2.课程设计的任务及要求 1)基本要求: (1)分析所设计系统中各功能模块的工作原理; (2)选用合适的器件(芯片); (3)提出系统的设计方案(要有系统电路原理图); (4)对所设计系统进行调试。 2)创新要求: 在基本要求达到后,可进行创新设计,如改善单片机应用系统的性能。 3)课程设计论文编写要求 (1)要按照书稿的规格打印撰写论文。 (2)论文包括目录(自动生成)、摘要、正文、小结、参考文献、附录等。 (3)论文装订按学校的统一要求完成。 4)答辩与评分标准: (1)完成原理分析:20分; (2)完成设计过程:30分; (3)完成调试:20分; (4)回答问题:20分; (5)格式规范性(10分)。

5)参考文献: (1)张齐.《单片机原理与嵌入式系统设计》电子工业出版社 (2)周润景.《PROTUES入门实用教程》机械工业出版社 (3)任向民.《微机接口技术实用教程》清华大学出版社 (4)https://www.wendangku.net/doc/2317292191.html,/view/a5a9ceebf8c75fbfc77db2be.html 6)课程设计进度安排 内容天数地点 构思及收集资料1图书馆 系统设计与调试 4 实验室 撰写论文2图书馆、实验室 学生签名: 2014 年6 月9日 课程设计(论文)评审意见 (1)完成原理分析(20分):优()、良()、中()、一般()、差(); (2)设计分析(30分):优()、良()、中()、一般()、差(); (3)完成调试(20分):优()、良()、中()、一般()、差(); (4)回答问题(20分):优()、良()、中()、一般()、差(); (5)格式规范性(10分):优()、良()、中()、一般()、差(); 评阅人:职称: 2014 年6 月15 日

51单片机课程设计秒表

微控制器技术课程 设计报告 设计题目:秒表 专业:供用电技术 班级:供电141 学号:140315143 姓名:王晨铭 指导教师:李昊 设计时间:2016.6.21

微控制器技术课程设计任务书 设计题目:秒表 设计时间:2016.6.20 设计任务: 在单片机开发板或软件仿真,编制程序,实现以下功能 1、利用定时器实现秒表功能,精确到0.1S; 2、数码管显示当前计时时间; 3、设定三个键,计时开始,停止计时和复位清零。 背景资料:1、单片机原理与应用 2、检测技术 3、计算机原理与接口技术 进度安排: 1、第1天,领取题目,熟悉设计内容,分解设计步骤和任务; 2、第3天,规划设计软硬件,编制程序流程、绘制硬件电路。 3、第5天,动手制作硬件电路,或编写软件,并调试。 4、第7天,中期检查。 5、第9天,完善设计内容,书写设计报告。 6、第13天,提交设计报告,整理设计实物,等待答辩。 7、第14天,设计答辩。

目录 一、设计任务和要求 (3) (1)设计任务 (3) (2)设计要求 (3) 二、设计方案与论证 (3) 三、单元电路设计与参数计算 (4) (1)时钟电路 (4) (2)按钮电路 (4) (3)显示电路 (5) (4)单片机 (5) 四、原理图及器件清单 (6) ( 1 )总原理图 (6) (2)PCB图 (7) (3)Proteus仿真图 (7) (4)元器件清单 (8) 五、安装与调试 (8) (1)安装 (8) (2)调试 (8) 六、性能测试和分析 (9) 七、结论和心得 (9) 八、参考文献 (9)

题目:秒表 二、方案设计与论证 本设计分为时钟电路、按钮电路、显示电路和单片机四大部分,这些模块中单片机占主控地位。其模块电路如图2-1所示。时钟电路常用的有内部时钟方式和外部时钟方式,但因为本设计中只需要一片单片机,所以采用内部时钟方式比较简单。按钮电路中的“复位”按钮是按键手动复位,它有电平和脉冲两种方式,比较电路的复杂程度,本设计选择了按钮电平复位电路,其他几个按钮则是通过单片机判断高低电平的不同来控制按钮。显示电路所用的数码管有共阴和共阳之分,不管使用何种数码管,P0口作为I/O使用时都是需要上拉电阻才能驱动数码管。另外,因为单片机的4个并行I/O口的输出电流一般是1mA,短路电流为4mA左右,而数码管的最少驱动电流也需要10mA,因而不管在使用共阴数码管时,单片机输出口也必须使用上拉电阻提高输出电流,才能驱动数码管。为了使电路简单化,本设计选用共阳数码管。但根据显示方式的不同选择,我们可以有几种方案: 方案一:使用静态显示方式。静态显示方式下的数码管的显示字符一经确定,相应锁存器锁存的断码输出將维持不变,直到送入另一个字符的断码为止。因而此设计中使用的显示位数使用了三个8位并行I/0口。如果另外想扩展单片机功能,则能使用的输出管脚很是有限。 方案二:使用动态显示方式。这个显示方式是将所有显示位的段码线的相应段并联在一起,由一个8位I/O口控制,而各位的共阴或共阴极分别由相应的I/O线控制,形成各位的分时选通。这种显示方式,简化了硬件电路,特别在多位数码管显示时尤为突出。 本小组尝试了各种方案,在此报告中以静态显示方式为例说明。(动态显示方式省略) 显示电路 单片机 AT89C51 时钟电路 按钮电路

基于51单片机的电子时钟的设计

目录 0 前言 (1) 1 总体方案设计 (2) 2 硬件电路设计 (2) 3 软件设计 (5) 4 调试分析及说明 (7) 5 结论 (9) 参考文献 (9) 课设体会 (10) 附录1 电路原理 (12) 附录2 程序清单 (13)

电子时钟的设计 许山沈阳航空航天大学自动化学院 摘要:传统的数字电子时钟采用了较多的分立元器件,不仅占用了很大的空间而且利用率也比很低,随着系统设计复杂度的不断提高,用传统时钟系统设计方法很难满足设计需求。 单片机是集CPU、RAM、ROM、定时器/计数器和多种接口于一体的微控制器。它体积小、成本低、功能强,广泛应用于智能产品和工业自动化上。而51系列的单片机是各单片机中最为典型和最有代表性的一种。,本次设计提出了系统总体设计方案,并设计了各部分硬件模块和软件流程,在用C语言设计了具体软件程序后,将各个模块完全编译通过过后,结果证明了该设计系统的可行性。该设计给出了以AT89C2051为核心,利用单片机的运算和控制功能,并采用系统化LED显示模块实时显示数字的设计方案,适当地解决了实际生产和日常生活中对计时高精确度的要求,因此该设计在现代社会中具有广泛的应用性。 关键字:AT89C2051,C语言程序,电子钟。 0前言 利用51单片机开发电子时钟,实现时间显示、调整和闹铃功能。具体要求如下: (1)按以上要求制定设计方案,并绘制出系统工作框图; (2)按要求设计部分外围电路,并与单片机仿真器、单片机实验箱、电源等正确可靠的连接,给出电路原理图; (3)用仿真器及单片机实验箱进行程序设计与调试;

(4)利用键盘输入调整秒、分和小时时刻,数码管显示时间; (5)实现闹钟功能,在设定的时间给出声音提示。 1总体方案设计 该电子时钟由89C51,BUTTON,1602 LCD液晶屏等构成,采用晶振电路作为驱动电路,利用单片机内部定时计数器0通过软件扩展产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。闹钟和时钟的时分秒的调节是由一个按键控制,而另外一个按键控制时钟和闹钟的时间的调节。 图1 系统结构框图 该电子时钟由STC89C51,BUTTON,1602 LCD液晶屏等构成,采用晶振电路作为驱动电路,晶振电路的晶振频率为12MHZ,使用的定时器/计数器工作方式0,通过软件扩展产生的一秒定时,达到时分秒的计时,60秒为一分钟,60分钟为一小时,24小时为一天,又重00:00:00开始计时。没有按键按键按下时,时钟正常运行,当按下调节时钟按键K1,就会关闭时钟,当按下闹钟按键K3时时钟就会进入设置时间界面,但是时钟不会停止工作,按K2键,,就可以对时钟和闹钟要设置的时间进行调整。 2硬件电路设计

AT89C51单片机时钟电路

工程设计 AT89C51单片机时钟电路 工程设计 目录 任务书 摘要 前言 说明书 第一章电路原理分析 1-1 显示原理 1-2 数码管结构及代码显示 1-3 键盘及读数原理 1-4 连击功能的实现 第二章程序设计思想和相关指令介绍 2-1 数据与代码转换 2-2 计时功能的实现与中断服务程序 2-3 时间控制功能与比较指令 2-4 时钟误差的分析 附录A 电路图 附录B 存储单元地址表 附录C 输入输出口功能分配表 附录D 定时中断程序流程图 附录F 调时功能流程图 附录G 程序清单 摘要

单片计算机即单片微型计算机。(Single-Chip Microcomputer ),是集 CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。他体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。而51 单片机是各单片机中最为典型和最有代表性的一种。这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。 前言 本文通过用对一个能实现定时,时钟,日历显示功能的时间系统的设计学习,详细介绍了51 单片机应用中的数据转换显示,数码管显示原理,动态扫描显示原理,单片机的定时中断原理、从而达到学习,了解单片机相关指令在各方面的应用。系统由AT89C51、LED 数码管、按键、二极管等部分构成,能实现时钟日历的功能:能进行时、分、秒的显示。也具有日历计算、显示和时钟,日历的校准、定时时间的设定,实现三路开关定时输出等功能。文章后附有电路图,程序清单,各数据存储单元的所在地址,输入输出口对应表。以供读者参考。因作者本人也是个初学者,水平有限,难免有疏落不足之处,敬请老师和同学能给与批评正。 说明书 系统由AT89C51、LED 数码管、按键、发光二极管等部分构成,能实现时间的调整、定时时间的设定,输出等功能。系统的功能选择由SB0、SB1、SB2、SB3、SB4 完成。其中SB0为时间校对,定时器调整功能键,按SB 0 进入调整状态。SB1 为功能切换键。第一轮按动SB1 依次进入一路、二路、三路定时时间设臵提示程序,按SB3 进入各路定时调整状态。定时时间到,二极管发亮。到了关断时间后灭掉。如果不进入继续按SB1 键,依次进入时间?年?位校对、?月?位校对、?日?位校对、?时?位校对、?分?位校对、?秒?位校对状态。不管是进入那种状态,按动SB2 皆可以使被调整位进行不进位增量加1 变化。各预臵量设臵完成后,系统将所有的设臵存入RAM 中,按SB1 退出调整状态。上电后,系统自动进入计时状态,起始于? 00?时? 00?分。SB4 为年月日显示转换键,可使原来显示时分秒转换显示年月日。 二、电路原理分析 1. 显示原理 电原理图见附图1。由6 个共阴极的数码管组成时、分、秒的显示。P0 口的8 条数据线P0.0 至P0.7 分别与两个CD4511 译码的ABCD 口相接,P2 口的P2.0 至P2.2 分别通过电阻R10 至R13 与VT1 至VT3 的基极相连接。这样通过P0 口送出一个存储单元的高位、低位BCD显示代码,通过P2 口送出扫描选通代码轮流点亮LED1 至LED6,就会将要显示的数据在数码管中显示出来。从P0 口输出的代码是BCD 码,从P2 口输出的就是位选码。 2. 数码管结构及代码显示

基于89C51单片机的秒表课程设计讲解

《单片机技术》 课程设计报告 题目:基于MCU-51单片机的秒表设计班级: 学号: 姓名: 同组人员: 指导教师:王瑞瑛、汪淳 2014年6月17日

目录 1课程设计的目的 (3) 2 课程设计题目描述和要求 (3) 2.1实验题目 (3) 2.2设计指标 (3) 2.3设计要求 (4) 2.4增加功能 (4) 2.5课程设计的难点 (4) 2.6课程设计内容提要 (4) 3 课程设计报告内容 (4) 3.1设计思路 (4) 3.2设计过程 (5) 3.3 程序流程及实验效果 (6) 3.4 实验效果 (13) 4 心得体会 (14)

基于 MCS-51单片机的秒表设计 摘要:单片机控制秒表是集于单片机技术、模拟电子技术、数字技术为一体的机电一体化高科技产品,具有功耗低,安全性高,使用方便等优点。本次设计内容为以 8051 单片机为核心的秒表,它采用键盘输入,单片机技术控制。设计内容以硬件电路设计,软件设计和 PCB 板制作三部分来设计。利用单片机的定时器/计数器定时和计数的原理,用集成电路芯片、LED 数码管以及按键来设计计时器。将软、硬件有机地结合起来,使他拥有正确的计时、暂停、清零、并同时可以用数码管显示,在现实生中应用广泛。 关键词:秒表;8051;定时器;计数器 1 课程设计的目的 《单片机应用基础》课程设计是学好本门课程的又一重要实践性教学环节,课程设计的目的就是配合本课程的教学和平时实验,以达到巩固消化课程的内容,进一步加强综合应用能力及单片机应用系统开发和设计能力的训练,启发创新思维,使之具有独立单片机产品和科研的基本技能,是以培养学生综合运用所学知识的过程,是知识转化为能力和能力转化为工程素质的重要阶段。 2 课程设计题目描述和要求 2.1实验题目 开始时,显示“00.0”,第一次按下按钮后开始从0-99.9s计时,显示精度为0.1s;对用有4个功能按键,第1个按键复位00.0,第2个按键正计时开始按钮,第3个按键复位99.9,第4个按钮倒计时开始。 2.2设计指标 了解8051芯片的的工作原理和工作方式,使用该芯片对 LED 数码管进行显示控制,实现用单片机的端口控制数码管,显示分、秒,并能用按钮实现秒表起

基于51单片机的电子时钟设计源程序

#include unsigned char DispBuf[6]; //时间显示缓冲区 unsigned char Disdate[6]; //日期显示缓冲区 unsigned char DisSec[6]; //秒表缓冲区 struct //设定时间结构体 { unsigned char Hour; unsigned char Min; unsigned char Sec; }Time; struct //设定日期结构体 { unsigned char Year; unsigned char Month; unsigned char Days; }Date; struct //设定毫秒结构体 { unsigned char Minite; unsigned char Second; unsigned char MilliSec; }Millisecond; unsigned char point=0; unsigned char point1=0; unsigned char point2=0; unsigned char Daymount; unsigned char Daymount1; unsigned char T0_Int_Times=0; //中断次数计数变量 unsigned char Flash_flag=0; //闪烁标志,每半秒闪烁 unsigned char Flash_flag1=0; //闪烁标志,每半秒闪烁 unsigned char DisPlay_Back=0; //显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致 unsigned char DisPlay_Back1=0; //显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致 unsigned char i,j; unsigned char SetMillisecond; //启动秒表 code unsigned char LEDCode[]={0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80}; //数码管显示代码 code unsigned char ErrorLEDCode[]={0x01,0xe7,0x12,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80};//绘制错误图纸的数码管显示代码 void DisPlayBuf(); void ChangeToDispCode(); void ChangeToDispCode1(); void changedate(); // 调日期 void displaydate(); // 显示日期 void makedays(); //确定每个月的日期 void runSec();

89C51单片机课程设计之秒表设计实验报告

单片机课程设计报告 单 片 机 秒 表 系 统 课 程 设 计 班级: 课程名称:秒表设计 成员: 实训地点:北校机房 实训时间:6月4日至6月15日

目录 1课程设计的目的和任务 1.1 单片机秒表课程设计的概述 1.2课程设计思路及描述 1.3 课程设计任务和要求 2硬件与软件的设计流程 2.1系统硬件方案设计 2.2所需元器件 3 程序编写流程及课程设计效果 3.1源程序及注释 3.2原理图分析 3.3课程设计效果 4 心得体会

1. 课程设计的目的和任务 1.1单片机秒表课程设计的概述 一、课程设计题目 秒表系统设计——用STC89C51设计一个4位LED数码显示“秒表”,显示时间为000.0~9分59.9秒,每10毫秒自动加一,每1000毫秒自动加一秒。 二、增加功能 增加一个“复位”按键(即清零),一个“暂停”和“开始”按键。 三、课程设计的难点 单片机电子秒表需要解决几个主要问题,一是有关单片机定时器的使用;二是如何实现LED的动态扫描显示;三是如何对键盘输入进行编程;四是如何进行安装调试。 四、课程设计内容提要 本课程利用单片机的定时器/计数器定时和记数的原理,结合集成电路芯片8051、LED数码管以及课程箱上的按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。其中本课程设计有三个开关按键:其中key1按键按下去时开始计时,即秒表开始键,key2按键按下去时数码管清零,复位为“00.00”. key3按键按下去时数码管暂停。 五、课程设计的意义 1)通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的 应用进一步的了解。 2)掌握定时器、外部中断的设置和编程原理。 3)通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。 4)该课程通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统, 拥有正确的计时、暂停、清零,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义 1.2课程设计思路及描述

51单片机电子时钟设计报告

电子时钟实验报告 全部代码在文档末尾:51单片机,LCD1602液晶显示屏平台下编程实现,可直接编译运行 目录: 一,实验目的 (1) 二,实验要求 (2) 三,实验基本原理 (2) 四,实验设计分析 (2) 五,实验要求实现 (3) A.电路设计 (3) 1. 整体设计 (3) 2. 分块设计 (4) 2.1 输入部分 (4) 2.2 输出部分 (5) 2.3 晶振与复位电路 (5) B.程序设计 (6) B.1 程序总体设计 (6) B.2 程序主要模块 (6) 五.实验总结及感想 (8) 一,实验目的 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以电子钟是以其小巧,价格低廉,走时精度高,使用方便,

功能多,便于集成化而受广大消费的喜爱,得到了广泛的使用。 1. 学习8051定时器时间计时处理、按键扫描及LCD液晶显示的设计方法。 2. 设计任务及要求利用实验平台上LCD1602液晶显示屏,设计带有闹铃功能的数字时钟 二,实验要求 A.基本要求: 1. 在LCD1602液晶显示屏上显示当前日期,时间。 2. 利用按键可对时间及闹玲进行设置,并可显示设置闹玲的时间。闹玲时间到蜂鸣器发出 声响,一分钟后闹铃停止。 B.扩展部分: 1.日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并调整)实现年月日时分秒的调整,星期准确的随着日期改变而改变进行显示。 2.定时功能(设定一段时间长度,定时到后,闹铃提示) C.可扩展部分: 1.闹铃重响功能(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响时间的间隔可调) 2.可进行备忘录提示,按照年月日,可在设定的某年某月进行闹铃提示。 三,实验基本原理 利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.05s中断一次并当作一个计数,设定定时1秒的中断计数初值为20,每中断一次中断计数初值加1,当减到20时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了,是否一天到了,是否一个月到了,是否一年到了。 将时间在LCD液晶屏上显示,降低了程序的编写难度。LCD的固定显示特性是我们省去了数码管的动态扫描显示。 四,实验设计分析 针对要实现的功能,采用AT89S52单片机进行设计,AT89S52 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结

89C51单片机最小系统设计(电子时钟,秒表,按键计数的单片机设计)

一、电子时钟、秒表和计数器的设计 1、实现的功能: 1)有key0,key1两个功能按键,复位后,数码管会默认显示时钟模式HH.MM 。 (HH表示小时,MM表示分钟), key0短按一次就进入到了秒表模式,数码管显示格式S.SS.S,(分别表示百秒,秒,毫秒) key0再短按一次就进入到了计数器模式,数码管显示格式CCCC(分别为千位百位十位个位)。 key0再短按一次,又进入到了时钟显示模式,就这样由key0控制模式的转换。 2)有RST复位键,本身电路设计有上电自动复位功能,按下RST后,电路复位。 3)有ckey0,ckey1 两个计数按键,按下ckey0,计数加一,按下ckey1,计数减一。 4) 电子时钟和秒表时间计时方法是采用89S52内部计时器0的一种工作方式(详见后面 的代码分析),通过计时器0中断来控制时间的运行。 5)计数器是采用外部中断0和外部中断1这两个外部中断实现加1和减1的操作。 (1)电子时钟模式:(以下“长按”表示按下按键的时间大于1秒,“短按”表示按下的时间小于0.7 秒)1)长按key1一次,会进入到调整分钟的模式,短按key1一次,分钟会加一。 第二次长按key1,会进入到调整小时的模式,短按key1一次,小时加一。 第三次长按key1,重新回到时钟显示模式,这时再短按key1,时间不会变化2)长按key0一次,会进入到显示秒的模式 (2)秒表模式: 1)由key0控制进入秒表模式后,短按key1一次,秒表计时开始,再短按key1一次计时结束 2)长按key1一次,秒表清零 (3)计数器模式 1)按ckey0一下,计数加一,数码管相应的显示的数值加一, 按ckey1一下,计数减一,数码管相应的显示的数值减一, 由于数码管的位数限制,最大只能显示到9999,此时按下ckey0无反应;考虑到 实际计数功能,没有设置负数,所以最小显示0000,这时按下ckey1 ,无反应。 2)长按key1一次计数器清零。 2、电路原理图

51单片机的电子时钟设计

基于51单片机的电子时钟设计 摘要:本文介绍了基于51单片机的电子时钟的设计,从硬件和软件两个方面给出了具体实现过程。该时钟的设计采用功能分块的思想方法,将硬件电路划分为开关电路,显示驱动电路和数码管电路等若干独立模块,而软件的实现则由闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等组成。文中给出了各个模块的电路图,并用Proteus的ISIS软件对电子时钟系统的各个功能进行了仿真,并给出了相应的仿真结果图像。 关键词:单片机;电子时钟;键盘控制 Electronic Clock Design Based on 51 Single-chip *** Shandong Institute of Business and Technology , 264005 Abstract:This paper introduces the electronic clock design based on 51 single-chip microcomputer, and it provides us specific implementation process from aspects of hardware and software. This clock is designed by the method of function blocks. In hardware, it’s circuit is divided into switch block, display drive block and digital control block. However, the software consist of the program of alarm clock, time display, date display, stopwatch display, time adjust, timing adjustment, the alarm clock adjustment, time delay and so on. Circuit diagrams of each module is also given and the corresponding simulation image of this clock produced by software of Proteus is also showed in this paper. Key words:single chip microcomputer; electronic clock;Keyboard control 一,引言 1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,

89C51单片机课程设计之秒表设计实验报告.

这里可以加学校LOGAL 单片机课程设计报告 院系:12级物信系 班别:光信息科学与技术7班 课程名称:秒表设计 姓名:龚俊才欧一景 学号:1210407033 1210407041 指导老师:张涛 2011.12.23

目录 1课程设计的目的和任务 1.1 单片机秒表课程设计的概述 1.2课程设计思路及描述 1.3 课程设计任务和要求 2硬件与软件的设计流程 2.1系统硬件方案设计 2.2软件方案设计 3 程序编写流程及课程设计效果3.1源程序及注释 3.2原理图分析 3.3课程设计效果 4 心得体会 5 相关查阅资料

1. 课程设计的目的和任务 1.1单片机秒表课程设计的概述 一、课程设计题目 秒表系统设计——用STC89C52RC设计一个4位LED数码显示“秒表”,显示时间为 00.00~99.99秒,每10毫秒自动加一,每1000毫秒自动加一秒。 二、增加功能 增加一个“复位”按键(即清零),一个“暂停”和“开始”按键。 三、课程设计的难点 单片机电子秒表需要解决三个主要问题,一是有关单片机定时器的使用;二是如何实现LED 的动态扫描显示;三是如何对键盘输入进行编程。 四、课程设计内容提要 本课程利用单片机的定时器/计数器定时和记数的原理,结合集成电路芯片8051、LED数码管以及课程箱上的按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。其中本课程设计有两个开关按键:其中key1按键按下去时开始计时,即秒表开始键(同时也用作暂停键),key2按键按下去时数码管清零,复位为“00.00”. 五、课程设计的意义 1)通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步 的了解。 2)掌握定时器、外部中断的设置和编程原理。 3)通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。 4)该课程通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的 计时、暂停、清零,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义 六、课程设计仪器 a) 集成电路芯片8051,七段数码管,89C51单片机开发板 b) MCS-51系列单片机微机仿真课程系统中的软件(Keil uvision2)。

51单片机简易可调的数码管电子钟程序

#include sbit KEY1=P3^0; sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; sbit LED=P1^2; code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0-9 unsigned char StrTab[8]; //定义缓冲区 unsigned char minute=30,hour=12,second; //定义并且初始化值12:30:00 void delay(unsigned int cnt)//延时函数 { while(--cnt); } void Displaypro(void) { StrTab[0]=tab[hour/10]; //显示正常时间 StrTab[1]=tab[hour%10]; StrTab[2]=0xBF; StrTab[3]=tab[minute/10]; StrTab[4]=tab[minute%10]; StrTab[5]=0xBF; StrTab[6]=tab[second/10]; StrTab[7]=tab[second%10]; } main()//主函数 { TMOD |=0x01;//定时器0 10ms in 12M crystal 用于计时 TH0=0xd8; TL0=0xf0; ET0=1; TR0=1; TMOD |=0x10; //定时器1用于动态扫描 TH1=0xF8; TL1=0xf0; ET1=1; TR1=1; EA =1; Displaypro();

基于51单片机的数字时钟设计_毕业设计

基于51单片机的数字时钟设计 目录 摘要 (1) Abstract (2) 第一章绪论 (3) 1.1 数字时钟设计的背景 (3) 第二章AT89C51单片机简介 (3) 2.1 单片机介绍 (3) 2.2 单片机的应用特点 (4) 2.3 单片机的应用领域 (4) 2.4 单片机的中断与定时系统 (4) 2.4.1 MCS-51单片机中断系统 (4) 2.4.2 MCS-51 单片机的定时器/计数器 (6) 2.4.3 MCS-51定时器/计数器的四种工作方式 (6) 2.5 AT89C51引脚功能介绍 (7) 第三章设计方案 (8) 3.1 主程序 (8) 3.2 数码管显示模块 (9) 3.3 定时器计数器T0中断服务程序 (9) 3.4按键处理模块 (10) 第四章硬件电路设计 (10) 4.1 复位电路 (10) 4.2 时钟电路 (11) 4.3 按键电路 (12) 4.4 数码管显示电路 (13) 4.5 电源电路设计 (13) 第五章软件设计与程序代码 (14) 5.1 软件选择与介绍 (14) 5.1.1 软件介绍 (14) 5.1.2 Proteus7.8的特点 (15) 5.2 软件仿真电路全图 (15) 5.3 源程序代码 (16) 第六章结论 (20) 参考文献 (21) 致谢 (22)

摘要 近几年,单片机在各个领域得到广泛的应用。从工业到人们的日常生活,大部分的科技产品都是通过单片机来控制。在它问世之前,自动控制设备得不到广泛的应用,这是因为控制设备的体积庞大,耗电量大,价格昂贵。在第一台微处理器成功研制不久,第一个单片机就问世了。因为其小巧的体积,低功耗,以及高效的性能,单片机受到了大家的欢迎。 本设计利用Atmel公司的AT89C52单片机对电子时钟进行开发,设计了实现所需功能的硬件电路,应用C语言进行软件编程,并用Proteus软件进行演示、验证。主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机80C51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机的数字电子时钟。它的计时周期为24小时,显满刻度为“23时59分59秒”,且配有4个独立键盘,可以灵活地调节时间和日期,并具有一定的扩展性。 关键词:单片机,数字时钟,动态显示,LED数码管显示,独立按键

相关文档
相关文档 最新文档