quartus 数字时钟分频器仿真怎么设置时钟信号

quartus 数字时钟分频器仿真怎么设置时钟信号,第1张

首先把要设置的信号点一下,然后找到一个像时钟一样的按钮,再点一下。接下来设置的问对话框就d出来了。这个仿真里面用时钟周期要用ns(纳秒)作答单位,设成几十纳秒就行。另外,这个图应该是仿真结果,要在没有除权结果的仿真文件里面设置。

扩展资料:

数字时钟设计

数字电子技术的迅速发展,使各种类型集成电路在数字系统、控制系统、信号处理等方面得到了广泛的应用。为了适应现代电子技术的迅速发展需要,能够较好的面向数字化和专用集成电路的新时代,数字电路综合设计与制作数字钟,可以让我们了解数字时钟的原理。

在实验原理的指导下,培养了分析和设计电路的能力。并且学会检查和排除故障,提高分析处理实验结果的能力。

数字时钟是一种用数字电路技术实现时、分、秒计时的装置。与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,已得到广泛的使用。

数字钟从原理上讲是一种典型的数字电路,一般是由振荡器、分频器、计数器、显示器等几部分组成。其中包括了组合逻辑电路和时序电路。

数字时钟以其体积小、重量轻、抗干扰能力强、对环境要求高、高精确性、容易开发等特性,在工业控制系统、智能化器仪表、办公自动化等诸多领域取得了极为广泛的应用。

参考资料来源:数字时钟--百度百科

用这个程序吧 C和汇编都有。

数字钟[★]

1. 实验任务

(1. 开机时,显示12:00:00的时间开始计时;

(2. P00/AD0控制“秒”的调整,每按一次加1秒;

(3. P01/AD1控制“分”的调整,每按一次加1分;

(4. P02/AD2控制“时”的调整,每按一次加1个小时;

2. 电路原理图

图4201

3. 系统板上硬件连线

(1. 把“单片机系统”区域中的P10-P17端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;

(2. 把“单片机系统:区域中的P30-P37端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;

(3. 把“单片机系统”区域中的P00/AD0、P01/AD1、P02/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;

4. 相关基本知识

(1. 动态数码显示的方法

(2. 独立式按键识别过程

(3. “时”,“分”,“秒”数据送出显示处理方法

5. 程序框图

6. 汇编源程序

SECOND EQU 30H

MINITE EQU 31H

HOUR EQU 32H

HOURK BIT P00

MINITEK BIT P01

SECONDK BIT P02

DISPBUF EQU 40H

DISPBIT EQU 48H

T2SCNTA EQU 49H

T2SCNTB EQU 4AH

TEMP EQU 4BH

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0

START: MOV SECOND,#00H

MOV MINITE,#00H

MOV HOUR,#12

MOV DISPBIT,#00H

MOV T2SCNTA,#00H

MOV T2SCNTB,#00H

MOV TEMP,#0FEH

LCALL DISP

MOV TMOD,#01H

MOV TH0,#(65536-2000) / 256

MOV TL0,#(65536-2000) MOD 256

SETB TR0

SETB ET0

SETB EA

WT: JB SECONDK,NK1

LCALL DELY10MS

JB SECONDK,NK1

INC SECOND

MOV A,SECOND

CJNE A,#60,NS60

MOV SECOND,#00H

NS60: LCALL DISP

JNB SECONDK,$

NK1: JB MINITEK,NK2

LCALL DELY10MS

JB MINITEK,NK2

INC MINITE

MOV A,MINITE

CJNE A,#60,NM60

MOV MINITE,#00H

NM60: LCALL DISP

JNB MINITEK,$

NK2: JB HOURK,NK3

LCALL DELY10MS

JB HOURK,NK3

INC HOUR

MOV A,HOUR

CJNE A,#24,NH24

MOV HOUR,#00H

NH24: LCALL DISP

JNB HOURK,$

NK3: LJMP WT

DELY10MS:

MOV R6,#10

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

DISP:

MOV A,#DISPBUF

ADD A,#8

DEC A

MOV R1,A

MOV A,HOUR

MOV B,#10

DIV AB

MOV @R1,A

DEC R1

MOV A,B

MOV @R1,A

DEC R1

MOV A,#10

MOV@R1,A

DEC R1

MOV A,MINITE

MOV B,#10

DIV AB

MOV @R1,A

DEC R1

MOV A,B

MOV @R1,A

DEC R1

MOV A,#10

MOV@R1,A

DEC R1

MOV A,SECOND

MOV B,#10

DIV AB

MOV @R1,A

DEC R1

MOV A,B

MOV @R1,A

DEC R1

RET

INT_T0:

MOV TH0,#(65536-2000) / 256

MOV TL0,#(65536-2000) MOD 256

MOV A,#DISPBUF

ADD A,DISPBIT

MOV R0,A

MOV A,@R0

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P1,A

MOV A,DISPBIT

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P3,A

INC DISPBIT

MOV A,DISPBIT

CJNE A,#08H,KNA

MOV DISPBIT,#00H

KNA: INC T2SCNTA

MOV A,T2SCNTA

CJNE A,#100,DONE

MOV T2SCNTA,#00H

INC T2SCNTB

MOV A,T2SCNTB

CJNE A,#05H,DONE

MOV T2SCNTB,#00H

INC SECOND

MOV A,SECOND

CJNE A,#60,NEXT

MOV SECOND,#00H

INC MINITE

MOV A,MINITE

CJNE A,#60,NEXT

MOV MINITE,#00H

INC HOUR

MOV A,HOUR

CJNE A,#24,NEXT

MOV HOUR,#00H

NEXT: LCALL DISP

DONE: RETI

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H

TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH

END

7. C语言源程序

#include <AT89X51H>

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0x00};

unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};

unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};

unsigned char dispbitcnt;

unsigned char second;

unsigned char minite;

unsigned char hour;

unsigned int tcnt;

unsigned char mstcnt;

unsigned char i,j;

void main(void)

{

TMOD=0x02;

TH0=0x06;

TL0=0x06;

TR0=1;

ET0=1;

EA=1;

while(1)

{

if(P0_0==0)

{

for(i=5;i>0;i--)

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

if(P0_0==0)

{

second++;

if(second==60)

{

second=0;

}

dispbuf[0]=second%10;

dispbuf[1]=second/10;

while(P0_0==0);

}

}

if(P0_1==0)

{

for(i=5;i>0;i--)

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

if(P0_1==0)

{

minite++;

if(minite==60)

{

minite=0;

}

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

while(P0_1==0);

}

}

if(P0_2==0)

{

for(i=5;i>0;i--)

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

if(P0_2==0)

{

hour++;

if(hour==24)

{

hour=0;

}

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

while(P0_2==0);

}

}

}

}

void t0(void) interrupt 1 using 0

{

mstcnt++;

if(mstcnt==8)

{

mstcnt=0;

P1=dispcode[dispbuf[dispbitcnt]];

P3=dispbitcode[dispbitcnt];

dispbitcnt++;

if(dispbitcnt==8)

{

dispbitcnt=0;

}

}

tcnt++;

if(tcnt==4000)

{

tcnt=0;

second++;

if(second==60)

{

second=0;

minite++;

if(minite==60)

{

minite=0;

hour++;

if(hour==24)

{

hour=0;

}

}

}

dispbuf[0]=second%10;

dispbuf[1]=second/10;

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

}

}

#include <reg51h>

#include <intrinsh>

unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"};

unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};//星期月参变数

unsigned char data dis_buf1[16];//lcd上排显示缓冲区

unsigned char data dis_buf2[16];//lcd下排显示缓冲区

unsigned char data year,month,date,week;//年、月、日、星期

unsigned char data armhour,armmin,armsec;//闹钟时、分、秒

unsigned char data hour,min,sec,sec100;//时、分、秒、百分之一秒

unsigned char data flag,vkey,skey;//设置状态计数标志、按键先前值、按键当前值

bitalarm;//标识是否启用闹钟,1--启用,0--关闭

sbit rs = P2^0;//LCD数据/命令选择端(H/L)

sbit rw = P2^1;//LCD读/写选择端(H/L)

sbit ep = P2^2;//LCD使能控制

sbitPRE = P3^3;//调整键(AN3)

sbitSET = P3^4;//调整键(AN4)

sbitSPK = P3^6;

void delayms(unsigned char ms);//延时程序

bit lcd_busy();//测试LCD忙碌状态程序

void lcd_wcmd(char cmd);//写入指令到LCD程序

void lcd_wdat(char dat);//写入数据到LCD程序

void lcd_pos(char pos);//LCD数据指针位置程序

void lcd_init();//LCD初始化设定程序

void pro_timedate();//时间日期处理程序

void pro_display();//显示处理程序

void pro_key();//按键处理程序

void time_alarm();//定时报警功能(闹钟)

unsigned char scan_key();//按键扫描程序

unsigned char week_proc();//星期自动计算与显示函数

bit leap_year();//判断是否为闰年

void lcd_sef_chr();//LCD自定义字符程序

void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s);

//更新显示缓冲区函数

// 延时程序

void delay(unsigned char ms)

{while(ms--)

{unsigned char i;

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

{

_nop_(); //执行一条_nop_()指令为一个机器周期

_nop_();

_nop_();

_nop_();

}

}

}

//测试LCD忙碌状态

bit lcd_busy()

{

bit result;

rs = 0;

rw = 1;

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

result =(bit)(P0&0x80);//LCD的D0--D7中,D7=1为忙碌,D7=0为空闲

ep = 0;

return result;

}

//写入指令到LCD

void lcd_wcmd(char cmd)

{

while(lcd_busy());//当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令

rs = 0;

rw = 0;

ep = 0;

_nop_();

_nop_();

P0 = cmd;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 0;

}

//写入数据到LCD

void lcd_wdat(char dat)

{

while(lcd_busy());//当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据

rs = 1;

rw = 0;

ep = 0;

P0 = dat;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 0;

}

//LCD数据指针位置程序

void lcd_pos(char pos)

{

lcd_wcmd(pos|0x80);//数据指针=80+地址码(00H~27H,40H~67H)

}

//设定二个自定义字符,(注意:LCD1602中自定义字符的地址为0x00--0x07,即可定义8个字符)

//这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)

void lcd_sef_chr()

{//第一个自定义字符

lcd_wcmd(0x40);//"01 000 000" 第1行地址 (D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))

lcd_wdat(0x1f);//"XXX 11111"第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)

lcd_wcmd(0x41);//"01 000 001" 第2行地址

lcd_wdat(0x11);//"XXX 10001"第2行数据

lcd_wcmd(0x42);//"01 000 010" 第3行地址

lcd_wdat(0x15);//"XXX 10101"第3行数据

lcd_wcmd(0x43);//"01 000 011" 第4行地址

lcd_wdat(0x11);//"XXX 10001"第4行数据

lcd_wcmd(0x44);//"01 000 100" 第5行地址

lcd_wdat(0x1f);//"XXX 11111"第5行数据

lcd_wcmd(0x45);//"01 000 101" 第6行地址

lcd_wdat(0);//"XXX 01010"第6行数据

lcd_wcmd(0x46);//"01 000 110" 第7行地址

lcd_wdat(0x1f);//"XXX 11111"第7行数据

lcd_wcmd(0x47);//"01 000 111" 第8行地址

lcd_wdat(0x00);//"XXX 00000"第8行数据

//第二个自定义字符

lcd_wcmd(0x48);//"01 001 000" 第1行地址

lcd_wdat(0x01);//"XXX 00001"第1行数据

lcd_wcmd(0x49);//"01 001 001" 第2行地址

lcd_wdat(0x1b);//"XXX 11011"第2行数据

lcd_wcmd(0x4a);//"01 001 010" 第3行地址

lcd_wdat(0x1d);//"XXX 11101"第3行数据

lcd_wcmd(0x4b);//"01 001 011" 第4行地址

lcd_wdat(0x19);//"XXX 11001"第4行数据

lcd_wcmd(0x4c);//"01 001 100" 第5行地址

lcd_wdat(0x1d);//"XXX 11101"第5行数据

lcd_wcmd(0x4d);//"01 001 101" 第6行地址

lcd_wdat(0x1b);//"XXX 11011"第6行数据

lcd_wcmd(0x4e);//"01 001 110" 第7行地址

lcd_wdat(0x01);//"XXX 00001"第7行数据

lcd_wcmd(0x4f);//"01 001 111" 第8行地址

lcd_wdat(0x00);//"XXX 00000"第8行数据

}

//LCD初始化设定

void lcd_init()

{

lcd_wcmd(0x38);//设置LCD为16X2显示,5X7点阵,八位数据借口

delay(1);

lcd_wcmd(0x0c);//LCD开显示及光标设置(光标不闪烁,不显示"-")

delay(1);

lcd_wcmd(0x06);//LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)

delay(1);

lcd_wcmd(0x01);//清除LCD的显示内容

delay(1);

}

//闰年的计算

bit leap_year()

{

bit leap;

if((year%4==0&&year%100!=0)||year%400==0)//闰年的条件

leap=1;

else

leap=0;

return leap;

}

//星期的自动运算和处理

unsigned char week_proc()

{unsigned char num_leap;

unsigned char c;

num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年数

if( leap_year()&& month<=2 ) //既是闰年且是1月和2月

c=5;

else

c=6;

week=(year+para_month[month]+date+num_leap+c)%7;//计算对应的星期

return week;

}

//更新显示缓冲区

void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s)

{dis_buf1[0]=t1; //

dis_buf1[1]=0x20; //空格

dis_buf1[2]=50; //'2'

dis_buf1[3]=48; //'0'

dis_buf1[4]=year/10+48;

dis_buf1[5]=year%10+48;

dis_buf1[6]=0x2d;

dis_buf1[7]=month/10+48;

dis_buf1[8]=month%10+48;

dis_buf1[9]=0x2d; //'-'

dis_buf1[10]=date/10+48;

dis_buf1[11]=date%10+48;

dis_buf1[12]=0x20;

dis_buf1[13]=dis_week[4week];

dis_buf1[14]=dis_week[4week+1];

dis_buf1[15]=dis_week[4week+2];

dis_buf2[0]=t2[0];

dis_buf2[1]=t2[1];

dis_buf2[2]=t2[2];

dis_buf2[3]=t2[3];

dis_buf2[4]=t2[4];

dis_buf2[5]=t2[5];

dis_buf2[6]=t2[6];//空格

if (alarm)

dis_buf2[7]=0x01;//alarm=1,显示闹钟启用标致(第二个自定义字符)

else

dis_buf2[7]=0x20;//alarm=0,不显示闹钟启用标致

dis_buf2[8]=dis_h/10+48;

dis_buf2[9]=dis_h%10+48;

dis_buf2[10]=0x3a;//':'

dis_buf2[11]=dis_m/10+48;

dis_buf2[12]=dis_m%10+48;

dis_buf2[13]=0x3a;

dis_buf2[14]=dis_s/10+48;

dis_buf2[15]=dis_s%10+48;

}

//时间和日期处理程序

void pro_timedate()

{

sec++;

if(sec > 59)

{sec = 0;

min++;

if(min>59)

{min=0;

hour++;

if(hour>23)

{hour=0;

date++;

if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)

if (date>31) {date=1;month++;}//大月31天

if (month==4||month==6||month==9||month==11)

if (date>30) {date=1;month++;}//小月30天

if (month==2)

{if( leap_year())//闰年的条件

{if (date>29) {date=1;month++;}}//闰年2月为29天

else

{if (date>28) {date=1;month++;}}//平年2月为28天

}

if (month>12) {month=1;year++;}

if (year>99) year=0;

}

}

}

week_proc();

if (sec==armsec && min==armmin && hour==armhour)

{if (alarm)

TR1=1;//闹钟启用时,报警时间到,启动Timer1

}

}

//显示处理程序

void pro_display()

{unsigned char i;

lcd_pos(0x00);

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

{lcd_wdat(dis_buf1[i]);}

lcd_pos(0x40);

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

{lcd_wdat(dis_buf2[i]);}

}

//Timer0中断处理程序,秒的产生

void timer0() interrupt 1

{

TH0=0xD8;

TL0=0xF0;

sec100++;

if(sec100 >= 100)//1秒时间 (10010ms=1000ms=1s)

{sec100 = 0;

pro_timedate();//调用时间和日期处理程序

}

if (sec&0x01)//"RICHMCU"闪一秒,停一秒

update_disbuf(0x00," ",hour,min,sec); //0x00表示显示00位置的自定义字符

else

update_disbuf(0x00,"RICHMCU",hour,min,sec);

pro_display(); //调用显示处理函数

}

//按键扫描程序

unsigned char scan_key()

{

skey=0x00;//给变量vkey置初值

skey|=PRE;//读取PRE键的状态

skey=skey<<1;//将PRE键的状态存于skey的B1位

skey|=SET;//读取SET键的状态,并存于skey的B0位

return skey;//返回skey的键值(即PRE,SET的状态)

}

//外部中断INT0中断处理程序

void int0() interrupt 0

{

TR0=0;//禁止Timer0

IE=0;//禁止中断

lcd_wcmd(0x0e);//显示光标"_",整个光标不闪烁

alarm=1;

update_disbuf(0x50,"alarm:",armhour,armmin,armsec);//更新显示数据,0x50表示要显示"P"

pro_display();//调用显示处理程序

lcd_pos(0x47); //使光标位于第一个调整项下

flag=0;

vkey=0x03;

while(flag^0)

{skey = scan_key();//扫描按键状态

if (skey^vkey)//若skey与vkey相同,跳出循环,相异执行循环体

{delay(10);//去按键抖动

skey = scan_key();//转回扫描按键状态

if (skey^vkey)//若skey与vkey相同,跳出循环,相异执行循环体

{vkey=skey;//将skey的值付给vkey

if (skey==0x01)//PRE键按下

{ flag++;//调整标志位加1

switch (flag)//将光标置于相应调整位置

{

case 1: lcd_pos(0x49);break;//光标置小时报警设置位置

case 2:lcd_pos(0x4c);break;//光标置分钟报警设置位置

case 3:lcd_pos(0x4f);break;//光标置秒时报警设置位置

case 4:update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x05);break;//光标置年调整位置

case 5:lcd_pos(0x08);break;//光标置月调整位置

case 6:lcd_pos(0x0b);break;//光标置日调整位置

case 7: lcd_pos(0x49);break;//光标置时调整位置

case 8:lcd_pos(0x4c);break;//光标置分调整位置

case 9:lcd_pos(0x4f);break;//光标置秒调整位置

default:break;

}

}

if (skey==0x02) //SET键按下

{pro_key();//转设置按键处理程序

}

}

}

}

lcd_wcmd(0x0c);//设置LCD开显示及光标不闪烁,不显示"-"

lcd_wcmd(0x01); //清除LCD的显示内容

IE=0x8f; //CPU开中断,INT0,INT1,开中断

TR0=1;//Timer0启动

}

//主程序,初始化及初值设定

void main()

{

lcd_init(); //初始化LCD

lcd_sef_chr();//写入自定义字符号

hour=0;min=0;sec=0; //开机时的时,分,秒显示

armhour=0;armmin=0;armsec=0;//开机时的时,分,秒报警初值

year= 5; month=1;date=1; //开机时的年,月,日,星期显示

week_proc();

alarm=1;//初始开机,启用闹钟

IE = 0x8f;//CPU开中断,INT0,INT1,Timer0,Timer1开中断

IP = 0x04;//设置INT0为中断最高优先级

IT0=0;IT1=0;//外部INT0,INT1设置为电平触发方式(注意,触发不要选边沿方式,易误动)

TMOD = 0x11;//Timer0,Timer1工作于模式1, 16位定时方式

TH0 = 0xdc;TL0 = 0x00;//Timer0置10ms定时初值

TH1 = 0xff;TL1 = 0x00;//Timer1置初值

TR0 = 1;//Timer0启动

TR1 = 0;

while(1);

}

//设置按键处理程序

void pro_key()

{

switch (flag)

{

case 0:alarm=!alarm;//启用或关闭闹钟(alarm=1:启用,alarm=0:关闭)

update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新显示数据

pro_display();//调用显示处理

lcd_pos(0x47);break;//光标回到原调整位置

case 1:armhour++;

if (armhour>23) armhour=0;

update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新显示数据

pro_display();//调用显示处理

lcd_pos(0x49);break;//光标回到原调整位置

case 2:armmin++;

if (armmin>59) armmin=0;

update_disbuf(0x50,"alarm:",armhour,armmin,armsec);

pro_display();

lcd_pos(0x4c);break;

case 3:armsec++;

if (armsec>59) armsec=0;

update_disbuf(0x50,"alarm:",armhour,armmin,armsec);

pro_display();

lcd_pos(0x4f);break;

case 4:year++;

if(year> 99) year= 0;

week_proc(); //星期自动运算

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x05);break;

case 5:month++;

if (month>12) month=1;

week_proc();//星期自动运算

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x08);break;

case 6:date++;

if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)

if (date>31) date=1;//大月31天

if (month==4||month==6||month==9||month==11)

if (date>30) date=1;//小月30天

if (month==2)

{if(leap_year())//闰年的条件

{if (date>29) date=1;}//闰年2月为29天

else

{if (date>28) date=1;}}//平年2月为28天

week_proc(); //星期自动运算

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x0b);break;

case 7:hour++;

if (hour>23) hour=0;

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x49);break;

case 8:min++;

if (min>59) min=0;

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x4c);break;

case 9:sec++;

if (sec>59) sec=0;

update_disbuf(0x50,"time: ",hour,min,sec);

pro_display();

lcd_pos(0x4f);break;

default: break ;

}

}

//Timer1中断处理程序,产生报警的声音

void timer1() interrupt 3

{

TH1=0xff;

TL1=0x00;

SPK=~SPK;

}

//外部中断INT1中断处理程序,停止报警声音

void int1() interrupt 2

{

if(TR1)

TR1=0;

}

实验说明:

按K1按键进入设定状态

按K2,依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,直到退出设置状态

按K3,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字

LCD第二排中间显示小喇叭,表示启用闹钟功能,无则禁止闹钟功能(可在调整状态进行设置)

正常状态,LCD上排最前面显示自定义字符,LCD下排最前面闪动"RICHMCU"

设置状态,LCD上排最前面显示"P",下排最前面在设置闹钟时间时显示"alarm:",其它状态显示"time"

年代变化2000--2099,星期自动转换

望采纳,谢谢~~

那几个发光二极管自己加就行了

s_set bit p10

m_set bit p11

h_set bit p12

second equ 30h

minute equ 31h

hour equ 32h

tcnt equ 34h

org 0000h

sjmp start

org 000bh

ljmp int_t0

start:mov dptr,#table

mov hour,#0

mov minute,#0

mov second,#0

mov tcnt,#0

mov tmod,#01h

mov th0,#3ch

mov tl0,#0b0h

mov ie,#82h

setb tr0

a1:lcall display

jnb s_set,s1

jnb m_set,s2

jnb h_set,s3

ljmp a1

s1:lcall delay

jb s_set,a1

inc second

mov a,second

cjne a,#60,j0

mov second,#0

ljmp k1

s2:lcall delay

jb m_set,a1

k1:inc minute

mov a,minute

cjne a,#60,j1

mov minute,#0

ljmp k2

s3:lcall delay

jb h_set,a1

k2:inc hour

mov a,hour

cjne a,#24,j2

mov hour,#0

mov minute,#0

mov second,#0

ljmp a1

j0:jb s_set,a1

lcall display

sjmp j0

j1:jb m_set,a1

lcall display

sjmp j1

j2:jb h_set,a1

lcall display

sjmp j2

int_t0:mov th0,#3ch

mov tl0,#0b0h

inc tcnt

mov a,tcnt

cjne a,#20,retune

inc second

mov tcnt,#0

mov a,second

cjne a,#60,retune

inc minute

mov second,#0

mov a,minute

cjne a,#60,retune

inc hour

mov minute,#0

mov a,hour

cjne a,#24,retune

mov hour,#0

mov minute,#0

mov second,#0

mov tcnt,#0

retune:reti

display:mov a,second

mov b,#10

div ab

clr p34

movc a,@a+dptr

mov p0,a

lcall delay

setb p34

mov a,b

clr p35

movc a,@a+dptr

mov p0,a

lcall delay

setb p35

MOV A,MINUTE

MOV B,#10

div ab

clr p32

movc a,@a+dptr

mov p0,a

lcall delay

setb p32

mov a,b

clr p33

movc a,@a+dptr

mov p0,a

lcall delay

setb p33

mov a,hour

mov b,#10

div ab

clr p30

movc a,@a+dptr

mov p0,a

lcall delay

setb p30

mov a,b

clr p31

movc a,@a+dptr

mov p0,a

lcall delay

setb p31

ret

table:db 3fh,06h,5bh,4fh,66h

db 6dh,7dh,07h,7fh,6fh

delay:mov r6,#10

d1:mov r7,#250

djnz r7,$

djnz r6,d1

ret

end

以上就是关于quartus 数字时钟分频器仿真怎么设置时钟信号全部的内容,包括:quartus 数字时钟分频器仿真怎么设置时钟信号、用单片机制作可调数字时钟要汇编语言程序的、急求一个用51单片机编的可按键调时的数字时钟程序,数码管显示,C语言编写,谢谢。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10122021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存