求一份51 单片机的数字时钟的C语言代码 可以用于超想-3000TC

求一份51 单片机的数字时钟的C语言代码 可以用于超想-3000TC,第1张

/头文件---------------------------------------------------------------------/

#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清零等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9283058.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存