求89c52单片机 C语言实现数字时钟程序
你好!
你的功能没有描述清楚,是这样的效果吗,私。信。说。明。一。下。
这个是简单的数码管时钟显示如果有需要,我写过比较完善的1602显示时钟.显示控制年月日等等.#include
sbit Begin=P2^0;
sbit Hour=P2^1;
sbit Mus=P2^2;
sbit End=P2^3;
unsigned char code Tab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
unsigned char code num[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char Time[]={0,0,16,0,0,16,0,0};
unsigned char a;
unsigned int x,m,th;
void init()
{
TMOD=0x01;
TH0=(65535/50000)/256;
TL0=(65535/50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
unsigned char keyboard()
{
if(Begin==0){
delay(5);
if(Begin==0)
return 1;
}
if(Hour==0){
delay(30);
if(Hour==0)
return 2;
}
if(Mus==0)
return 3;
if(End==0)
return 4;
}
void display()
{
unsigned char i; for(i=0;i<8;i++)
{
P3=num[i];
P0=Tab[Time[i]];
delay(5);
}
}
void main()
{
unsigned char Key;
init();
Key=keyboard();
if(Key==1)
{
while(1){
Key=keyboard();
display();
if(Key==2)
x+=3600;
if(Key==3)
x+=1;
if(Key==4)
return;
}
}}
void holes() interrupt 1 using 2
{
TH0=(65535/50000)/256;
TL0=(65535/50000)%256;
a++;
if(a>=20)
{
x++;
m=x;
th=m/3600; //设置小时
Time[0]=th/10;
Time[1]=th%10;
m=m%3600; Time[2]=16; th=m/60; //设置分钟
Time[3]=th/10;
Time[4]=th%10;
m=m%60; Time[5]=16; th=m; //设置秒
Time[6]=th/10;
Time[7]=th%10; a=0;
}
}
#include <AT89X52.H>
#include <intrins.h>
#define REST P3_4
#define SCLK P3_7
#define DATA P3_6
unsigned char code displayCode[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsigned char code controladdress[]={0x80,0x82,0x84,0x86,0x88,
0x8a,0x8c,0x8e,0x90,0xbe};
unsigned char hour,minute,second;
unsigned char day,month,week,year;
unsigned char clockhour,clockminute;
unsigned int num;
unsigned char select,oneminute;
bit bdata modeselect;
void delay();
void writetime();
void display(unsigned char temp,unsigned char mode);
void sound()
{
while(num<2000)
{
P3_0=0;
}
P3_0=1;
}
void initial()
{
P0=0;
TMOD=0x22;
IE=0xCF;
IT0=1;
IT1=1;
T2CON=0;
RCAP2L=0xf0;
RCAP2H=0x1f;
TH2=0x1c;
TL2=0xf0;
IP=0X06;
TH0=0x48;
TL0=0x48;
TH1=0X48;
TR0=1;
PCON=0x01;
hour=12;
minute=0;
second=0;
num=0;
select=0;
clockhour=12;
clockminute=0;
modeselect=0;
day=16;
month=8;
week=7;
year=9;
}
void interrupt0()interrupt 0 using 3
{
TR1=1;
select++;
if(select==8)
{
select=0;
}
if(select==1)
ET2=1;
oneminute=second-1;
}
void timer0()interrupt 1 using 3
{
num++;
if(num==5000)
{
num=0;
second++;
}
if(second>=60)
{
minute++;
second=0;
}
if(minute>=60)
{
hour++;
minute=0;
}
if(hour>=24)
hour=0;
}
void interrupt1()interrupt 2 using 3
{
oneminute=second-1;
switch(select)
{
case 4:{
hour++;
if(hour>=24)
hour=0;
break;
}
case 5:{
minute++;
if(minute>=60)
minute=0;
break;
}
case 6:{
second++;
if(second>=60)
second=0;
break;
}
case 2:{
clockhour++;
if(clockhour>=24)
clockhour=0;
break;
}
case 3:{
clockminute++;
if(clockminute>=60)
clockminute=0;
break;
}
default:{
modeselect=0;
ET2=!ET2;
break;
}
}
}
void timer1()interrupt 3 using 3
{
if(select)
{
if(second==oneminute)
{
select=0;
TR1=0;
}
}
}
void timer2()interrupt 5 using 3
{
sound();
TF2=0;
if(minute!=clockminute||hour!=clockhour)
TR2=0;
}
void delay()
{
unsigned char i=255;
while(--i)
{
;
}
}
void display(unsigned char temp,unsigned char mode)
{
if(temp==4||temp==2)
P0=0;
else
P0=1;
if(mode)
P1=displayCode[hour/10];
else
P1=displayCode[clockhour/10];
delay();
if(temp==4||temp==2)
P0=0;
else
P0=2;
if(mode)
P1=displayCode[hour%10];
else
P1=displayCode[clockhour%10];
delay();
if(temp==1||temp==2||temp==3)
P0=0;
else
P0=4;
P1=0xbf;
delay();
if(temp==5||temp==3)
P0=0;
else
P0=8;
if(mode)
P1=displayCode[minute/10];
else
P1=displayCode[clockminute/10];
delay();
if(temp==5||temp==3)
P0=0;
else
P0=16;
if(mode)
P1=displayCode[minute%10];
else
P1=displayCode[clockminute%10];
delay();
if(temp==1||temp==2||temp==3)
P0=0;
else
P0=32;
P1=0xbf;
delay();
if(temp==6)
P0=0;
else
P0=64;
if(mode)
P1=displayCode[second/10];
else
P1=displayCode[0];
delay();
if(temp==6)
P0=0;
else
P0=128;
if(mode)
{
if(ET2)
P1=displayCode[second%10]+128;
else
P1=displayCode[second%10];
}
else
P1=displayCode[0];
delay();
}
void write(unsigned char Bdata)
{
unsigned char i=8;
for(;i>0;i--)
{
if(Bdata&0x01)
DATA=1;
else
DATA=0;
SCLK=1;
SCLK=0;
Bdata>>=1;
}
}
void writedata(unsigned char address,Bdata)
{
REST=0;
SCLK=0;
_nop_();
REST=1;
write(address);
write(Bdata);
REST=0;
}
unsigned char read(unsigned char Bdata)
{
unsigned char tdata=0,i=8;
REST=0;
SCLK=0;
_nop_();
REST=1;
write(Bdata);
for(;i>0;i--)
{
tdata>>=1;
if(DATA)
tdata=tdata|0x80;
else
tdata|=0x00;
SCLK=1;
SCLK=0;
}
return tdata;
}
void writetime()
{
unsigned char i,time,temp[3];
temp[0]=second;
temp[1]=minute;
temp[2]=hour;
for(i=0;i<3;i++)
{
time=temp[i]%10;
time|=(temp[i]/10)<<4;
writedata(controladdress[i],time);
}
}
void writeyear()
{
unsigned char i,year0,temp[4];
temp[0]=day;
temp[1]=month;
temp[2]=week;
temp[3]=year;
for(i=0;i<4;i++)
{
year0=temp[i]%10;
year0|=(temp[i]/10)<<4;
writedata(controladdress[i+3],year0);
}
}
void readtime()
{
unsigned char i,time,temp[3];
for(i=0;i<3;i++)
{
temp[i]=read(1+controladdress[i]);
time=temp[i]&0x0f;
time+=(temp[i]>>4)*10;
temp[i]=time;
}
second=temp[0];
minute=temp[1];
hour=temp[2];
}
void readyear()
{
unsigned char i,year0,temp[4];
for(i=0;i<4;i++)
{
temp[i]=read(1+controladdress[i+3]);
year0=temp[i]&0x0f;
year0+=(temp[i]>>4)*10;
temp[i]=year0;
}
day=temp[0];
month=temp[1];
week=temp[2];
year=temp[3];
}
void main()
{
initial();
sound();
writedata(0x8e,0x00);
writedata(0x84,0x12);
writedata(0x8f,0x00);
readtime();
writeyear();
readyear();
while(1)
{
switch(select)
{
case 0:{
display(0,1);
break;
}
case 1:{
if(num<=2500)
{
display(1,0);
}
else
{
display(0,0);
}
break;
}
case 2:{
if(num<=2500)
{
display(2,0);
}
else
{
display(0,0);
}
break;
}
case 3:{
if(num<=2500)
{
display(3,0);
}
else
{
display(0,0);
}
break;
}
case 4:{
if(num<=2500)
{
display(4,1);
}
else
{
display(0,1);
}
break;
}
case 5:{
if(num<=2500)
{
display(5,1);
}
else
{
display(0,1);
}
break;
}
case 6:{
if(num<=2500)
{
display(6,1);
}
else
{
display(0,1);
}
break;
}
case 7:{
writetime();
writetime();
writetime();
select=0;
break;
}
default:break;
}
if(second==0)
{
if(minute==0||minute==30)
sound();
}
if(minute==clockminute&&hour==clockhour)
{
TR2=1;
modeselect=1;
}
if(modeselect==1&&hour==clockhour&&!((minute-clockminute)%5))
TR2=1;
}
}
result equ 40h
one equ 41h
ten equ 42h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0000h
jmp main
org 001bh
jmp change
org 0040h
main:
MOV IE,#88H ;;;;;;;;;;;;;;T1 中断 允许
mov r2,#10h ;;;;;;;;;;;;;;设置 X 秒中断一次
mov result,#00h
mov one,#00h
mov ten,#00h
mov dptr,#0bfffh
mov a,#80h
movx @dptr,a ;;;;;;; 8255工作方式
mov Tmod,#10h ;;;;;;;;定时器 工作方式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
acall timer
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
show:
mov r1,#02h
mov r0,#41h
loopLed:
mov a,r1
mov dptr,#con
movc a,@a+dptr ;;;;;;;;;;;;;;送给 B口 的数据 以 选择 led
mov dptr,#9fffh
movx @dptr,a
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov dptr,#tab
mov a,@r0
movc a,@a+dptr
cpl a ;;;;;;;;;;;查表取得 相应位数上的 数值
mov dptr,#8fffh ;;;;A口
movx @dptr,a
inc r0
call delay
djnz r1,loopLed ;;;;;;;;;;循环 3 次 ,显示完 三个 led
mov a,result
cjne a,#3ch,next
jmp main
next:
jmp show
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断 相应程序
change:
dec r2
mov a,r2
jnz ignore
inc result
call Display
mov r2,#10h ;;;;;;;;;;;;;;;;;;;
ignore:
call timer
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h ;;;;;;;;;; 0-9 的数据 表
con: db 00h,40h,80h ;;;;;修改 LED 选择的表
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
timer:
mov tl1,#0cfh
mov th1,#03ah ;;;;;;;;;;;;;;;;;定时50ms
setb tr1 ;;;;;;;;;;;;;;;;;启用T1定时器
ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Display: ;;;;;;;;;;;;;;;;将采集到得数分解成2个 数
mov a,result
mov b,#0ah
div ab
mov ten,a ;;;;;;;;;;;;十位
mov one,b ;;;;;;;;;;;;个位
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay: mov r6,#05h ;;;;;;;;;;;;;;不用解释了、
delay1:mov r5,#0ffh
djnz r5,$
djnz r6,delay1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
end
致庞外科: /*---------------------------------------------------------------*/ /* 文件名称:SZ01.c */ /* 程序功能:带定时闹铃时钟 */ /*---------------------------------------------------------------*/ #include <AT89X51.H> /*包含器件配置文件*/ #define uchar unsigned char #define uint ...
睢宁县17274997561: 求89c52单片机 C语言实现数字时钟程序 - ?
致庞外科: result equ 40h one equ 41h ten equ 42h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h jmp main org 001bh jmp change org 0040h main: MOV IE,#88H ;;;;;;;;;;;;;;T1 中断 允许 mov r2,#10h ;;;;;;;;;;;;;;设置 X 秒中断一次 mov result,#...
睢宁县17274997561: STC89C52RC单片机控制两个继电器并且在数码管显示数字的C语言代码 - ?
致庞外科: sbit Q2 Px^x; sbit Q1 Px^x; uchar KEY;//键盘输入或程序给出0-3 switch(KEY){ case 0:Q1=0;Q2=0; case 1:Q1=1;Q2=1; case 2:Q1=1;Q2=0; case 3:Q1=0;Q2=1; }//将KEY显示输出,或查表或判断输出显示 是不是我理解有误?但愿有用.为什么不用模拟开关呢?
睢宁县17274997561: 求89c52单片机实现数字钟的汇编语言程序 - ?
致庞外科: S_SET BIT P3.2 ;数字钟秒控制位 M_SET BIT P3.3 ;分钟控制位 H_SET BIT P3.4 ;小时控制位 SECOND EQU 30H MINUTE EQU 31H HOUR EQU 32H TCNT EQU 34H ORG 0000H SJMP START ORG 000BH LJMP INT_T0 START:MOV ...
睢宁县17274997561: 怎么编写C语言程序使STC89C52RC单片机数码管从0显示到10,然后全灭,再从10减到0,全灭 - ?
致庞外科: 这个东西还是根据板子怎么控制数码管来写,如果是锁存控制,就开一次,显示一个数 延时 下一个数 全没就是0xff或0x00
睢宁县17274997561: 单片机(型号89C52)之简易数字电压表的设计 - ?
致庞外科: ///暂存转换结果 CLR OE ;/,R5 DA A ,A LCALL DISP ;///这个是最基本的,R4 DA A MOV R4;/存放转换后的数据,A MOV R5;数码管字形码表//,LED_1 MOVC A;/延时子程序//// ORG 0000H AJMP START ORG 0030H;/################...
睢宁县17274997561: 希望朋友们帮忙,给一下STC89C52单片机 C语言实现数字时钟的程序,初学单片机,请多关照 6个8位数码管显示 - ?
致庞外科: 使用方法:1.长按SETEN(P3.3,(S3))键1.5s,进入时间设置状态, 首先秒位会闪动2.按时间+1(P3.4,(S6)),或者时间-1(P3.5,(S9)) 来对闪动的部分进行时间设置3.再按SETEN键,调整分钟,分钟位会闪烁,重复步骤2,设置好分钟.4.再按...
睢宁县17274997561: AT89S52单片机0~999计数显示C语言程,起始显示000,一直到999 - ?
致庞外科: /*************************************/#include //通用89C52头文件 sbit Axs=P3^4;//个位 sbit Bxs=P3^5;//十位 sbit Cxs=P3^6;//百位 sbit Dxs=P3^7;//千位 char table[10]={0xd7,0x14,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f};//数码管显示编码 ...
睢宁县17274997561: 单片机(型号89C52)之简易数字电压表的设计 - ?
致庞外科: 数字电压表...
睢宁县17274997561: 89c52单片机求编程 - ?
致庞外科: #include<reg51.h> #define uchar unsigned char uchar num=0; sbit pulse=P1^0; void t0isr() interrupt 1{ num++; if(num<6)pulse=1; else pulse=0; if(num>80)num=0; } main() { TMOD=0x02; TH0=6; TL0=6; ET0=1; TR0=1; EA=1; while(1); }