c51数字钟设计程序(c51电子时钟设计程序仿真图)

程序设计 1918
今天给各位分享c51数字钟设计程序的知识,其中也会对c51电子时钟设计程序仿真图进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、求c51单片机电子钟程序(c语言)

今天给各位分享c51数字钟设计程序的知识,其中也会对c51电子时钟设计程序仿真图进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

求c51单片机电子钟程序(c语言)

#include reg51.h

#define uchar unsigned char //定义unsigned int为uint

#define uint unsigned int //定义unsigned uchar为uchar

sbit LCD_RS = P2^0 ;

sbit LCD_RW = P2^1 ;

sbit LCD_EN = P2^2 ;

sbit D_SDA = P2^6; //定义74HC164数据线为P2.6端口

sbit D_SCL = P2^7; //定义74HC164数据线为P2.7端口

sbit CLK = P1^3; /*实时时钟时钟线引脚 */

sbit IO = P1^4; /*实时时钟数据线引脚 */

sbit RST = P1^5; /*实时时钟复位线引脚 */

sbit ACC0 = ACC^0;

sbit ACC7 = ACC^7;

uchar time[8] = {0x50,0x30,0x19,0x30,0x12,0x06,0x06};

//========= 延时函数 ============

//延时时间以1ms为单位

//s决定延时时间长短

void delay_ms(uint s)

{

uint x;

for(s;s0;s--)

{

x = 200;

while(x--);

}

}

//========= 送出一个字节给74HC164(实现串并转换) ==========

void send_out(unsigned char out)//传送一个字节8位

{

uchar i;

D_SCL = 0;

for (i=8;i=1;i--)

{

D_SDA = out0x80; //送数据到数据口

D_SCL = 1; //时钟线置1

D_SCL = 0; //送一时钟

out=1; //左移

}

}

//========= 写命令函数 ==========

void lcd_wcmd(uchar cmd)

{

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

send_out(cmd);

LCD_EN = 1;

LCD_EN = 0 ;

}

//========= 写数据函数 ==========

void lcd_wdat(uchar dat)

{

LCD_RS = 1;

LCD_RW = 0;

LCD_EN = 0;

send_out(dat);

LCD_EN = 1;

LCD_EN = 0;

}

//========= LCD初始化函数 ==========

void lcd_init()

{

lcd_wcmd(0x38);

delay_ms(1);

lcd_wcmd(0x0c); //显示开,关光标

delay_ms(1);

lcd_wcmd(0x06); //向右移动光标

delay_ms(1);

lcd_wcmd(0x01); //清除LCD显示屏

delay_ms(1);

}

//========== 往DS1302写入1Byte数据 (内部函数) =============

void w_byte(uchar dat)

{

uchar i;

for(i=8; i0; i--)

{

IO = dat 0x01;

CLK = 1;

CLK = 0;

dat = dat 1;

}

}

//======== 从DS1302读取1Byte数据 (内部函数) ===================

uchar r_byte(void)

{

uchar i;

for(i=8; i0; i--)

{

ACC = ACC 1;

ACC7 = IO;

CLK = 1;

CLK = 0;

}

return(ACC);

}

//========== 指定地址往DS1302写入1Byte数据 (内部函数) =============

void write_byte(uchar addr, uchar dat)

{

RST = 0;

CLK = 0;

RST = 1;

w_byte(addr);

w_byte(dat);

CLK = 1;

RST = 0;

}

//========== 指定地址往DS1302读1Byte数据 (内部函数) =============

uchar read_byte(uchar addr)

{

uchar ucData;

RST = 0;

CLK = 0;

RST = 1;

w_byte(addr);

ucData = r_byte();

CLK = 1;

RST = 0;

return(ucData);

}

//============ 设置ds1302日期和时间 =============

void write_ds1302(uchar *p)

{

uchar i;

uchar addr = 0x80;

write_byte(0x8e,0x00); // 控制命令,WP=0,写操作

for(i =7; i0; i--)

{

write_byte(addr,*p); // 秒 分 时 日 月 星期 年

p++;

addr +=2;

}

write_byte(0x8e,0x80); // 控制命令,WP=1,写保护

}

//============ 读ds1302当前日期和时间 =============

void read_ds1302(uchar *p)

{

uchar i;

uchar addr = 0x81;

for (i=0; i7; i++)

{

*p = read_byte(addr); //格式为: 秒 分 时 日 月 星期 年

addr += 2;

p++;

}

}

//============ 显示函数 ===================

void lcd_disp()

{

uchar addr = 4;

lcd_wcmd(0x80 + addr);

lcd_wdat(((time[2]4)0x0f)+0x30); //显示小时

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat((time[2]0x0f)+0x30);

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat(':'); //显示":"

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat(((time[1]4)0x0f)+0x30); //显示分

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat((time[1]0x0f)+0x30);

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat(':'); //显示":"

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat(((time[0]4)0x0f)+0x30); //显示秒

addr++;

lcd_wcmd(0x80 + addr);

lcd_wdat((time[0]0x0f)+0x30);

addr = 2;

lcd_wcmd(0xc0 + addr); //在第二行显示年月日和星期

lcd_wdat('2'); //显示2

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat('0'); //显示0

addr++;

lcd_wdat(((time[6]4)0x0f)+0x30); //年

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat((time[6]0x0f)+0x30);

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat(' ');

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat(((time[4]4)0x0f)+0x30); //显示月

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat((time[4]0x0f)+0x30);

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat(' ');

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat(((time[3]4)0x0f)+0x30); //显示日

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat((time[3]0x0f)+0x30);

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat(' ');

addr++;

lcd_wcmd(0xc0 + addr);

lcd_wdat((time[5]0x0f)+0x30); //显示星期

}

//=========== 主函数 ===============

void main()

{

lcd_init(); // 初始化LCD

write_ds1302(time);

while(1)

{

read_ds1302(time); //读DS1302数据

lcd_disp(); //LCD显示

delay_ms(500); //延时0.5秒

}

}

这是一个电子时钟,在LCD1602上显示,时钟芯片是DS1302

求C51单片机数字电子时钟课程设计

#includereg52.h

#includeabsacc.h

#includeintrins.h

#define

unit

unsigned

int

#define

uchar

unsigned

char

//#define

HZ

12

sbit

key0=P0^0;

//

分钟调整

sbit

key1=P0^1;

//

小时调整

sbit

P2_0=P2^7;

//秒

指示灯

sbit

MN_RXD=P3^6;

sbit

MN_TXD=P3^7;

uchar

data

CLOCK[4]={0,0,0,12};//存放时钟时间(百分秒,秒,分,和时位)

//数码管显示表0-f

uchar

code

TABLE[]={0xBE,0x06,0xEA,0x6E,0x56,0x7C,0xFC,0x0E,0xFE,0x7E,0x00};

//**********************************

//模拟串口发送一个字节数据

函数

//**********************************

void

SendData(unsigned

char

senddata)

{

unsigned

char

i;

for(i=0;i8;i++)

{

if((senddata0x01)==0)

MN_RXD=0;

else

MN_RXD=1;

_nop_();

MN_TXD=0;

_nop_();

MN_TXD=1;

senddata=senddata1;

}

}

//**********************************

//显示程序函数

//**********************************

void

display(void)

{

//

unsigned

int

n;

uchar

temp;

temp=CLOCK[1];

temp=temp%10;

SendData(TABLE[temp]);

temp=CLOCK[1];

temp=temp/10;

SendData(TABLE[temp]);

temp=CLOCK[2];

temp=temp%10;

SendData(TABLE[temp]);

temp=CLOCK[2];

temp=temp/10;

SendData(TABLE[temp]);

temp=CLOCK[3];

temp=temp%10;

SendData(TABLE[temp]);

temp=CLOCK[3];

temp=temp/10;

SendData(TABLE[temp]);

/*

for(n=0;n5000;n++);

for(n=0;n6;n++)

{

SendData(TABLE[10]);

}

*/

}

//**********************************

//按键控制函数

//**********************************

void

keycan()

{

unsigned

int

n;

EA=0;

if(key0==0)

//

分钟调整

{

for(n=0;n10000;n++);

//延时去抖动

while(key0==0);

CLOCK[2]=CLOCK[2]+1;

if(CLOCK[2]==60)

//到一时

{

CLOCK[2]=0;

}

display();

}

if(key1==0)

//

小时调整

{

for(n=0;n10000;n++);

//延时去抖动

while(key1==0);

CLOCK[3]=CLOCK[3]+1;

if(CLOCK[3]==24)

{

CLOCK[3]=0;

}

display();

}

EA=1;

}

//**********************************

//T0中断服务函数

//**********************************

void

time0()

interrupt

1

//using

1

{

TH0=0xD8;

TL0=0xF0;

//重置初值

//

TH0=0xB1;

TL0=0xE0;

//时钟处理

CLOCK[0]=CLOCK[0]+1;

}

//**********************************

//主函数

//**********************************

void

main()

{

EA=1;

ET0=1;

TMOD=0x01;

//T0方式1定时

TH0=0xD8;

TL0=0xF0;

//D8F0

定时10ms

//

TH0=0xB1;

TL0=0xE0;

//定时

20ms

TR0=1;

for()

{

if(CLOCK[0]==100)

//到一秒

10ms*100

{

CLOCK[0]=0;

P2_0=~P2_0;

CLOCK[1]=CLOCK[1]+1;

if(CLOCK[1]==60)

//到一分

{

CLOCK[1]=0;

CLOCK[2]=CLOCK[2]+1;

if(CLOCK[2]==60)

//到一时

{

CLOCK[2]=0;

CLOCK[3]=CLOCK[3]+1;

if(CLOCK[3]==24)

{

CLOCK[3]=0;

}

}

}

display();

}

keycan();

}

}

单片机c51编程

也不晓楼主把这个C程序发出来,有不有什么问题需要帮助的

我自各儿做的一个数字钟:00-00-00型的,为24小时制的,汇编程序和Protues都发给了你,注意查收噢!(twp……@126.com)

谁能给个c51单片机的时钟程序

下面是在网上找的。

供参考

uchar code seven_seg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x77,0x7C,0x39,0x5e,0x79,0x71};

uchar keyState = 0 ; // 0表示没有操作 1 修改秒 2 修改分钟 3 修改小时 4 定闹 小时 5定闹分钟

uint ledState =0;

uchar ledStateNum=0;

uint num = 0 ;

sbit KEY1=P3^0;

sbit KEY2=P3^1;

sbit KEY3=P3^2;

sbit KEY4=P3^3;

char timer[] ={ 0 , 0 , 0} ; //时,分,秒

char n_timer[2]={11,0};

void DelayMS(uint ms)

{

while(ms--);

}

void Display()

{

uchar i = 0,flags;

uchar count = 0;

uchar temp [6] ={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

if( 4 == keyState || 5 == keyState )

{

P2 = temp[0];

P0 = 0x00;

P0 = 0x40;

DelayMS(1);

P2 = temp[1];

P0 = 0x00;

P0 = 0x40;

DelayMS(1);

P2 = temp[2];

P0 = 0x00;

if(ledState 4 == keyState)

P0 = seven_seg[ n_timer[0] / 10 ];

else

P0 = seven_seg[ n_timer[0] / 10 ] | 0x80;

DelayMS(1);

P2 = temp[3];

P0 = 0x00;

if(ledState 4 == keyState)

P0 = seven_seg[ n_timer[0] % 10 ];

else

P0 = seven_seg[ n_timer[0] % 10 ] | 0x80;

DelayMS(1);

P2 = temp[4];

P0 = 0x00;

if(ledState 5 == keyState)

P0 = seven_seg[ n_timer[1] / 10 ];

else

P0 = seven_seg[ n_timer[1] / 10 ] | 0x80;

DelayMS(1);

P2 = temp[5];

P0 = 0x00;

if(ledState 5 == keyState)

P0 = seven_seg[ n_timer[1] % 10 ];

else

P0 = seven_seg[ n_timer[1] % 10 ] | 0x80;

DelayMS(1);

P2 = 0XFF;

return ;

}

if( 0 == keyState)

{

P2 = temp[0];

P0 = 0x00;

P0 = seven_seg[ timer[0] / 10 ];

DelayMS(1);

P2 = temp[1];

P0 = 0x00;

P0=seven_seg[ timer[0] % 10 ];

DelayMS(1);

P2 = temp[2];

P0 = 0x00;

P0 = seven_seg[ timer[1] / 10 ];

DelayMS(1);

P2 = temp[3];

P0 = 0x00;

P0 = seven_seg[ timer[1] % 10 ];

DelayMS(1);

P2 = temp[4];

P0 = 0x00;

P0 = seven_seg[ timer[2] / 10 ];

DelayMS(1);

P2 = temp[5];

P0 = 0x00;

P0 = seven_seg[ timer[2] % 10 ];

DelayMS(1);

P2 = 0XFF;

return ;

}

while( i 6 )

{

if(3- keyState == i/2 ledState == 0)

{

flags = 0;

}

else

{

flags = 1;

}

if( flags)

{

P2 = temp[i];

P0=0x00;

if(0 == i % 2)

{

P0 = seven_seg[ timer[i/2] / 10 ];

}

else

{

P0 = seven_seg[ timer[i/2] % 10 ];

}

}

i++;

}

}

c51数字钟设计程序的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c51电子时钟设计程序仿真图、c51数字钟设计程序的信息别忘了在本站进行查找喔。

扫码二维码