标题:
程序闹钟-用at89s52和七段数码管实现计时时钟并用4x4矩阵键盘控制
[打印本页]
作者:
daming
时间:
2014-12-30 23:44
标题:
程序闹钟-用at89s52和七段数码管实现计时时钟并用4x4矩阵键盘控制
/*
程序名称:at89s52实现时钟《二》
程序功能:用at89s52和七段数码管实现计时时钟并用4x4矩阵键盘控制
运行环境:keil uv2
需改进点:未能用键盘设置闹钟
作者 :hankjulianth
*/
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint sec,min,hour;//秒,分,时计数
uint t1;//定义计数器
sbit sc=P1^7;//锁存信号
sbit sp=P1^1;//蜂鸣器
void _init_();//初始化函数
void timer0();//定时器T0中断函数
void showtime();//时间显示函数
void speker(uint,uint);//蜂鸣器函数,定时闹钟
void settime(uint,uint,uint);
void delay(uint);//延时函数
//键盘控制区设置
//六键控制
//一键控制开始,一键控制停止
//一键控制分钟加,一键控制分钟减,一键控制小时加,一键控制小时减,用于调时
uint temp;
/*
void stop();//计时停止
void _key_5();
void start();//计时开始
void _key_6();
*/
void minminu();//分钟减
void _key_1();
void minadd();//分钟加
void _key_2();
void hourminu();//小时减
void _key_3();
void houradd();//小时加
void _key_4();
uchar key;//键值
void main()
{
t1=0;
settime(0,0,0);
temp=0;
_init_();
while(1)
{
//键盘监测程序
P3=0x0f;
temp=P3;
if(temp!=0x0f)
{
temp=P3;
if(temp!=0x0f)
{
switch(temp)
{
case 0x8f : P3=0xf0;
temp=P3;
if(temp!=0xf0)
{
temp=P3;
if(temp!=0xf0)
{
switch (temp)
{
case 0xf1 : _key_1();
break;
case 0xf2 : _key_2();
break;
case 0xf4 : _key_3();
break;
case 0xf8 : _key_4();
break;
}
}
}
break;
default:
break;
/*case 0x4f : P3=0xf0;
temp=P3;
if(temp!=0xf0)
{
delay(100);
temp=P3;
if(temp!=0xf0)
{
switch (temp)
{
case 0xf1 : _key_5();
break;
case 0xf2 : _key_6();
break;
/case 0xf4 : _key_7();
break;
case 0xf8 : _key_8();
break;
}
}
}
break;
case 0x2f : P3=0xf0;
temp=P3;
if(temp!=0xf0)
{
delay(100);
temp=P3;
if(temp!=0xf0)
{
switch (temp)
{
case 0xf1 : _key_9();
break;
case 0xf1 : _key_10();
break;
case 0xf1 : _key_11();
break;
case 0xf1 : _key_12();
break;
}
}
}
break;
case 0x1f : P3=0xf0;
temp=P3;
if(temp!=0xf0)
{
delay(100);
temp=P3;
if(temp!=0xf0)
{
switch (temp)
{
case 0xf1 : _key_13();
break;
case 0xf1 : _key_14();
break;
case 0xf1 : _key_15();
break;
case 0xf1 : _key_16();
break;
}
}
}
break;*/ //此程序只用其中四个键盘即可
}
}
}
if(t1==20)
{
sec++;
t1=0;
speker(0,2);
}
if(sec==60)
{
min+=1;
sec=0;
}
if(min==60)
{
hour+=1;
min=0;
}
if(hour==24)
{
hour=0;
}
showtime();
}
}
void _init_()
{
//启用且设置T0,定时50ms
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TMOD=0x01;
TR0=1;
}
void timer0() interrupt 1
{
_init_();
t1++;
}
void settime(uint i,uint j,uint k)//设置初始时间函数: k : j : i
{
sec=i;
min=j;
hour=k;
}
void speker(uint i,uint j)
{
if(hour==j&&min==i)
{
sp=1;
sp=0;
}
}
void showtime()
{
//秒钟显示
sc=1;
P0=table[sec/10];
P2=0x06;
sc=0;
sc=1;
P0=table[sec%10];
P2=0x07;
sc=0;
//分钟显示
sc=1;
P0=table[min/10];
P2=0x03;
sc=0;
sc=1;
P0=table[min%10];
P2=0x04;
sc=0;
//时钟显示
sc=1;
P0=table[hour/10];
P2=0x01;
sc=0;
sc=1;
P0=table[hour%10];
P2=0x0;
sc=0;
}
void delay(uint z)
{
uint x,y;
for(x=100;x>=0;x--)
for(y=z;y>=0;y--);
}
/*void stop()
{
}
void start()
{
}*/
void minminu() { min--;}
void minadd() { min++;}
void hourminu() {hour--;}
void houradd() { hour++;}
void _key_1() {minminu();}
void _key_2() {minadd();}
void _key_3() {hourminu();}
void _key_4() {houradd();}
复制代码
作者:
daming
时间:
2014-12-30 23:45
字符显示:
/* 程序名称:点阵显示器显示
程序作用:采用AT89C52和8x8点阵显示器显示字符
程序拓展:可以实现键盘输入显示字符
程序作者:hankjulianth
完成时间:10。3.30——下午
*/
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code pa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code ln[9][8]={
{0xff,0x83,0xef,0xef,0xef,0xef,0xef,0x83},//"I"
{0xff,0x99,0x66,0x7e,0xbd,0xdb,0xe7,0xff},//心符号
{0xff,0xbb,0xbb,0xbb,0xbb,0xbb,0xc7,0xff},//"U"
{0xff,0xef,0xef,0xab,0x6d,0xe7,0xef,0xff},//"小"
{0xff,0xff,0x83,0xef,0xef,0xef,0xef,0xef},//"T"
{0xff,0xff,0xff,0x81,0xff,0xff,0xff,0xff},//"--"
{0xfd,0x11,0xd0,0x90,0x57,0x90,0xd7,0xd0},//"邹"
{0xfb,0xfb,0xe0,0xfb,0xf1,0xd9,0x49,0x86},//"志"
{0x80,0xf7,0xd5,0xe3,0xc1,0xf7,0xf7,0xf7},//"平"
};
uint i=0,j=0,timecount=0;
void main()
{
TMOD=0x01;
TH0=(65536-3000)/256;//定时3ms
TL0=(65536-3000)%256;
TR0=1;
EA=1;
ET0=1;
while(1)
{
;
}
}
void timer0() interrupt 1
{
TMOD=0x01;
TH0=(65536-3000)/256;
TL0=(65536-3000)%256;
TR0=1;
EA=1;
ET0=1;
P0=pa[j];
P2=ln[i][j];
j++;
if(j>7)
{
j=0;
}
timecount++;
if(timecount==333)//每个字时间间隔为333 X 3ms
{
timecount=0;
i++;
if(i>8)
{
i=0;
}
}
}
复制代码
作者:
daming
时间:
2014-12-30 23:46
改进版的程序:
/*程序名称:改进的at89s52实现时钟
程序功能:用at89s52和七段数码管实现计时时钟,用扫描方式显示年月日时分秒
作者 :hankjulianth
*/
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint year,month,day,sec,min,hour;//秒,分,时计数
uint t1;//定义计数器
sbit sc=P3^7;//锁存信号
sbit sp=P1^1;//蜂鸣器
void _init_();//初始化函数
void timer0();//定时器T0中断函数
void showtime();//时间显示函数
void speker(uint,uint);//蜂鸣器函数,定时闹钟
void settime(uint,uint,uint,uint,uint,uint);//设置年,月,日,时,分,秒
void delay(uint);//延时函数
void main()
{
t1=0;
settime(10,4,16,0,0,0);
_init_();
while(1)
{
if(t1==20)
{
sec++;
t1=0;
}
if(sec==60)
{
min+=1;
sec=0;
}
if(min==60)
{
hour+=1;
min=0;
}
if(hour==24)
{
hour=0;
day++;
}
if(month==1|month==3|month==5|month==7|month==8|month==10|month==12)
{
if(day==31)
{
day=0;
month++;
}
}
else
{
if(month==2)
{
if(day==29)
{
day=0;
month++;
}
}
else
{
if(day==30)
{
day=0;
month++;
}
}
}
if(month==12)
{
month=0;
year++;
}
speker(0,8);
showtime();
}
}
void _init_()
{
//启用且设置T0,定时50ms
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TMOD=0x01;
TR0=1;
}
void timer0() interrupt 1
{
_init_();
t1++;
}
void settime(uint y,uint m,uint d,uint i,uint j,uint k)//设置初始时间函数: k : j : i
{
year=y;
month=m;
day=d;
sec=i;
min=j;
hour=k;
}
void speker(uint i,uint j)
{
if(hour==j&&min==i)
{
while(min==min+1)//一分钟后,闹钟停止
{
sp=1;
delay(20);
sp=0;
}
}
}
void showtime()
{
if((sec%10)<7&&(sec%10)>=0)
{//秒钟显示
sc=1;
P0=table[sec/10];
P2=0x06;
sc=0;
sc=1;
P0=table[sec%10];
P2=0x07;
sc=0;
//分钟显示
sc=1;
P0=table[min/10];
P2=0x03;
sc=0;
sc=1;
P0=table[min%10];
P2=0x04;
sc=0;
//时钟显示
sc=1;
P0=table[hour/10];
P2=0x01;
sc=0;
sc=1;
P0=table[hour%10];
P2=0x0;
sc=0;
}
if((sec%10)>=7&&(sec%10)<=9)
{
//日期显示
sc=1;
P0=table[day/10];
P2=0x06;
sc=0;
sc=1;
P0=table[day%10];
P2=0x07;
sc=0;
//月份显示
sc=1;
P0=table[month/10];
P2=0x03;
sc=0;
sc=1;
P0=table[month%10];
P2=0x04;
sc=0;
//年份显示
sc=1;
P0=table[year/10];
P2=0x01;
sc=0;
sc=1;
P0=table[year%10];
P2=0x00;
sc=0;
}
}
void delay(uint z)
{
uint x,y;
for(x=10;x>=0;x--)
for(y=z;y>=0;y--);
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1