首先把要设置的信号点一下,然后找到一个像时钟一样的按钮,再点一下。接下来设置的问对话框就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语言编写,谢谢。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)