单片机c语言时钟程序

单片机c语言时钟程序,第1张

/ ch07-5-3c - 计时器实验3 -60秒计数器,每1分钟LED反相1次 /

//==声明区================================

#include // 定义8x51暂存器之标头档,P2-17~19

#define SEG P2 // 定义七节显示器接至Port 2

#define SCANP P1 // 定义扫瞄线接至Port 1

sbit LED=P0^7; // 声明LED接至P07

/声明T0计时相关声明/ // THx TLx 计算参考

#define count_M1 50000 // T0(MODE 1)之计量值,005s

#define TH_M1 (65636-count_M1)/256// T0(MODE 1)计量高8位元

#define TL_M1 (65636-count_M1)%256// T0(MODE 1)计量低8位元

int count_T0=0; // 计算 T0中断次数

/声明T1扫瞄相关声明/

#define count_M2 250 // T1(MODE 2)之计量值,025ms

#define TH_M2 (256-count_M2) // T1(MODE 2)自动载入计量

#define TL_M2 (256-count_M2) // T1(MODE 2)计数量

char count_T1=0; // 计算 T1中断次数

/ 声明七节显示器驱动信号阵列(共阳) /

char code TAB[10]={ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, //数字0-4

0x92, 0x83, 0xf8, 0x80, 0x98 }; //数字5-9

char disp[2]={ 0xc0, 0xc0 }; // 声明显示区阵列初始显示00

/ 声明基本变量 /

char seconds=0; // 秒数

char scan=0; // 扫瞄信号

//==主程序================================

main() // 主程序开始

{ IE=0x8a; // 1000 1010,启用TF0、TF1中断(6-4页)

TMOD=0x21; // 0010 0001,T1采mode 2、T0采mode 1

TH0=TH_M1; TL0=TL_M1;// 设置T0计数量高8位元、低8位元

TR0=1; // 启动T0(7-7页)

TH1=TH_M2; TL1=TL_M2;// 设置T1自动载入值、计数量

TR1=1; // 启动T1

LED=1; // 关闭LED

while(1); // 无穷回圈,程序停滞

} // 主程序结束

//== T0中断子程序- 计算并显示秒数 ==================

void T0_1s(void) interrupt 1 // T0中断子程序开始

{ TH0=TH_M1; TL0=TL_M1; // 设置T0计数量高8位元、低8位元

if (++count_T0==20) // 若中断20次,即005x20=1秒

{ count_T0=0; // 重新计次

seconds++; // 秒数加1

if (seconds==60) // 若超过60秒

{ seconds=0; // 秒数归0,重新开始

LED=~LED; // 切换LED

} // if叙述结束(超过60秒)

} // if叙述结束(中断20次)

disp[1]=TAB[seconds/10]; // 填入十位数显示区

disp[0]=TAB[seconds%10]; // 填入个位数显示区

} // T0中断子程序结束

//===T1中断子程序 - 扫瞄 =========================

void T1_8ms(void) interrupt 3 // T1中断子程序开始

{ if (++count_T1==32) // 若中断32次,即025mx32=8ms

{ count_T1=0; // 重新计次

if (++scan==3) scan=1;// 若超过十位数,显示个位

SEG=0xff; // 关闭7段显示器

SCANP=~scan; // 输出扫瞄信号

SEG=disp[scan-1]; // 输出显示信号

} // 结束if判断(中断32次)

} // T0中断子程序结束

分太少了啊

给你一个只实现了时钟的面板。

import javautil;

import javaxswing;

import javaawt;

import javaawtevent;

import javaxswingTimer;

public class Clock extends JFrame implements ActionListener

{

private static final long serialVersionUID = 6790815213225162093L;

Timer timer;

int x,y,old_X,old_Y, r,x0,y0,w,h,ang;

int sdo,mdo,hdo,old_M,old_H;

TimeZone tz =TimeZonegetTimeZone("JST");

final double RAD=MathPI/1800;

public Clock()

{

super("时钟");

setSize(300,300);

setBackground(new Color(0,0,192));

setResizable(false);

Dimension scr=ToolkitgetDefaultToolkit()getScreenSize();

Dimension fra=thisgetSize();

if(frawidth>scrwidth)

{

frawidth=scrwidth;

}

if(fraheight>scrheight)

{

fraheight=scrheight;

}

thissetLocation((scrwidth-frawidth)/2,(scrheight-fraheight)/2);

setVisible(true);

int delay = 1000;

ActionListener taskPerformer = new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

repaint();

}

};

new Timer(delay, taskPerformer)start();

}

public void actionPerformed(ActionEvent e)

{

timerrestart();

}

public void paint( Graphics g )

{

Insets insets = getInsets();

int L0 = (insetsleft)/2, T0 = (insetstop)/2;

int hh,mm,ss;

String st;

h=getSize()height;

gsetColor(Colorwhite);

gdrawOval(L0+30,T0+30,h-60,h-60);

gdrawOval(L0+32,T0+32,h-64,h-64);

r=h/2-30;

x0=30+r-5+L0;

y0=30+r-5-T0;

ang=60;

for (int i=1; i<=12; i++)

{

x=(int)((r+10)Mathcos(RADang)+x0);

y=(int)((r+10)Mathsin(RADang)+y0);

gdrawString(""+i,x,h-y);

ang-=30;

}

x0=30+r+L0; y0=30+r+T0;

Calendar now=CalendargetInstance();

hh=nowget(CalendarHOUR_OF_DAY);

mm=nowget(CalendarMINUTE);

ss=nowget(CalendarSECOND);

gsetColor(Colorpink);

gfillRect(L0,T0,60,28);

gsetColor(Colorblue);

if (hh < 10) st="0"+hh; else st=""+hh;

if (mm < 10) st=st+":0"+mm; else st=st+":"+mm;

if (ss < 10) st=st+":0"+ss; else st=st+":"+ss;

gdrawString(st,L0,T0+25);

sdo=90-ss6;

mdo=90-mm6;

hdo=90-hh30-mm/2;

if (old_X > 0)

{

gsetColor(getBackground());

gdrawLine(x0,y0,old_X,(h-old_Y));

} else

{

old_M=mdo;

old_H=hdo;

}

gsetColor(Coloryellow);

x=(int)((r-8)Mathcos(RADsdo)+x0);

y=(int)((r-8)Mathsin(RADsdo)+y0)-2T0;

gdrawLine(x0,y0,x,(h-y));

old_X=x;

old_Y=y;

if (mdo != old_M)

{

line(g,old_M,(int)(r07),getBackground());

old_M=mdo;

}

if (hdo != old_H)

{

line(g,old_H,(int)(r05),getBackground());

old_H=hdo;

}

line(g,mdo,(int)(r07),Colorgreen);

line(g,hdo,(int)(r05),Colorred);

}

public void line(Graphics g, int t, int n, Color c)

{

int [] xp = new int[4];

int [] yp = new int[4];

xp[0]=x0;

yp[0]=y0;

xp[1]= (int)((n-10)Mathcos(RAD(t-4))+x0);

yp[1]=h-(int)((n-10)Mathsin(RAD(t-4))+y0);

xp[2]= (int)( n Mathcos(RAD t )+x0);

yp[2]=h-(int)( n Mathsin(RAD t )+y0);

xp[3]= (int)((n-10)Mathcos(RAD(t+4))+x0);

yp[3]=h-(int)((n-10)Mathsin(RAD(t+4))+y0);

gsetColor(c);

gfillPolygon(xp,yp,4);

}

public static void main(String args[])

{

new Clock();

}

}

import

javautil;

import

javaawt;

import

javaapplet;

//impelements

Runnable

是线程程序的接口

public

class

Clock

extends

Applet

implements

Runnable

{

Thread

timer

=

null;

//

定义线程实体timer

int

xcenter

=

400,

ycenter

=

50;

int

Radius

=

ycenter

-

5;

public

void

init()

{

resize(400,

125);//

设置时钟程序的窗口大小

setBackground(Colorwhite);//

设置小应用程序的背景色

}

public

void

paint(Graphics

g)

{

int

xh,

yh,

xm,

ym,

xs,

ys,

s,

m,

h;

String

today;

Date

dat

=

new

Date();

//

定义时间类dat

s

=

datgetSeconds();

//

获得时间秒

m

=

datgetMinutes();

//

获得时间分

h

=

datgetHours();

today

=

dattoLocaleString();

//

获得字符串时间格式

gclearRect(0,

0,

size()width,

size()height);

//

消除小应用程序

xcenter

=

xcenter

-

1;

//

向左移动一个像素点

if

(xcenter

<

-50)

xcenter

=

400;

//

如果xcenter小于-50,则回到初始位置

//

计算秒的坐标

xs

=

(int)

(Mathcos(s

314f

/

30

-

314f

/

2)

(Radius

-

5)

+

xcenter);

ys

=

(int)

(Mathsin(s

314f

/

30

-

314f

/

2)

(Radius

-

5)

+

ycenter);

//

计算分钟的坐标

xm

=

(int)

(Mathcos(m

314f

/

30

-

314f

/

2)

(Radius

-

10)

+

xcenter);

ym

=

(int)

(Mathsin(m

314f

/

30

-

314f

/

2)

(Radius

-

10)

+

ycenter);

//

计算小时的坐标

xh

=

(int)

(Mathcos((h

30

+

m

/

2)

314f

/

180

-

314f

/

2)

(Radius

-

20)

+

xcenter);

yh

=

(int)

(Mathsin((h

30

+

m

/

2)

314f

/

180

-

314f

/

2)

(Radius

-

20)

+

ycenter);

gsetColor(ColordarkGray);

//

设置颜色

gdrawString("9",

xcenter

-

(Radius

-

5),

ycenter

+

3);

//

显示时钟上的数字‘9’

gdrawString("3",

xcenter

+

(Radius

-

10),

ycenter

+

3);

//

显示时钟上的数字‘3’

gdrawString("12",

xcenter

-

5,

ycenter

-

(Radius

-

13));

//

显示时钟上的数字'12'

gdrawString("6",

xcenter

-

3,

ycenter

+

(Radius

-

10));

//

显示时钟上的数字'6'

gdrawString(today,

0,

125);

//

显示字符串时钟

gdrawLine(xcenter,

ycenter,

xs,

ys);

//

画秒针

gsetColor(Colorblue);

//

设置颜色

gdrawArc(xcenter

-

Radius,

ycenter

-

Radius,

2

Radius,

2

Radius,

0,

360);

//

画钟

gdrawLine(xcenter,

ycenter

-

1,

xm,

ym);

//

画分针

gdrawLine(xcenter

-

1,

ycenter,

xm,

ym);

//

画分针

gdrawLine(xcenter,

ycenter

-

1,

xh,

yh);

//

画时针

gdrawLine(xcenter

-

1,

ycenter,

xh,

yh);

//

画时针

}

public

void

start()

{

if

(timer

==

null)

{

timer

=

new

Thread(this);

//

生成Thread(多线程程序)的对象实体

timerstart();

//

启动生成的线程

}

}

public

void

stop()

{

timerstop();

//

停止线程的工作

timer

=

null;

//

放掉Thread对象

}

public

void

run()

//

改方法用来定义线程体,一旦线程被启动执行,就开始执行这个方法

{

while

(timer

!=

null)

{

try

{

Threadsleep(150);

//

使当前正在执行的线程进入睡眠时间由参数millis确定,

//

单位时间是毫秒,当这个时间过去,线程即可运行的

while

(timer

!=

null)

{

try

{

Threadsleep(150);//

使用当前正在执行的线程进入睡眠时间由参数

//

millis确定,单位是毫秒,当这个时间过去,线程即为可运行的

}

catch

(InterruptedException

e)

{

}

repaint();

//

repaint所做的事其实是去调用方法uadate重画效应用程序

}

timer

=

null;

}

catch

(InterruptedException

e)

{

}

}

}

//

所做的工作是先将整个效应用程序区域清除,再去调用paint,完成重画的动作

public

void

update(Graphics

g)

{

paint(g);

}

}

#include<reg52h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar time_buf2[16];

uchar tempdata[8];

uchar num;

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

sbit sck=P3^6;

sbit sda=P3^4;

sbit rst=P3^5;

#define ds1302_sec_add 0x80 //秒数据地址

#define ds1302_min_add 0x82 //分数据地址

#define ds1302_hr_add 0x84 //时数据地址

#define ds1302_date_add 0x86 //日数据地址

#define ds1302_month_add 0x88 //月数据地址

#define ds1302_day_add 0x8a //星期数据地址

#define ds1302_year_add 0x8c //年数据地址

#define ds1302_control_add 0x8e //控制数据地址

#define ds1302_charger_add 0x90

#define ds1302_clkburst_add 0xbe

unsigned char time_buf1[] = {20,10,07,27,17,16,00,00};//年月日时分秒周

unsigned char time_buf[16] ;//空年月日时分秒周

/向DS1302写入一字节数据/

void ds1302_write_byte(uchar add, uchar d) {

uchar i;

rst=1; /启动DS1302总线/

/写入目标地址:addr/

add= add & 0xfe;/最低位置零/

for (i = 0; i < 8; i ++) {

if (add & 0x01) {

sda=1;

}

else {

sda=0;

}

sck=1;

sck=0;

add = add >> 1;

}

/写入数据:d/

for (i = 0; i < 8; i ++) {

if (d & 0x01) {

sda=1;

}

else {

sda=0;

}

sck=1;

sck=0;

d = d >> 1;

}

rst=0; /停止DS1302总线/

}

/从DS1302读出一字节数据/

uchar ds1302_read_byte(uchar add)

{

uchar i;

uchar temp;

rst=1; /启动DS1302总线/

/写入目标地址:addr/

add = add | 0x01;/最低位置高/

for (i = 0; i < 8; i ++) {

if (add & 0x01) {

sda=1;;

}

else {

sda=0;

}

sck=1;

sck=0;

add = add >> 1;

}

/输出数据:temp/

for (i = 0; i < 8; i ++) {

temp = temp >> 1;

if (sda==1) {

temp |= 0x80;

}

else {

temp &= 0x7f;

}

sck=1;

sck=0;

}

rst=0; /停止DS1302总线/

return temp;

}

/向DS302写入时钟数据/

void ds1302_write_time()

{

unsigned char i,tmp;

for(i=4;i<7;i++){ //BCD处理

tmp=time_buf1[i]/10;

time_buf1[i]=time_buf1[i]%10;

time_buf1[i]=time_buf1[i]+tmp16;

}

ds1302_write_byte(ds1302_control_add,0x80); //打开写保护

ds1302_write_byte(ds1302_sec_add,0x80); //暂停

ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电

/ ds1302_write_byte(ds1302_year_add,time_buf[1]); //年

ds1302_write_byte(ds1302_month_add,time_buf[2]); //月

ds1302_write_byte(ds1302_date_add,time_buf[3]); //日 /

ds1302_write_byte(ds1302_hr_add,time_buf1[4]); //时

ds1302_write_byte(ds1302_min_add,time_buf1[5]); //分

ds1302_write_byte(ds1302_sec_add,time_buf1[6]); //秒

/ ds1302_write_byte(ds1302_day_add,time_buf[7]); //周 /

ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护

}

/从DS302读出时钟数据/

void ds1302_read_time() {

/ time_buf[1]=ds1302_read_byte(ds1302_year_add); //年

time_buf[2]=ds1302_read_byte(ds1302_month_add); //月

time_buf[3]=ds1302_read_byte(ds1302_date_add); //日 /

time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时

time_buf[5]=ds1302_read_byte(ds1302_min_add); //分

time_buf[6]=ds1302_read_byte(ds1302_sec_add);//秒

}

/DS302初始化函数/

void ds1302_init(void) {

rst=0; /RST脚置低/

sck=0; /SCK脚置低/

}

void display()

{

P0=table[tempdata[6]%10];

P2=7;

delay(1);

P0=table[tempdata[6]/10];

P2=6;

delay(1);

P0=0x40;

P2=5;

delay(1);

P0=table[tempdata[5]%10];

P2=4;

delay(1);

P0=table[tempdata[5]/10];

P2=3;

delay(1);

P0=0x40;

P2=2;

delay(1);

P0=table[tempdata[4]%10];

P2=1;

delay(1);

P0=table[tempdata[4]/10];

P2=0;

delay(1);

}

main()

{

unsigned char i,tmp,j;

ds1302_init(); /DS302初始化函数/

delay(15); //延时用于稳定功能

ds1302_write_time();

while(1)

{

ds1302_read_time();

for(i=4;i<7;i++)

{ //BCD处理

tmp=time_buf[i]/16;

time_buf[i]=time_buf[i]%16;

time_buf[i]=time_buf[i]+tmp10;

}

for(j=4;j<7;j++)

{

tempdata[j]=time_buf[j];

display();

}

}

}

断电计时程序要烧两次,第一次写把时间调整好了,第二次烧的时候讲写函数屏蔽了,断电计时是需要你买块小电池给1302供电的这个你应该知道吧,没电是没发工作的,上面程序我调试没问题,以前写的。。希望以后对你有帮助。。

duanEQUP0;

weiEQUP2;

keyBITP37;

ORG0000H

AJMPMAIN;绝对转移指令,2kb范围(11位)内跳转LJMP16位64kb范围内跳转

;短转移指令的功能是先使程序计数器PC加1两次(即:取出指令码),然后把加2后的地址和rel相加作为目标转移地址。因此,短转移指令是一条相对转移指令,是一条双字节双周期指令

ORG0030H;指明后面的程序从程序存储器的0030H单元开始存放

DELAY200US:;@110592MHz

NOP

NOP

NOP

PUSH30H

PUSH31H

MOV30H,#2

MOV31H,#179

NEXT:

DJNZ31H,NEXT

DJNZ30H,NEXT

POP31H

POP30H

RET

ORG0060H

;DISPLAY子程序

DISPLAY:

PUSHACC;不能写A,此处ACC代表地址,push后跟地址,代表把地址内的内容压入栈中

PUSH00H;R0

PUSH06H;R6

PUSH07H;R7

PUSH83H;DPH

PUSH82H;DPL

MOVR6,#01H;位选数据,01指的是缓冲区最低位数据

MOVR7,#08H;循环次数

FLAG:

MOVduan,#0x00;消影

MOVA,R6

CPLA;取反

MOVwei,A;位选

MOVA,#disBufDat

ADDA,R7

SUBBA,#0X08

MOVR0,A

MOVA,@R0;读出要显示的数据到A

MOVDPTR,#disTab

MOVCA,@A+DPTR;从rom取数据,取出要显示的数据对应的段码

MOVduan,A;段选

MOVA,R6

RLA

MOVR6,A;更新下一次位选

LCALLDELAY200US

DJNZR7,FLAG

POP82H;DPL

POP83H;DPH

POP07H

POP06H

POP00H

POPACC

RET

ORG0100H

;定时器中断0初始化

T0_INIT:

MOVTMOD,#0X01

MOVTH0,#0X3C

MOVTL0,#0XB0

SETBEA

SETBTR0

SETBET0

RET

ORG0130H

;T0中断处理程序

INT_TIMERE0:

PUSHACC

SETBRS0

MOVTH0,#0X3C

MOVTL0,#0XB0

INCR0

MOVA,R0

SUBBA,#0X14

JBCY,SECFLAG

MOVR0,#0x00

INCsec

SECFLAG:

CLRRS0

POPACC

RETI

ORG000BH;定时器/计数器T0入口地址

LJMPINT_TIMERE0;跳转到定时器/计数器中断服务程序中去

disTab:DB0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40;0-f,空白,横杠的段选数据

disBufDatEQU47H;定义显示缓冲数据变量区,8个

disBufDatHeadEQU40H//单片机上显示在最左边

secEQU48H

;主程序

ORG0180H

MAIN:

MOVSP,#0X60;将0x60到0x7f设为堆栈区

LCALLT0_INIT

MOVdisBufDatHead,#0X00

MOVdisBufDatHead+1,#0X00

MOVdisBufDatHead+2,#0X11

MOVdisBufDatHead+3,#0X11

MOVdisBufDatHead+4,#0X11

MOVdisBufDatHead+5,#0X11

MOVdisBufDatHead+6,#0X11

MOVdisBufDatHead+7,#0X11

MOVsec,#0X3A

WHILE:

JBkey,KEYSCAN

MOVsec,0x00

KEYSCAN:

MOVA,sec

SUBBA,#3CH;超过60s归零

JBCY,CLEAR

MOVsec,#0X00;clr加ram地址无效

CLEAR:

MOVA,sec

MOVB,#0AH

DIVAB;A/B,商存到A中,余数存B中

MOVdisBufDatHead,A

MOVdisBufDatHead+1,B

LCALLDISPLAY

LJMPWHILE;循环

END;

扩展资料

51机器周期和指令周期

1、机器周期是指单片机完成一个基本 *** 作所花费的时间,一般使用微秒来计量单片机的运行速度,51单片机的一个机器周期包括12个时钟振荡周期,也就是说如果51单片机采用12MHz晶振,那么执行一个机器周期就只需要1μs;如果采用的是6MHz的晶振,那么执行一个机器周期就需要2μs。

2、指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。在51单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个机器周期),四周期指令(执行这条指令需要四个机器周期)。

除了乘、除两条指令是四周期指令,其余均为单周期或双周期指令。也就是说,如果51单片机采用的是12MHz晶振,那么它执行一条指令一般只需1~2微秒的时间;如果采用的是6MH晶振,执行一条指令一般就需2~4微秒的时间。

以上就是关于单片机c语言时钟程序全部的内容,包括:单片机c语言时钟程序、JAVA 编写时钟程序、怎么用java编写时钟呀等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存