
/头文件---------------------------------------------------------------------/
#include <reg52h>
#define uint unsigned int
#define uchar unsigned char
/定义全局变量---------------------------------------------------------------/
uchar sec,min,hour;
//秒,分,小时
bit w = 0; //调时标志位
/定义数码管数据线-----------------------------------------------------------/
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;
#define leddata P0
/定义按键-------------------------------------------------------------------/
sbit K1 = P1^0; //K1-设置
sbit K2 = P1^1; //K2-确认
sbit K3 = P1^2; //K3-加
sbit K4 = P1^3; //K4-减
/定义DS12CR887数据线--------------------------------------------------------/
sbit DS_CS = P1^4;
sbit DS_AS = P1^5;
sbit DS_RW = P1^6;
sbit DS_DS = P1^7;
#define Ds_Bus P0 //DS12CR887数据总线
void display(void);
unsigned char code dis_7[]={
0x7D, // 0
0x50, // 1
0x6E, // 2
0x7A, // 3
0x53, // 4
0x3B, // 5
0x3F, // 6
0x70, // 7
0x7F, // 8
0x7B, // 9
};
unsigned char code scan_6[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char dispbuf[6]={0,0,0,0,0,0};
//延时函数 1MS/次
void DelayM(uint a)
{
uchar i;
while( --a != 0)
{
for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
} //i 从0加到125,CPU大概就耗时1毫秒
}
void delays(unsigned char k)
{
unsigned char i,j;
for(i=0;i<k;i++)
for(j=0;j<50;j++);
}
/DS12CR887驱动程序----------------------------------------------------------/
//往DS12CR887写数据函数
void ds_write(uchar add,uchar date)
{
DS_CS=0;
DS_DS=1;
DS_RW=1;
DS_AS=1;
Ds_Bus=add;
DS_AS=0;
DS_RW=0;
Ds_Bus=date;
DS_RW=1;
DS_AS=1;
DS_CS=1;
}
//读取DS12CR887的数据
uchar ds_read(uchar add)
{
uchar z;
DS_CS=0;
DS_RW=1;
DS_DS=1;
DS_AS=1;
Ds_Bus=add;
DS_AS=0;
DS_DS=0;
Ds_Bus=0xff;
z=Ds_Bus;
DS_DS=1;
DS_AS=1;
DS_CS=1;
return z;
}
//DS12CR887初始化
void ds_int()
{
DS_AS=0;
DS_DS=0;
DS_RW=0;
ds_write(0,0x20);//DS12CR887寄存器A功能设置,开启时钟振荡器
}
/---------------数码管驱动程序------------------------------------------------/
void display(void)
{
uint k;
DS_CS=1;
for(k = 0;k<6;k++)
{leddata=dis_7[dispbuf[k]];
P2 = scan_6[k];delays(10);P2=0xff;
DS_CS=0;
}
}
//往显示缓冲区填写 小时 数据
void led_w_hour(void)
{
hour=ds_read(4);//读取DS12CR887的小时
dispbuf[1]=hour%10;
dispbuf[0]=hour/10;
}
//往显示缓冲区填写 分钟 数据
void led_w_min(void)
{
min=ds_read(2);//读取DS12CR887的分
dispbuf[3]=min%10;
dispbuf[2]=min/10;
}
//往显示缓冲区填写 秒 数据
void led_w_sec(void)
{
sec=ds_read(0);//读取DS12CR887的秒
dispbuf[5]=sec%10;
dispbuf[4]=sec/10;
}
/调整时间、日期程序---------------------------------------------------------/
void Set_time(uchar sel)
{
signed char address,item;
signed char max,mini;
if(sel==1) {address=2; max=59;mini=0;} //分钟2
if(sel==0) {address=4; max=23;mini=0;} //小时4
//读取DS12CR887某地址上的数值赋给item
item=ds_read(address);
if(K3 == 0)//K3-加
{
item++;//数加 1
}
if(K4 == 0)//K4-减
{
item--;//数减 1
}
if(item>max)
item=mini;//查看数值有效范围
if(item<mini)
item=max;
//将调整好的item值写入DS12CR887
ds_write(address,item);//+
led_w_hour(); //时
led_w_min(); //分
}
/主程序---------------------------------------------------------------------/
main()
{
uchar e=0;
K1=1;K2=1;K3=1;K4=1;
ds_int(); //初始化DS12CR887
while(1)
{
if (w == 0) //正常走时
{
led_w_hour(); //显示时
led_w_min(); //显示分
led_w_sec(); //显示秒
display();
}
else {}//否则启动调时
if (K1 == 0) // 设置时间
{
DelayM(20); //按键消抖
if(K1 == 0 && w == 1) //当是调时状态 本键用于调整下一项
{
e++;
if (e >= 2 )
{
e = 0;
}
Set_time(e);//调整
}
if(K1 == 0 && w == 0) //当是正常状态时就进入调时状态
{
w=1; //进入调时
Set_time(e);//调整
}
while(K1 == 0);//等待键松开
}
if (K2 == 0) // 当在调时状态时就退出调时
{
DelayM(20);//按键消抖
if(K2 == 0 && w == 1)
{
w = 0; //退出调时
e = 0; //"下一项"计数器清0
}
led_w_hour(); //时
led_w_min(); //分
led_w_sec(); //秒
display();
while(K2 == 0);//等待键松开
}
if (K3 == 0 && w == 1)//加调整
{
DelayM(20);//按键消抖
if(K3 == 0 && w == 1)
{
Set_time(e);//调整
}
while(K3 == 0);//等待键松开
}
if (K4 == 0 && w == 1) //减调整
{
DelayM(20);//按键消抖
if(K4 == 0 && w == 1)
{
Set_time(e);//调整
}
while(K4 == 0);//等待键松开
}
}
}
你的分不好拿啊= =!!!!
#include<reg51h>
#define uchar unsigned char//宏定义
#define uint unsigned int
sbit dula=P2^6; //段控制位
sbit wela=P2^7; //位控制位
uchar miao,fen,aa,n1,n2,n3,n4;
uchar code table[]={ //显示编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z); //延时程序声明
void init(void);//初始化程序声明
void display(uchar n1 ,uchar n2,uchar n3,uchar n4); //显示程序声明
void main() //主程序
{
init(); //调用初始化程序
while(1) //进入大循环
{
if(aa==20) //判断是否到了1S
{
miao++; //秒数加1
if(miao==60) //判断是否到了60秒
{
miao=0; //秒数清0
fen++; //分数加1
if(fen==60) //判断是否到了60分
{
fen=0; //分数到60则清0
}
n1=fen/10; //第一个数码管显示分的十位
n2=fen%10; //第二个数码管显示分的个位
n3=miao/10; //第三个数码管显示秒的十位
n4=miao%10; //第四个数码管显示秒的个位
}
display(n1,n2,n3,n4);
}
}
}
void delay(uint z) //延时程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar n1 ,uchar n2,uchar n3,uchar n4)
{
dula=1; //开段选
P0=table[n1]; //送分的十位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xfe; //选通分的十位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
dula=1; //开段选
P0=table[n2]; //送分的个位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xfd; //选通分的个位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
dula=1; //开段选
P0=table[n3]; //送秒的十位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xfb; //选通秒的十位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
dula=1; //开段选
P0=table[n4]; //送秒的个位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xf7; //选通秒的个位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
}
void init(void)
{
}
void timer0(void) interrupt 1 using 1
{
TH0=(65536-50000)/256; //求模
TL0=(65536-50000)%256; //求余
aa++;
}
#include<reg51h>
#include<intrinsh>
#define uchar unsigned char;
uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f
uchar number,dat,time;
void t0isr() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
number++;
if(number>1)number=0;
switch(number)
{
case 0:P2=0x02;P0=distab[dat/10];
break;
case 1:P2=0x01;P0=distab[dat%10];
break;
default:break;
}
}
void t1isr() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time%2)P1=_crol_(P1,1);
if(time%4)dat++;
dat%=100;
}
main()
{
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time=0;
dat=0;
TR1=1;
ET1=1;
TR0=1;
ET0=1;
EA=1;
P1=0xfe;
while(1);
}
以上就是关于求一份51 单片机的数字时钟的C语言代码 可以用于超想-3000TC全部的内容,包括:求一份51 单片机的数字时钟的C语言代码 可以用于超想-3000TC、用LED灯显示倒计时10秒 51单片机C语言编程 跪求、51单片机C语言程序,利用定时器1控制LED灯每隔100ms亮一个,并且数码管上的数每隔200ms加1,加到100清零等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)