
/ 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编写时钟呀等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)