时钟代码
数字时钟正确代码
module clock(CLK,RST,EN,S1,S2,spk,HOURH,HOURL,MINH,MINL,SECH,SECL); input CLK,RST,EN,S1,S2;output spk;output[3:0] HOURH,HOURL,MINH,MINL,SECH,SECL;reg spk;reg[3:0] SECL,SECH,MINL,MINH,HOURL,HOURH;always @(posedge CLK or negedge RST)if(!RST) beginSECL<=0;SECH<=0;MINL<=0;MINH<=0;HOURL<=0;HOURH<=0; end//系统复位else if(EN) //EN为低电平时时钟暂停beginif(!S1) //调节小时beginif(HOURL==9) begin HOURL<=0; HOURH<=HOURH+1; endelsebeginif(HOURH==2&&HOURL==3) begin HOURL<=0;HOURH<=0; endelse HOURL<=HOURL+1;endendelse if(!S2) //调节分钟beginif(MINL==9)beginMINL<=0;if(MINH==5) MINH<=0;else MINH<=MINH+1;endelse MINL<=MINL+1;endelse if(SECL==9) //时钟正常跳动状态 beginSECL<=0;if(SECH==5)beginSECH<=0;if(MINL==9)beginMINL<=0;if(MINH==5)beginMINH<=0;if(HOURL==9) beginHOURL<=0;HOURH<=HOURH+1;endelse if(HOURH==2&&HOURL==3) begin HOURL<=0; HOURH<=0;endelse HOURL<=HOURL+1;endelse MINH<=MINH+1;endelse MINL<=MINL+1;endelse SECH<=SECH+1;endelse SECL<=SECL+1;endelsebeginHOURH<=HOURH;HOURL<=HOURL;MINH<=MINH;MINL<=MINL;SECH<=SECH;SECL<=SECL;endalways @(posedge CLK) //产生报警声音模块beginif(MINH==5&&MINL==9&&SECH==5) begin spk<=CLK;end else if(MINH==0&&MINL==0&&SECH==0) spk<=CLK;else spk<=0;endendmodule各输入、输出信号引脚说明:CLK:时钟信号RST:系统复位信号,低电平有效。
数字时钟的Verilog代码
数字时钟的Verilog代码一、功能说明:1.可准确计时2.可按键复位3.可模式切换是正常计数还是调整秒位,或调整分位或小时位,再按置数键可调整4.切换为调整模式时,相应的被调整位会2Hz的闪烁注:我的FPGA开发板时钟为33.8688Mhz我的主体代码里的信号都是1有效,但开发板按键按下去时是置0,所以我在主体代码的前面都使用了反相器。
代码均调试成功,没有任何问题,同学们可以放心复制粘贴。
二、模块说明1.主体代码2.按键消抖模块3.分频器模块我的主题代码中嵌入了按键消抖模块,按键消抖中又嵌入了分频器。
请阅读此文档的同学不要漏加,否则不能正常工作三、代码(1)主体代码module clock(seg7,scan,clk,clr1,mode2,inc2);output[7:0] seg7;output[5:0] scan;input clk; //时钟输入20MHzinput clr1; //清零端input mode2; //控制信号,用于选择模式input inc2; //置数信号//按键全部反逻辑wire clr,mode,inc;assign clr=~clr1;wire mode1,inc1;assign mode=~mode1;assign inc=~inc1;reg[7:0] seg7; //8段显示控制信号(abcdefg.dp)reg[5:0] scan; //数码管地址选择信号reg[1:0] state; //定义4种状态reg[3:0] qhh,qhl,qmh,qml,qsh,qsl; //小时、分、秒的高位和低位reg[3:0] data;reg[2:0] cnt; //扫描数码管的计数器reg clk1khz,clk1hz,clk2hz; //1kHz、1Hz、2Hz的分频信号reg[2:0] blink; //闪烁信号reg inc_reg;//按键置数寄存器reg[7:0] sec,min;//定义按键置数时的时分秒寄存器reg[7:0] hour;parameter state0=2'b00,state1=2'b01,state2=2'b10,state3=2'b11;//状态0-3定义reg[14:0] n1;reg[24:0] n2;reg[23:0] n3;//----------------------按键消抖-----------------------------IP_ButtonDebounce m1(.clk(clk),.rst(clr),.BTN0(mode2),.BTN_DEB(mode1));IP_ButtonDebounce m2(.clk(clk),.rst(clr),.BTN0(inc2),.BTN_DEB(inc1));assign mode=~mode1;assign inc=~inc1;//-----------------------------800Hz分频,用于扫描数码管地址--------always@(posedge clk or posedge clr)beginif(clr) beginclk1khz<=0;n1<=0;endelse if(n1==42336/2-1) beginclk1khz<=~clk1khz;n1<=0;endelse n1<=n1+1;end//---------------------- 1Hz分频,用于计时-----------------------------always@(posedge clk or posedge clr)beginif(clr) beginclk1hz<=0;n2<=0;endelse if(n2==33868800/2-1) beginclk1hz<=~clk1hz;n2<=0;endelse n2<=n2+1;end//---------------------- 2Hz分频,用于闪烁----------------------------- always@(posedge clk or posedge clr)beginif(clr) beginclk2hz<=0;n3<=0;endelse if(n3==16934400/2-1) beginclk2hz<=~clk2hz;n3<=0;endelse n3<=n3+1;end//-------------------------模式转换-------------------------always @(posedge mode or posedge clr)beginif(clr) beginstate<=2'b00;endelse beginif(state==2'b11) beginstate<=2'b00;endelse beginstate<=state+1;endendend//-------------------------状态控制-----------------------------always @(posedge clk1hz or posedge clr)beginif(clr) beginhour<=7'b0000000;min<=7'b0000000;sec<=7'b0000000;inc_reg<=0;endelse begincase(state)state0:begin //模式0,正常计时if(sec==8'd59)beginsec<=8'd0;if(min==8'd59) beginmin<=8'd0;if(hour==8'd23) beginhour<=8'd0;endelse beginhour<=hour+1;endendelse beginmin<=min+1;endendelse beginsec<=sec+1;endendstate1:begin //模式1,设定小时时间if(inc)b egin//如果置数键按下if(!inc_reg) begin //如果置数寄存器值为0inc_reg<=1;//置数寄存器值置1if(hour==8'd23) beginhour<=8'd0;endelse beginhour<=hour+1;endendendelse begin//如果置数键未按下inc_reg<=0; //置数寄存器还是为0endendstate2:begin //模式2,设定分钟时间if(inc) beginif(!inc_reg) begininc_reg<=1;if(min==8'd59) beginmin<=8'd0;endelse beginmin<=min+1;endendendelse begininc_reg<=0;endendstate3:begin //模式3,设定秒钟时间if(inc) beginif(!inc_reg) begininc_reg<=1;if(sec==8'd59) beginsec<=8'd0;endelse beginsec<=sec+1;endendendelse begininc_reg<=0;endendendcaseendend//--------------------------------当进行时间设定时,令数码管闪烁----------------------- always @(state,clk2hz,clr) beginif(clr) beginblink[2:0]<=3'b111;endelse begincase(state)state0:blink[2:0]<=3'b111;//正常计数时,闪烁信号全为1state1:blink[2]<=clk2hz;state2:blink[1]<=clk2hz;state3:blink[0]<=clk2hz;default:blink[2:0]<=3'b111;//默认为1endcaseendend//--------------------------秒计数的十进制转BCD码---------------------------always @(sec,clr) beginif(clr) beginqsh[3:0]<=4'b0000;qsl[3:0]<=4'b0000;endelse begincase(sec[7:0])8'd0:begin qsh[3:0]<='b0000;qsl[3:0]<='b0000; end 8'd1:begin qsh[3:0]<='b0000;qsl[3:0]<='b0001; end 8'd2:begin qsh[3:0]<='b0000;qsl[3:0]<='b0010; end 8'd3:begin qsh[3:0]<='b0000;qsl[3:0]<='b0011; end 8'd4:begin qsh[3:0]<='b0000;qsl[3:0]<='b0100; end 8'd5:begin qsh[3:0]<='b0000;qsl[3:0]<='b0101; end 8'd6:begin qsh[3:0]<='b0000;qsl[3:0]<='b0110; end 8'd7:begin qsh[3:0]<='b0000;qsl[3:0]<='b0111; end 8'd8:begin qsh[3:0]<='b0000;qsl[3:0]<='b1000; end 8'd9:begin qsh[3:0]<='b0000;qsl[3:0]<='b1001; end 8'd10:begin qsh[3:0]<='b0001;qsl[3:0]<='b0000; end 8'd11:begin qsh[3:0]<='b0001;qsl[3:0]<='b0001; end 8'd12:begin qsh[3:0]<='b0001;qsl[3:0]<='b0010; end 8'd13:begin qsh[3:0]<='b0001;qsl[3:0]<='b0011; end 8'd14:begin qsh[3:0]<='b0001;qsl[3:0]<='b0100; end 8'd15:begin qsh[3:0]<='b0001;qsl[3:0]<='b0101; end 8'd16:begin qsh[3:0]<='b0001;qsl[3:0]<='b0110; end 8'd17:begin qsh[3:0]<='b0001;qsl[3:0]<='b0111; end 8'd18:begin qsh[3:0]<='b0001;qsl[3:0]<='b1000; end 8'd19:begin qsh[3:0]<='b0001;qsl[3:0]<='b1001; end 8'd20:begin qsh[3:0]<='b0010;qsl[3:0]<='b0000; end 8'd21:begin qsh[3:0]<='b0010;qsl[3:0]<='b0001; end 8'd22:begin qsh[3:0]<='b0010;qsl[3:0]<='b0010; end 8'd23:begin qsh[3:0]<='b0010;qsl[3:0]<='b0011; end 8'd24:begin qsh[3:0]<='b0010;qsl[3:0]<='b0100; end 8'd25:begin qsh[3:0]<='b0010;qsl[3:0]<='b0101; end 8'd26:begin qsh[3:0]<='b0010;qsl[3:0]<='b0110; end 8'd27:begin qsh[3:0]<='b0010;qsl[3:0]<='b0111; end 8'd28:begin qsh[3:0]<='b0010;qsl[3:0]<='b1000; end 8'd29:begin qsh[3:0]<='b0010;qsl[3:0]<='b1001; end 8'd30:begin qsh[3:0]<='b0011;qsl[3:0]<='b0000; end 8'd31:begin qsh[3:0]<='b0011;qsl[3:0]<='b0001; end 8'd32:begin qsh[3:0]<='b0011;qsl[3:0]<='b0010; end 8'd33:begin qsh[3:0]<='b0011;qsl[3:0]<='b0011; end 8'd34:begin qsh[3:0]<='b0011;qsl[3:0]<='b0100; end 8'd35:begin qsh[3:0]<='b0011;qsl[3:0]<='b0101; end 8'd36:begin qsh[3:0]<='b0011;qsl[3:0]<='b0110; end 8'd37:begin qsh[3:0]<='b0011;qsl[3:0]<='b0111; end 8'd38:begin qsh[3:0]<='b0011;qsl[3:0]<='b1000; end 8'd39:begin qsh[3:0]<='b0011;qsl[3:0]<='b1001; end 8'd40:begin qsh[3:0]<='b0100;qsl[3:0]<='b0000; end 8'd41:begin qsh[3:0]<='b0100;qsl[3:0]<='b0001; end 8'd42:begin qsh[3:0]<='b0100;qsl[3:0]<='b0010; end8'd44:begin qsh[3:0]<='b0100;qsl[3:0]<='b0100; end8'd45:begin qsh[3:0]<='b0100;qsl[3:0]<='b0101; end8'd46:begin qsh[3:0]<='b0100;qsl[3:0]<='b0110; end8'd47:begin qsh[3:0]<='b0100;qsl[3:0]<='b0111; end8'd48:begin qsh[3:0]<='b0100;qsl[3:0]<='b1000; end8'd49:begin qsh[3:0]<='b0100;qsl[3:0]<='b1001; end8'd50:begin qsh[3:0]<='b0101;qsl[3:0]<='b0000; end8'd51:begin qsh[3:0]<='b0101;qsl[3:0]<='b0001; end8'd52:begin qsh[3:0]<='b0101;qsl[3:0]<='b0010; end8'd53:begin qsh[3:0]<='b0101;qsl[3:0]<='b0011; end8'd54:begin qsh[3:0]<='b0101;qsl[3:0]<='b0100; end8'd55:begin qsh[3:0]<='b0101;qsl[3:0]<='b0101; end8'd56:begin qsh[3:0]<='b0101;qsl[3:0]<='b0110; end8'd57:begin qsh[3:0]<='b0101;qsl[3:0]<='b0111; end8'd58:begin qsh[3:0]<='b0101;qsl[3:0]<='b1000; end8'd59:begin qsh[3:0]<='b0101;qsl[3:0]<='b1001; enddefault: begin qsh[3:0]<=4'b0000;qsl[3:0]<='b0; endendcaseendend//---------------------------分计数的十进制转BCD码-------------------- always @(min,clr)beginif(clr) beginqmh[3:0]<='b0000;qml[3:0]<='b0000;endelse begincase(min[7:0])8'd0:begin qmh[3:0]<='b0000;qml[3:0]<='b0000; end8'd1:begin qmh[3:0]<='b0000;qml[3:0]<='b0001; end8'd2:begin qmh[3:0]<='b0000;qml[3:0]<='b0010; end8'd3:begin qmh[3:0]<='b0000;qml[3:0]<='b0011; end8'd4:begin qmh[3:0]<='b0000;qml[3:0]<='b0100; end8'd5:begin qmh[3:0]<='b0000;qml[3:0]<='b0101; end8'd6:begin qmh[3:0]<='b0000;qml[3:0]<='b0110; end8'd7:begin qmh[3:0]<='b0000;qml[3:0]<='b0111; end8'd8:begin qmh[3:0]<='b0000;qml[3:0]<='b1000; end8'd9:begin qmh[3:0]<='b0000;qml[3:0]<='b1001; end8'd10:begin qmh[3:0]<='b0001;qml[3:0]<='b0000; end8'd11:begin qmh[3:0]<='b0001;qml[3:0]<='b0001; end8'd12:begin qmh[3:0]<='b0001;qml[3:0]<='b0010; end8'd13:begin qmh[3:0]<='b0001;qml[3:0]<='b0011; end8'd15:begin qmh[3:0]<='b0001;qml[3:0]<='b0101; end 8'd16:begin qmh[3:0]<='b0001;qml[3:0]<='b0110; end 8'd17:begin qmh[3:0]<='b0001;qml[3:0]<='b0111; end 8'd18:begin qmh[3:0]<='b0001;qml[3:0]<='b1000; end 8'd19:begin qmh[3:0]<='b0001;qml[3:0]<='b1001; end 8'd20:begin qmh[3:0]<='b0010;qml[3:0]<='b0000; end 8'd21:begin qmh[3:0]<='b0010;qml[3:0]<='b0001; end 8'd22:begin qmh[3:0]<='b0010;qml[3:0]<='b0010; end 8'd23:begin qmh[3:0]<='b0010;qml[3:0]<='b0011; end 8'd24:begin qmh[3:0]<='b0010;qml[3:0]<='b0100; end 8'd25:begin qmh[3:0]<='b0010;qml[3:0]<='b0101; end 8'd26:begin qmh[3:0]<='b0010;qml[3:0]<='b0110; end 8'd27:begin qmh[3:0]<='b0010;qml[3:0]<='b0111; end 8'd28:begin qmh[3:0]<='b0010;qml[3:0]<='b1000; end 8'd29:begin qmh[3:0]<='b0010;qml[3:0]<='b1001; end 8'd30:begin qmh[3:0]<='b0011;qml[3:0]<='b0000; end 8'd31:begin qmh[3:0]<='b0011;qml[3:0]<='b0001; end 8'd32:begin qmh[3:0]<='b0011;qml[3:0]<='b0010; end 8'd33:begin qmh[3:0]<='b0011;qml[3:0]<='b0011; end 8'd34:begin qmh[3:0]<='b0011;qml[3:0]<='b0100; end 8'd35:begin qmh[3:0]<='b0011;qml[3:0]<='b0101; end 8'd36:begin qmh[3:0]<='b0011;qml[3:0]<='b0110; end 8'd37:begin qmh[3:0]<='b0011;qml[3:0]<='b0111; end 8'd38:begin qmh[3:0]<='b0011;qml[3:0]<='b1000; end 8'd39:begin qmh[3:0]<='b0011;qml[3:0]<='b1001; end 8'd40:begin qmh[3:0]<='b0100;qml[3:0]<='b0000; end 8'd41:begin qmh[3:0]<='b0100;qml[3:0]<='b0001; end 8'd42:begin qmh[3:0]<='b0100;qml[3:0]<='b0010; end 8'd43:begin qmh[3:0]<='b0100;qml[3:0]<='b0011; end 8'd44:begin qmh[3:0]<='b0100;qml[3:0]<='b0100; end 8'd45:begin qmh[3:0]<='b0100;qml[3:0]<='b0101; end 8'd46:begin qmh[3:0]<='b0100;qml[3:0]<='b0110; end 8'd47:begin qmh[3:0]<='b0100;qml[3:0]<='b0111; end 8'd48:begin qmh[3:0]<='b0100;qml[3:0]<='b1000; end 8'd49:begin qmh[3:0]<='b0100;qml[3:0]<='b1001; end 8'd50:begin qmh[3:0]<='b0101;qml[3:0]<='b0000; end 8'd51:begin qmh[3:0]<='b0101;qml[3:0]<='b0001; end 8'd52:begin qmh[3:0]<='b0101;qml[3:0]<='b0010; end 8'd53:begin qmh[3:0]<='b0101;qml[3:0]<='b0011; end 8'd54:begin qmh[3:0]<='b0101;qml[3:0]<='b0100; end 8'd55:begin qmh[3:0]<='b0101;qml[3:0]<='b0101; end 8'd56:begin qmh[3:0]<='b0101;qml[3:0]<='b0110; end 8'd57:begin qmh[3:0]<='b0101;qml[3:0]<='b0111; end8'd59:begin qmh[3:0]<='b0101;qml[3:0]<='b1001; enddefault:begin qmh[3:0]<='b0;qml[3:0]<='b0; endendcaseendend//----------------------------小时计数的十进制转BCD码------------------------ always @(hour,clr)beginif(clr) beginqhh[3:0]<='b0000;qhl[3:0]<='b0000;endelse begincase(hour)8'd0:begin qhh[3:0]<='b0000;qhl[3:0]<='b0000; end8'd1:begin qhh[3:0]<='b0000;qhl[3:0]<='b0001; end8'd2:begin qhh[3:0]<='b0000;qhl[3:0]<='b0010; end8'd3:begin qhh[3:0]<='b0000;qhl[3:0]<='b0011; end8'd4:begin qhh[3:0]<='b0000;qhl[3:0]<='b0100; end8'd5:begin qhh[3:0]<='b0000;qhl[3:0]<='b0101; end8'd6:begin qhh[3:0]<='b0000;qhl[3:0]<='b0110; end8'd7:begin qhh[3:0]<='b0000;qhl[3:0]<='b0111; end8'd8:begin qhh[3:0]<='b0000;qhl[3:0]<='b1000; end8'd9:begin qhh[3:0]<='b0000;qhl[3:0]<='b1001; end8'd10:begin qhh[3:0]<='b0001;qhl[3:0]<='b0000; end8'd11:begin qhh[3:0]<='b0001;qhl[3:0]<='b0001; end8'd12:begin qhh[3:0]<='b0001;qhl[3:0]<='b0010; end8'd13:begin qhh[3:0]<='b0001;qhl[3:0]<='b0011; end8'd14:begin qhh[3:0]<='b0001;qhl[3:0]<='b0100; end8'd15:begin qhh[3:0]<='b0001;qhl[3:0]<='b0101; end8'd16:begin qhh[3:0]<='b0001;qhl[3:0]<='b0110; end8'd17:begin qhh[3:0]<='b0001;qhl[3:0]<='b0111; end8'd18:begin qhh[3:0]<='b0001;qhl[3:0]<='b1000; end8'd19:begin qhh[3:0]<='b0001;qhl[3:0]<='b1001; end8'd20:begin qhh[3:0]<='b0010;qhl[3:0]<='b0000; end8'd21:begin qhh[3:0]<='b0010;qhl[3:0]<='b0001; end8'd22:begin qhh[3:0]<='b0010;qhl[3:0]<='b0010; end8'd23:begin qhh[3:0]<='b0010;qhl[3:0]<='b0011; enddefault:begin qhh[3:0]<='b0;qhl[3:0]<='b0; endendcaseendend//------------------------------数码管动态扫描-------------------------------------always @(posedge clk1khz or posedge clr) beginif(clr) begincnt<=3'b000;scan<=6'b111111;data<=4'b0000;endelse if(clk1khz) beginif(cnt==3'b101) cnt<=3'b000;else cnt<=cnt+1;case(cnt)3'b000:begin data[3:0]<=qsl[3:0];scan[5:0]<=6'b000001&{6{blink[0]}}; end3'b001:begin data[3:0]<=qsh[3:0];scan[5:0]<=6'b000010&{6{blink[0]}}; end3'b010:begin data[3:0]<=qml[3:0];scan[5:0]<=6'b000100&{6{blink[1]}}; end3'b011:begin data[3:0]<=qmh[3:0];scan[5:0]<=6'b001000&{6{blink[1]}}; end3'b100:begin data[3:0]<=qhl[3:0];scan[5:0]<=6'b010000&{6{blink[2]}}; end3'b101:begin data[3:0]<=qhh[3:0];scan[5:0]<=6'b100000&{6{blink[2]}}; endendcaseendend//-----------------------------------7段译码----------------------------------------always @(data)begincase(data[3:0])4'b0000:seg7[7:0]=8'b00111111; //04'b0001:seg7[7:0]=8'b00000110; //14'b0010:seg7[7:0]=8'b01011011; //24'b0011:seg7[7:0]=8'b01001111; //34'b0100:seg7[7:0]=8'b01100110; //44'b0101:seg7[7:0]=8'b01101101; //54'b0110:seg7[7:0]=8'b01111101; //64'b0111:seg7[7:0]=8'b00000111; //74'b1000:seg7[7:0]=8'b01111111; //84'b1001:seg7[7:0]=8'b01101111; //9default:seg7[7:0]=8'b00111111; //0endcaseendendmodule(2)按键消抖模块module IP_ButtonDebounce( clk,rst,BTN0,BTN_DEB );input clk;input rst;input BTN0;output BTN_DEB;//分频得200HZ,5ms时钟wire clk_169344;IP_1Hz #(169344) U1(.clk(clk),.rst(rst),.clk_N(clk_169344));reg BTN_r,BTN_rr,BTN_rrr;always@(posedge rst,posedge clk_169344 ) beginif(rst) beginBTN_rrr<=1'b1;BTN_rr<=1'b1;BTN_r<=1'b1;endelse beginBTN_rrr<=BTN_rr;BTN_rr<=BTN_r;BTN_r<=BTN0;endendassign BTN_DEB=BTN_r&BTN_rr&BTN_rrr;endmodule(3)分频器模块module IP_1Hz(clk,rst,clk_N); //clk=33.8688MHz,N分频模块input clk;input rst;output reg clk_N;parameter N=4;integer count;always@(posedge clk or posedge rst)beginif(rst) beginclk_N<=0;count<=0;endelse if(count==N/2-1) beginclk_N<= ~clk_N;count<=0;end。
时钟代码及注释
HOUR EQU 36HMIN EQU 37HSEC EQU 38HCHOUR1 EQU 39H;定义3个闹钟的时分CMIN1 EQU 40HCHOUR2 EQU 41HCMIN2 EQU 42HCHOUR3 EQU 43HCMIN3 EQU 44HORG 0000H;设定各个中断入口LJMP MIANORG 0003HLJMP W AIZD0ORG 000BHLJMP DINGSHIORG 0030HMIAN:MOV TMOD,#02H;使用定时器模式2 MOV TH0,#06H;设定初值为250usMOV TL0,#06HSETB TR0SETB EA;打开各个中断SETB ET0SETB EX0SETB PT0;定时器0优先级最高MOV HOUR,#0MOV MIN,#0MOV SEC,#0MOV P0,#0FFHMOV CHOUR1,#6;闹钟1设置默认数值MOV CMIN1,#0MOV CHOUR2,#8;闹钟2设置默认数值MOV CMIN2,#0MOV CHOUR3,#14;闹钟3设置默认数值MOV CMIN3,#0D0: ACALL XIANSHISECACALL XIANSHIMINACALL XIANSHIHOURACALL JIANGEACALL CLOCKZAJMP D0;要循环扫描才能动态显示CLOCKZ:;闹钟的调用函数MOV A,HOUR;闹钟一点判断CJNE A,CHOUR1,CN2;判断小时到了没有小时MOV A,MINCJNE A,CMIN1,CN2;判断分钟到时没SETB P3.4;开闹钟ACALL DELAYCLR P3.4CN2: MOV A,HOUR;闹钟2点判断CJNE A,CHOUR2,CN3;判断小时到了没有小时MOV A,MINCJNE A,CMIN2,CN3;判断分钟到时没SETB P3.4;开闹钟ACALL DELAYCLR P3.4CN3: MOV A,HOUR;闹钟2点判断CJNE A,CHOUR3,CNO;判断小时到了没有小时MOV A,MINCJNE A,CMIN3,CNO;判断分钟到时没SETB P3.4;开闹钟ACALL DELAYCLR P3.4CNO: RETSHUJU:INC 31HMOV R0,31HCJNE R0,#40,OUT0;时间达到10ms则执行下一行程序,否则返回OUT0 MOV 31H,#0MOV R0,#0INC 32HMOV R1,32HCJNE R1,#100,OUT0;时间达到1s则执行下一行程序,否则返回OUT0MOV 32H,#0MOV R1,#0INC SECMOV R2,SECCJNE R2,#60,OUT0;时间达到60s则执行下一行程序,否则返回OUT0MOV R2,#0MOV SEC,#0INC MINMOV R3,MINCJNE R3,#60,OUT0;时间达到60min则执行下一行程序,否则返回OUT0 MOV R3,#0MOV MIN,#0INC HOURCJNE R4,#24,OUT0;时间达到24h则执行下一行程序,否则返回OUT0 MOV R4,#0MOV HOUR,#0OUT0:RETJIANGE: MOV DPTR,#TABLE ;-的显示MOV A,#10;11为table编码的序地址MOVC A,@A+DPTRMOV P1,AMOV P2,#24HACALL DELAYMOV P1,#0FFHRETXIANSHISEC:MOV DPTR,#TABLEMOV A,SECMOV B,#10DIV ABMOVC A,@A+DPTRMOV P1,A;这是为位选,就是要显示的数字选?MOV P2,#02H;这是段段选,是控制哪一位,显示第一位ACALL DELAYMOV P1,#0FFHMOV A,BMOVC A,@A+DPTRMOV P1,AMOV P2,#01HACALL DELAYMOV P1,#0FFHRETXIANSHIMIN:MOV DPTR,#TABLEMOV A,MINMOV B,#10DIV ABMOVC A,@A+DPTRMOV P1,AMOV P2,#10HACALL DELAYMOV P1,#0FFHMOV A,BMOVC A,@A+DPTRMOV P1,AACALL DELAYMOV P1,#0FFHRETXIANSHIHOUR:MOV DPTR,#TABLEMOV A,HOURMOV B,#10DIV ABMOVC A,@A+DPTRMOV P1,AMOV P2,#80HACALL DELAYMOV P1,#0FFHMOV A,BMOVC A,@A+DPTRMOV P1,AMOV P2,#40HACALL DELAYMOV P1,#0FFHRETXIANCLOCK1:;闹钟1显示函数MOV DPTR,#TABLEMOV A,CHOUR1;显示闹钟小时MOV B,#10DIV ABMOVC A,@A+DPTR;显示十位MOV P1,AMOV P2,#80HACALL DELAYMOV P1,#0FFHMOV A,BMOVC A,@A+DPTR;显示个位MOV P1,AMOV P2,#40HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE ;间隔-的显示MOV A,#10;11为table编码的序地址MOVC A,@A+DPTRMOV P1,AMOV P2,#24HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE;显示闹钟1的分钟MOV A,CMIN1MOV B,#10DIV ABMOVC A,@A+DPTR;显示十位MOV P1,AMOV P2,#10HACALL DELAYMOV P1,#0FFHMOV A,BMOVC A,@A+DPTR;显示个位MOV P1,AMOV P2,#08HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE ;间隔C的显示MOV A,#11;11为table编码C的地址MOVC A,@A+DPTRMOV P1,AMOV P2,#02HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE ;间隔1的显示MOV A,#1MOVC A,@A+DPTRMOV P1,AMOV P2,#01HACALL DELAYMOV P1,#0FFHRETXIANCLOCK2:;闹钟2显示函数MOV DPTR,#TABLEMOV A,CHOUR2;显示闹钟小时MOV B,#10DIV ABMOVC A,@A+DPTR;显示十位MOV P1,AMOV P2,#80HACALL DELAYMOV P1,#0FFHMOV A,BMOVC A,@A+DPTR;显示个位MOV P1,AMOV P2,#40HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE ;间隔-的显示MOV A,#10;11为table编码的序地址MOVC A,@A+DPTRMOV P1,AMOV P2,#24HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE;显示闹钟3的分钟MOV A,CMIN2MOV B,#10DIV ABMOVC A,@A+DPTR;显示十位MOV P1,AMOV P2,#10HACALL DELAYMOV P1,#0FFHMOV A,BMOVC A,@A+DPTR;显示个位MOV P1,AMOV P2,#08HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE ;间隔C的显示MOV A,#11;11为table编码C的地址MOVC A,@A+DPTRMOV P1,AMOV P2,#02HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE ;间隔2的显示MOV A,#2MOVC A,@A+DPTRMOV P1,AMOV P2,#01HACALL DELAYMOV P1,#0FFHRETXIANCLOCK3:;闹钟1显示函数MOV DPTR,#TABLEMOV A,CHOUR3;显示闹钟小时MOV B,#10DIV ABMOVC A,@A+DPTR;显示十位MOV P1,AMOV P2,#80HACALL DELAYMOV P1,#0FFHMOV A,BMOVC A,@A+DPTR;显示个位MOV P1,AMOV P2,#40HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE ;间隔-的显示MOV A,#10;11为table编码的序地址MOVC A,@A+DPTRMOV P1,AMOV P2,#24HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE;显示闹钟3的分钟MOV A,CMIN3MOV B,#10DIV ABMOVC A,@A+DPTR;显示十位MOV P1,AMOV P2,#10HACALL DELAYMOV P1,#0FFHMOV A,BMOVC A,@A+DPTR;显示个位MOV P1,AMOV P2,#08HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE ;间隔C的显示MOV A,#11;11为table编码C的地址MOVC A,@A+DPTRMOV P1,AMOV P2,#02HACALL DELAYMOV P1,#0FFHMOV DPTR,#TABLE ;间隔3的显示MOV A,#3MOVC A,@A+DPTRMOV P1,AMOV P2,#01HACALL DELAYMOV P1,#0FFHRETDINGSHI:MOV TH0,#06H;初值为250usMOV TL0,#06HACALL SHUJURETISETKEY:JNB P3.7,$ACALL DELAYSETHOUR:ACALL XIANSHIHOURJB P3.1,HOURJIANJNB P3.1,$INC HOURMOV A,HOURCJNE A,#24,HOURJIANMOV HOUR,#0HOURJIAN:JB P3.0,OUTHJNB P3.0,$ACALL DELAYDEC HOURMOV A,HOURCJNE A,#-1,OUTHMOV HOUR,#23OUTH: JB P3.7,SETHOURJNB P3.7,$ACALL DELAYSETMIN: ACALL XIANSHIMINJB P3.1,MINJIANJNB P3.1,$INC MINMOV A,MINCJNE A,#60,MINJIANMOV MIN,#0MINJIAN:JB P3.0,OUTH0JNB P3.0,$ACALL DELAYDEC MINMOV A,MINCJNE A,#-1,OUTH0MOV MIN,#59OUTH0: JB P3.7,SETMINJNB P3.7,$;ACALL DELAYRET;闹钟子设置程序SETCLOCK:C1SHI: ACALL XIANCLOCK1;调用闹钟一显示函数JB P3.1,C1JIAN;如果被按下则顺序执行,不按下则跳转判断减法按键JNB P3.1,$;松手检测ACALL DELAYINC CHOUR1;按下则闹钟1的时自加1MOV A,CHOUR1CJNE A,#24,C1JIANMOV CHOUR1,#0C1JIAN: JB P3.0,DCCC1;按下则执行自减1JNB P3.0,$DEC CHOUR1;自减1ACALL DELAYMOV A,CHOUR1CJNE A,#-1,DCCC1MOV CHOUR1,#23DCCC1: JB P3.7,C1SHI;切换键按下则执行下面的分钟设置,不按下则跳转回时闹钟时的设置JNB P3.7,$ACALL DELAYC1FEN: ACALL XIANCLOCK1JB P3.1,JIANFEN1;如果被按下则顺序执行,不按下则跳转判断减法按键JNB P3.1,$;松手检测ACALL DELAYINC CMIN1;按下则闹钟1的时自加1MOV A,CMIN1CJNE A,#60,JIANFEN1;判断是否为60MOV CMIN1,#0JIANFEN1:JB P3.0,SETC2;不按下则转到闹钟2设置JNB P3.0,$ACALL DELAYDEC CMIN1MOV A,CMIN1CJNE A,#-1,SETC2MOV CMIN1,#59SETC2: JB P3.7,C1FEN;切换键按下则执行闹钟2JNB P3.7,$ACALL DELAY;闹钟2C2SHI: ACALL XIANCLOCK2;调用闹钟一显示函数JB P3.1,C1JIAN2;如果被按下则顺序执行,不按下则跳转判断减法按键JNB P3.1,$;松手检测ACALL DELAYINC CHOUR2;按下则闹钟2的时自加1MOV A,CHOUR2CJNE A,#24,C1JIAN2MOV CHOUR2,#0C1JIAN2:JB P3.0,DCCC2;按下则执行自减1JNB P3.0,$DEC CHOUR2;自减1ACALL DELAYMOV A,CHOUR2CJNE A,#-1,DCCC2MOV CHOUR2,#23DCCC2: JB P3.7,C2SHI;切换键按下则执行下面的分钟设置,不按下则跳转回时闹钟时的设置JNB P3.7,$ACALL DELAYC2FEN: ACALL XIANCLOCK2JB P3.1,JIANFEN2;如果被按下则顺序执行,不按下则跳转判断减法按键JNB P3.1,$;松手检测ACALL DELAYINC CMIN2;按下则闹钟2的时自加1MOV A,CMIN2CJNE A,#60,JIANFEN2MOV CMIN2,#0JIANFEN2:JB P3.0,SETC22;不按下则转到闹钟2设置JNB P3.0,$ACALL DELAYDEC CMIN2MOV A,CMIN2CJNE A,#-1,SETC22MOV CMIN1,#59SETC22: JB P3.7,C2FEN;切换键按下则向下执行闹钟三。
数字时钟代码
数字时钟代码1. 介绍数字时钟是一种常见的显示时间的装置,它通过数字显示屏显示当前的小时和分钟。
本文档将介绍如何编写一个简单的数字时钟代码。
2. 代码实现以下是一个基本的数字时钟代码实现示例:import timewhile True:current_time = time.localtime()hour = str(current_time.tm_hour).zfill(2)minute = str(current_time.tm_min).zfill(2)second = str(current_time.tm_sec).zfill(2)clock_display = f"{hour}:{minute}:{second}"print(clock_display, end="\r")time.sleep(1)代码说明:- `time.localtime()` 函数返回当前时间的结构化对象,包括小时、分钟和秒等信息。
- `str(current_time.tm_hour).zfill(2)` 将小时转换为字符串,并使用 `zfill()` 方法填充到两位数。
- `str(current_time.tm_min).zfill(2)` 和`str(current_time.tm_sec).zfill(2)` 同理处理分钟和秒。
- 使用 f-string 格式化字符串 `clock_display`,将小时、分钟和秒显示为 `` 的形式。
- `print(clock_display, end="\r")` 使用 `\r` 实现覆盖打印,使得时钟在同一行连续显示。
- `time.sleep(1)` 让程序每隔一秒更新一次时间。
请注意,上述代码需要在支持 Python 的环境中运行。
3. 结束语通过以上的代码实现,我们可以编写一个简单的数字时钟。
简单时钟的电脑编程代码
以下是一个简单的使用Python和turtle库来创建一个模拟时钟的代码。
这个时钟将显示当前的时间,并且每秒更新一次。
python复制代码import turtleimport timewin = turtle.Screen()win.setup(width=600, height=600)win.bgcolor("black")# 创建一个新的Turtle对象clock_turtle = turtle.Turtle()clock_turtle.hideturtle()# 循环每秒更新一次时间while True:# 获取当前时间current_time = time.strftime("%H:%M:%S")# 清空屏幕win.clear()# 画时钟的边框clock_turtle.penup()clock_turtle.goto(-200, -200)clock_turtle.pendown()clock_turtle.circle(400)# 画时钟的小时数clock_turtle.penup()clock_turtle.goto(-100, -150)clock_turtle.pendown()clock_turtle.setheading(0)clock_turtle.forward(200)clock_turtle.setheading(90)clock_turtle.forward(100)clock_turtle.setheading(180)clock_turtle.forward(200)clock_turtle.setheading(270)clock_turtle.forward(100)# 画时钟的分钟数clock_turtle.penup()clock_turtle.goto(-50, -150)clock_turtle.pendown()clock_turtle.setheading(0)clock_turtle.forward(150)clock_turtle.setheading(90)clock_turtle.forward(100)clock_turtle.setheading(180)clock_turtle.forward(150)clock_turtle.setheading(270)clock_turtle.forward(100)# 画时钟的秒钟数clock_turtle.penup()clock_turtle.goto(0, -150)clock_turtle.pendown()clock_turtle.setheading(0)clock_turtle.forward(120)clock_turtle.setheading(90)clock_turtle.forward(100)clock_turtle.setheading(180)clock_turtle.forward(120)clock_turtle.setheading(270)clock_turtle.forward(100)# 显示时间文本clock_turtle.penup()clock_turtle.goto(-150, -80)clock_turtle.pendown()clock_turtle.color("white")clock_turtle.write(current_time, font=("Arial", 24, "normal")) # 显示时间文本,字体大小为24,正常样式显示文本。
时钟c语言代码
}
1*/ { second = 0; minute++; } if (minute == 60)/*若minute值为60,表示已过1小时,则 hour值加1*/ { minute = 0; hour++; } if (hour == 24) /*若hour值为24,则hour的值从0开始计时*/ { hour = 0; } } /* 函数功能:时、分、秒时间的显示 函数参数:无 函数返回值:无 */ void Display(void) /*用回车符'\r'不换行,控制时、分、秒显示的位置 */ { printf("%2d:%2d:%2d\r", hour, minute, second); } /* 函数功能:模拟延迟1秒的时间 函数参数:无 函数返回值:无 */ void Delay(void) { 00; t++) { /*循环体为空语句的循环,起延时作用*/ ; }
int main(void) { long i; hour = minute = second = 0; /*hour,minute,second赋初值0*/ for (i=0; i<100000; i++) /*利用循环结构,控制时钟运行的时间*/ { Update(); /*时钟更新*/ Display(); /*时间显示*/ Delay(); /*模拟延时1秒*/ } return 0; } /* 函数功能:时、分、秒时间的更新 函数参数:无 函数返回值:无 */ void Update(void) { second++; if (second == 60)/*若second值为60,表示已过1分钟,则 minute值加
DS3231高精度时钟程序代码(单片机STC89c52RC与1602显示)
//DS3231,经测试,日期,时间,星期,温度可以用1602显示#in elude <reg51.h>#in elude vintrin s.h>#defi ne uchar un sig ned char#defi ne uint un sig ned int#define yh 0x80 //第一行的初始位置#defi ne er 0x80+0x40 // 第二行初始位置sbit wr=P1A1;sbit rs=P1A。
;sbit en=卩2人5;sbit SDA=P3A6; //模拟I2C数据传送位 SDAsbit SCL=P3A7; //模拟I2C时钟控制位 SCL sbit INT=P3A2;sbit key1=P1A7; // 功能键,修改键sbitkey2=P3A4;// 上调键sbitkey3=P3A5;// 下调键sbit RESET=P3A3;bit ack;// 应答标志位#define DS3231 _WriteAddress 0xD0 // 器件写地址#define DS3231 _ReadAddress 0xD1// 器件读地址#define DS3231_SECOND 0x00 // 秒#define DS3231 _MINUTE 0x01 // 分#define DS3231 _HOUR 0x02 // 时#define DS3231 _WEEK 0x03 // 星期#define DS3231 _DAY 0x04 // 日#define DS3231_MONTH 0x05 // 月#define DS3231 _YEAR 0x06 // 年// 闹铃 1#define DS3231 _SALARM1ECOND 0x07 // 秒#define DS3231 _ALARM1MINUTE 0x08 // 分#define DS3231 _ALARM1HOUR 0x09 // 时#define DS3231 _ALARM1WEEK 0x0A// 星期 / 日// 闹铃 2#define DS3231 _ALARM2MINUTE 0x0b // 分#define DS3231 _ALARM2HOUR0x0c // 时可编辑#define DS3231_TEMPERATUREH 0x11#define DS3231_TEMPERATUREL 0x12 uchara,miao,shi,fen,ri,yue,nian,week,temp1,temp2,key1n,temp; uchar code tab1[]={"2017- - FRI"}; uchar code tab2[]={" : : ."};uchar HEX2BCD(uchar val) //B 码转换为 BCD 码{uchar k;k=(val)/10*16+(val)%10; return k;}uchar BCD_Decimal(uchar bcd){uchar Decimal; Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));#define DS3231_ALARM2WEEK #define DS3231_CONTROL #define DS3231_STATUS #define BSY #define OSF0x0d // 星期 / 日0x0e // 控制寄存器 0x0f // 状态寄存器2 // 忙7// 振荡器停止标志#define DS3231_XTAL0x10 // 晶体老化寄存器// 温度寄存器高字节 // 温度寄存器低字节 (8 位 ) (高 2 位 )}void delayus(uint us){while (us--);}void Start_I2C(){SDA=1; // 发送起始条件的数据信号 delayus(1);SCL=1;delayus(5); // 起始条件建立时间大于 4.7us, 延时SDA=0; // 发送起始信号delayus(5); //起始条件锁定时间大于4阳SCL=0; //钳住 I2C 总线,准备发送或接收数据delayus(2);}void Stop_I2C(){SDA=0; // 发送结束条件的数据信号delayus(1); // 发送结束条件的时钟信号SCL=1; // 结束条件建立时间大于 4us delayus(5);SDA=1; // 发送 I2C 总线结束信号delayus(4);}void SendByte(uchar c){uchar BitCnt;for(BitCnt=0;BitCnt<8;BitCnt ++){if((c<<BitCnt)&0x80)SDA=1;elseSDA=0;delayus(1);SCL=1;数据位delayus(5);SCL=0;// 要传送的数据长度为 8 位// 判断发送位// 置时钟线为高,通知被控器开始接收//保证时钟咼电平周期大于 4阳delayus(2);SDA=1; //8 位发送完后释放数据线,准备接收应答位delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1; // 判断是否接收到应答信号SCL=0;delayus(2);}uchar RcvByte(){uchar retc;uchar BitCnt;retc=0;SDA=1; // 置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++)SCL=0;delayus(5);SCL=1;delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1;delayus(2);}SCL=0;delayus(2);return(retc);}// 置时钟线为低,准备接收数据位//时钟低电平周期大于 4.7 Q//置时钟线为高使数据线上数据有效// 读数据位 ,接收的数据位放入 retc 中void Ack_I2C(bit a){if(a==0)SDA=0; else // 在此发出应答或非应答信号SDA=1;SCL=1;delayus(5); //时钟低电平周期大于4阴SCL=0; // 清时钟线,钳住 I2C 总线以便继续接收delayus(2);}uchar write_byte(uchar addr, uchar write_data) {Start_I2C();SendByte(DS3231_WriteAddress);if (ack == 0)return 0;SendByte(addr);if (ack == 0)return 0;SendByte(write_data);if (ack == 0)return 0;Stop_I2C();return 1;}uchar read_current(){uchar read_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data = RcvByte();Ack_I2C(1);Stop_I2C();return read_data;}uchar read_random(uchar random_addr) {Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)SendByte(random_addr);if(ack==0)return(0);return(read_current()); }void ModifyTime(uchar yea,uchar sec,uchar week){uchar temp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp);temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp);temp=HEX2BCD(da);write_byte(DS3231_DAY,temp);temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp); mon,uchar da,uchar hou,uchar// 修改年// 修改月// 修改日// 修改时min,uchartemp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp); // 修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp); // 修改秒temp=HEX2BCD(week);write_byte(DS3231_WEEK,temp); // 修改星期}**************** 液晶写入********************** write_1602com(uchar com)// 液晶写入指令函数{ rs=0;// 置为写入命令P0=com;// 送入数据delayus(1000);en=1;// 拉高使能端delayus(1000);en=0;// 完成高脉冲}write_1602dat(uchar dat){rs=1;// 置为写入数据P0=dat;// 送入数据delayus(1000);en=1;delayus(1000);en=0;}*******************over*********************lcd_init()// 液晶初始化函数{ wr=0;write_1602com(0x38);// 设置液晶工作模式write_1602com(0x0c);// 开显示不显示光标write_1602com(0x06);// 整屏不移动,指针加一write_1602com(0x01);write_1602com(yh+1);// 字符写入的位置for(a=0;a<14;a++){write_1602dat(tab1[a]);//delay(3);}write_1602com(er);for(a=0;a<12;a++){//delay(3);}write_1602com(er+14); // 写温度符号write_1602dat(0xdf);write_1602dat(0x43);void write_sfm(uchar add,uchar dat)// 写时分秒及温度{ uchar gw,sw;gw=dat%10;sw=dat/10;write_1602com(er+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw);}void write_nyr(uchar add,uchar dat) // 写日期{ uchar gw,sw;gw=dat%10;sw=dat/10;write_1602com(yh+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw);}void write_week(uchar week)// 写星期函数{write_1602com(yh+0x0c);switch(week){case 1:write_1602dat('M');//delay(5);write_1602dat('O');//delay(5);write_1602dat('N');break;case 2:write_1602dat('T');//delay(5);write_1602dat('U');//delay(5);write_1602dat('E');break;case 3:write_1602dat('W');//delay(5);break;case 4:write_1602dat('T');//delay(5);write_1602dat('H');//delay(5);write_1602dat('U');break;case 5:write_1602dat('F');//delay(5);write_1602dat('R');//delay(5);write_1602dat('I');break;case 6:write_1602dat('S');//delay(5);write_1602dat('T');//delay(5);write_1602dat('A');break;case 7:write_1602dat('S');//delay(5);write_1602dat('U');//delay(5);write_1602dat('N');break;}void keyscan(){if(key1==0)//key1 为功能键{delayus(5000);if(key1==0){while(!key1);key1n++;if(key1n==9)key1n=1;switch(key1n){case 1: TR0=0;// 关闭定时器//TR1=0;write_1602com(er+0x06);// 写入光标位置write_1602com(0x0f);// 设置光标为闪烁break;//write_1602com(0x0f);break;case 3: write_1602com(er+0);//shi//write_1602com(0x0f);break;case 4: write_1602com(yh+0x0d);//week//write_1602com(0x0f);break;case 5: write_1602com(yh+0x09);//ri//write_1602com(0x0f);break;case 6: write_1602com(yh+0x06);//yue//write_1602com(0x0f);break;case 7: write_1602com(yh+0x03);//nian//write_1602com(0x0f);break;case 8: write_1602com(0x0c);// 设置光标不闪烁write_sfm(6,miao);// 写入新的秒数temp=(miao)/10*16+(miao)%10;write_byte(DS3231_SECOND,temp); // 退出时修改秒write_1602com(er+6);temp=(fen)/10*16+(fen)%10;write_byte(DS3231_MINUTE,temp); // 修改分write_1602com(er+3);TR0=1;// 打开定时器break;}}}if(key1n!=0)// 当 key1 按下以下。
89C51液晶时钟源代码
{
Sound=0;
}
}
}
}
/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓时间、闹铃设置函数↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
void SetTime(void) //时间设置
if (SoundFlage_2==RingingTime) //若计够设置的响铃时间
{
SoundFlage_1=0; //关响铃
SoundFlage_2=0; //清计数
Sound=1; //关蜂鸣器
}
}
void lcd_w_cmd ( uchar com ); //声明对1602液晶写指令函数
void delay_us ( uchar t ); //声明延时函数
uchar GetKey(void); //声明读按键值函数
void QueryKeyboard(void); //声明查询按键函数
Minute--;
else
{
Minute=59;
if(Hour==0)
Hour=23;
else Hour--;
}
}
TimeDisplay(); //显示当前时钟的= P3^0; //设定控制按键的IO口,1号按键加
sbit two_lower= P3^1; //2号按键减
sbit set_sel = P3^2; //3号按键选择
sbit quit = P3^3; //4号按键退出
sbit alarm_on = P3^4; //5号按键闹铃开关
sbit Sound = P1^5; //设定的蜂鸣器的IO口
灯箱时钟代码
灯箱时钟代码本文档介绍了创建一个简单的灯箱时钟的代码。
灯箱时钟是一种使用 LED 灯带来显示时间的装置。
我们将使用 Arduino 平台和一些基本电子元件来搭建这个时钟。
材料清单在开始之前,确保你具备以下材料:Arduino 开发板LED 灯带电阻连接线电路图以下是连接电路的基本示意图:代码实现请按照以下步骤编写代码:1.导入所需的库:include2.定义灯带的引脚:define PIN_LED_STRIP 63.设置灯带的长度:define NUM_LED_STRIP 604.创建一个 NeoPixel 对象:Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LED_STRIP。
PIN_LED_STRIP。
NEO_GRB + NEO_KHZ800);5.初始化灯带:void setup() {strip.begin();strip.show();6.定义一个函数,用于更新灯带的颜色:void updateLEDStrip(int hour。
int minute。
int second) { strip.clear();将时、分、秒转换为一个 0 到 255 之间的值int hourValue = map(hour。
0.23.0.255);int minuteValue = map(minute。
0.59.0.255);int secondValue = map(second。
0.59.0.255);设置灯带的颜色for (int i = 0.i < NUM_LED_STRIP。
i++) {if (i < hourValue) {strip.setPixelColor(i。
strip.Color(255.0.0))。
// 红色else if (i < hourValue + minuteValue) {strip.setPixelColor(i。
DS3231高精度时钟程序代码(单片机STC89c52RC与1602显示)
//DS3231,经测试,日期,时间,星期,温度可以用1602显示#in elude <reg51.h>#in elude vintrin s.h>#defi ne uchar un sig ned char#defi ne uint un sig ned int#define yh 0x80 //第一行的初始位置#defi ne er 0x80+0x40 // 第二行初始位置sbit wr=P1A1;sbit rs=P1A。
;sbit en=卩2人5;sbit SDA=P3A6; //模拟I2C数据传送位 SDAsbit SCL=P3A7; //模拟I2C时钟控制位 SCL sbit INT=P3A2;sbit key1=P1A7; // 功能键,修改键sbitkey2=P3A4;// 上调键sbitkey3=P3A5;// 下调键sbit RESET=P3A3;bit ack;// 应答标志位#define DS3231 _WriteAddress 0xD0 // 器件写地址#define DS3231 _ReadAddress 0xD1// 器件读地址#define DS3231_SECOND 0x00 // 秒#define DS3231 _MINUTE 0x01 // 分#define DS3231 _HOUR 0x02 // 时#define DS3231 _WEEK 0x03 // 星期#define DS3231 _DAY 0x04 // 日#define DS3231_MONTH 0x05 // 月#define DS3231 _YEAR 0x06 // 年// 闹铃 1#define DS3231 _SALARM1ECOND 0x07 // 秒#define DS3231 _ALARM1MINUTE 0x08 // 分#define DS3231 _ALARM1HOUR 0x09 // 时#define DS3231 _ALARM1WEEK 0x0A// 星期 / 日// 闹铃 2#define DS3231 _ALARM2MINUTE 0x0b // 分#define DS3231 _ALARM2HOUR0x0c // 时可编辑#define DS3231_TEMPERATUREH 0x11#define DS3231_TEMPERATUREL 0x12 uchara,miao,shi,fen,ri,yue,nian,week,temp1,temp2,key1n,temp; uchar code tab1[]={"2017- - FRI"}; uchar code tab2[]={" : : ."};uchar HEX2BCD(uchar val) //B 码转换为 BCD 码{uchar k;k=(val)/10*16+(val)%10; return k;}uchar BCD_Decimal(uchar bcd){uchar Decimal; Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));#define DS3231_ALARM2WEEK #define DS3231_CONTROL #define DS3231_STATUS #define BSY #define OSF0x0d // 星期 / 日0x0e // 控制寄存器 0x0f // 状态寄存器2 // 忙7// 振荡器停止标志#define DS3231_XTAL0x10 // 晶体老化寄存器// 温度寄存器高字节 // 温度寄存器低字节 (8 位 ) (高 2 位 )}void delayus(uint us){while (us--);}void Start_I2C(){SDA=1; // 发送起始条件的数据信号 delayus(1);SCL=1;delayus(5); // 起始条件建立时间大于 4.7us, 延时SDA=0; // 发送起始信号delayus(5); //起始条件锁定时间大于4阳SCL=0; //钳住 I2C 总线,准备发送或接收数据delayus(2);}void Stop_I2C(){SDA=0; // 发送结束条件的数据信号delayus(1); // 发送结束条件的时钟信号SCL=1; // 结束条件建立时间大于 4us delayus(5);SDA=1; // 发送 I2C 总线结束信号delayus(4);}void SendByte(uchar c){uchar BitCnt;for(BitCnt=0;BitCnt<8;BitCnt ++){if((c<<BitCnt)&0x80)SDA=1;elseSDA=0;delayus(1);SCL=1;数据位delayus(5);SCL=0;// 要传送的数据长度为 8 位// 判断发送位// 置时钟线为高,通知被控器开始接收//保证时钟咼电平周期大于 4阳delayus(2);SDA=1; //8 位发送完后释放数据线,准备接收应答位delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1; // 判断是否接收到应答信号SCL=0;delayus(2);}uchar RcvByte(){uchar retc;uchar BitCnt;retc=0;SDA=1; // 置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++)SCL=0;delayus(5);SCL=1;delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1;delayus(2);}SCL=0;delayus(2);return(retc);}// 置时钟线为低,准备接收数据位//时钟低电平周期大于 4.7 Q//置时钟线为高使数据线上数据有效// 读数据位 ,接收的数据位放入 retc 中void Ack_I2C(bit a){if(a==0)SDA=0; else // 在此发出应答或非应答信号SDA=1;SCL=1;delayus(5); //时钟低电平周期大于4阴SCL=0; // 清时钟线,钳住 I2C 总线以便继续接收delayus(2);}uchar write_byte(uchar addr, uchar write_data) {Start_I2C();SendByte(DS3231_WriteAddress);if (ack == 0)return 0;SendByte(addr);if (ack == 0)return 0;SendByte(write_data);if (ack == 0)return 0;Stop_I2C();return 1;}uchar read_current(){uchar read_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data = RcvByte();Ack_I2C(1);Stop_I2C();return read_data;}uchar read_random(uchar random_addr) {Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)SendByte(random_addr);if(ack==0)return(0);return(read_current()); }void ModifyTime(uchar yea,uchar sec,uchar week){uchar temp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp);temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp);temp=HEX2BCD(da);write_byte(DS3231_DAY,temp);temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp); mon,uchar da,uchar hou,uchar// 修改年// 修改月// 修改日// 修改时min,uchartemp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp); // 修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp); // 修改秒temp=HEX2BCD(week);write_byte(DS3231_WEEK,temp); // 修改星期}**************** 液晶写入********************** write_1602com(uchar com)// 液晶写入指令函数{ rs=0;// 置为写入命令P0=com;// 送入数据delayus(1000);en=1;// 拉高使能端delayus(1000);en=0;// 完成高脉冲}write_1602dat(uchar dat){rs=1;// 置为写入数据P0=dat;// 送入数据delayus(1000);en=1;delayus(1000);en=0;}*******************over*********************lcd_init()// 液晶初始化函数{ wr=0;write_1602com(0x38);// 设置液晶工作模式write_1602com(0x0c);// 开显示不显示光标write_1602com(0x06);// 整屏不移动,指针加一write_1602com(0x01);write_1602com(yh+1);// 字符写入的位置for(a=0;a<14;a++){write_1602dat(tab1[a]);//delay(3);}write_1602com(er);for(a=0;a<12;a++){//delay(3);}write_1602com(er+14); // 写温度符号write_1602dat(0xdf);write_1602dat(0x43);void write_sfm(uchar add,uchar dat)// 写时分秒及温度{ uchar gw,sw;gw=dat%10;sw=dat/10;write_1602com(er+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw);}void write_nyr(uchar add,uchar dat) // 写日期{ uchar gw,sw;gw=dat%10;sw=dat/10;write_1602com(yh+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw);}void write_week(uchar week)// 写星期函数{write_1602com(yh+0x0c);switch(week){case 1:write_1602dat('M');//delay(5);write_1602dat('O');//delay(5);write_1602dat('N');break;case 2:write_1602dat('T');//delay(5);write_1602dat('U');//delay(5);write_1602dat('E');break;case 3:write_1602dat('W');//delay(5);break;case 4:write_1602dat('T');//delay(5);write_1602dat('H');//delay(5);write_1602dat('U');break;case 5:write_1602dat('F');//delay(5);write_1602dat('R');//delay(5);write_1602dat('I');break;case 6:write_1602dat('S');//delay(5);write_1602dat('T');//delay(5);write_1602dat('A');break;case 7:write_1602dat('S');//delay(5);write_1602dat('U');//delay(5);write_1602dat('N');break;}void keyscan(){if(key1==0)//key1 为功能键{delayus(5000);if(key1==0){while(!key1);key1n++;if(key1n==9)key1n=1;switch(key1n){case 1: TR0=0;// 关闭定时器//TR1=0;write_1602com(er+0x06);// 写入光标位置write_1602com(0x0f);// 设置光标为闪烁break;//write_1602com(0x0f);break;case 3: write_1602com(er+0);//shi//write_1602com(0x0f);break;case 4: write_1602com(yh+0x0d);//week//write_1602com(0x0f);break;case 5: write_1602com(yh+0x09);//ri//write_1602com(0x0f);break;case 6: write_1602com(yh+0x06);//yue//write_1602com(0x0f);break;case 7: write_1602com(yh+0x03);//nian//write_1602com(0x0f);break;case 8: write_1602com(0x0c);// 设置光标不闪烁write_sfm(6,miao);// 写入新的秒数temp=(miao)/10*16+(miao)%10;write_byte(DS3231_SECOND,temp); // 退出时修改秒write_1602com(er+6);temp=(fen)/10*16+(fen)%10;write_byte(DS3231_MINUTE,temp); // 修改分write_1602com(er+3);TR0=1;// 打开定时器break;}}}if(key1n!=0)// 当 key1 按下以下。
C语言时钟代码
line(x,y,x2,y2);
}
struct tm *curtime;//使用time函数获取系统时间
time_t t;
setfont(35,0,0,0,1);//设置字体样式(高度,宽度)
//函数的功能是把图形适配器设置为一种图形模式,将选择的图形驱动程序(在BGI文件中)装入到内存。
for(i=0;i<20;i++)
{
setcolor(RGB(255-i*10,255-i*10,255-i*10));//20圈组成表盘,白色由里到外渐浅
#include"graphics.h"
#include <conio.h>//屏幕绘图操作函数
#include"math.h"//数学函数库
#include <time.h>//时间函数库
#include <stdio.h>//“standard input&output" 意思就是说标准输入输出头文件
line(197+j,340,197+j,350);
line(50,197+j,60,197+j);
line(350,197+j,340,197+j);
}
//画刻度
setlinestyle(0,0,3);//设置线性(实线,线条宽度)
setcolor(RGB(300,350,500));//深蓝
#include <stdlib.h>//里面定义了五种类型、一些宏和通用工具函数
时钟c语言代码
#include <stdio.h>struct clock{int hour;int minute;int second;};typedef struct clock CLOCK;void Update(void);void Display(void);void Delay(void);int hour, minute, second; /*全局变量定义*/int main(void){long i;hour = minute = second = 0; /*hour,minute,second赋初值0*/for (i=0; i<100000; i++) /*利用循环结构,控制时钟运行的时间*/{Update(); /*时钟更新*/Display(); /*时间显示*/Delay(); /*模拟延时1秒*/}return 0;}/*函数功能:时、分、秒时间的更新函数参数:无函数返回值:无*/void Update(void){second++;if (second == 60)/*若second值为60,表示已过1分钟,则minute值加1*/ {second = 0;minute++;}if (minute == 60)/*若minute值为60,表示已过1小时,则hour值加1*/ {minute = 0;hour++;}if (hour == 24) /*若hour值为24,则hour的值从0开始计时*/{hour = 0;}}/*函数功能:时、分、秒时间的显示函数参数:无函数返回值:无*/void Display(void) /*用回车符'\r'不换行,控制时、分、秒显示的位置*/ {printf("%2d:%2d:%2d\r", hour, minute, second);}/*函数功能:模拟延迟1秒的时间函数参数:无函数返回值:无*/void Delay(void){long t;for (t=0; t<500000000; t++) {/*循环体为空语句的循环,起延时作用*/;}}。
桌面时钟代码
桌面时钟代码title>动态数字时钟link rel="XXX" type="text/css" href="js.css"> script language="javascript">n digitalClock() {var today = new Date();digit_clock.XXX();XXX("digitalClock()"。
1000);digitalClock();var S = '。
';S = S.split('');var M = '*****';M = M.split('');var H = '****';H = H.split('');var Ybase = 8;var Xbase = 8;var dots = 12;for (var i = 0.i < dots。
i++) {document.write('' + (i + 1) + '');for (i = 0.i < S.length。
i++) {document.write('');for (i = 0.i < M.length。
i++) {document.write('');for (i = 0.i < H.length。
i++) {document.write('');script>h1 align="center" id="digit_clock">body>html>删除该段落,因为它是一行代码,没有任何意义的描述XXX将分针的圆点放入各自的块中,id属性为m_dots for (i = 0.i < M.length。
计算机图形学c语言代码(笑脸、时钟、还有一个实在是不好意思说)
计算机图形作业费了很大脑子写出来的!!!1、时钟(鄙人最得意的一个作品)#include<graphics.h>#include<math.h>#include<dos.h>#define pi 3.1415926#define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300;#define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240;#define d(a,b,c,d) X(a,b,c);Y(a,b,c);Bline(300,240,x,y,d)void plot_circle_points(int xc, int yc, int x, int y, int c){putpixel(xc+x, yc+y, c);putpixel(xc-x, yc+y, c);putpixel(xc+x, yc-y, c);putpixel(xc-x, yc-y, c);putpixel(xc+y, yc+x, c);putpixel(xc-y, yc+x, c);putpixel(xc+y, yc-x, c);putpixel(xc-y, yc-x, c);}void Bcircle (int xc, int yc, int radius, int c){int x, y, p;x=0;y=radius;p=3-2*radius;while (x<y){plot_circle_points(xc, yc, x, y, c);if (p<0) p=p+4*x+6;else{p=p+4*(x-y)+10;y-=1;}x+=1;}if (x == y)plot_circle_points(xc, yc, x, y, c);}void Bline (int x1, int y1, int x2, int y2, int c){int x, y, tmp;int dx, dy, d;float k;if( 0 == (x1 - x2)){x = x1;if(y1 > y2){ tmp = y1;y1 = y2; y2 =tmp;}for(y = y1; y < y2; y ++){putpixel(x, y, abs(getpixel(x,y)-c));}return;}k = (float)(y2 -y1)/(float)(x2 - x1);if(k > 1.0){tmp = x1; x1 = y1; y1 = tmp;tmp = x2; x2 = y2; y2 = tmp;}else if(k > 0){}else if(k < -1.0){x1 = -x1;x2 = -x2;tmp = x1; x1 = y1; y1 = tmp;tmp = x2; x2 = y2; y2 = tmp;}else if( k < 0){y1 = - y1;y2 = - y2;}else{y = y1;if(x1 > x2){ tmp = x1; x1 = x2; x2 = tmp;}for(x = x1; x <= x2; x ++){putpixel(x, y, abs(getpixel(x,y)-c));}return;}if(x1 > x2){tmp = x1; x1 = x2; x2 = tmp;tmp = y1; y1 = y2; y2 = tmp;}dx = x2 - x1;dy = y2 - y1;d = 2 * dy - dx;x = x1; y = y1;for(; x < x2; x ++){if(k > 1){putpixel(y, x, abs(getpixel(y, x) - c));}else if(k > 0){putpixel(x, y, abs(getpixel(x,y)-c));}else if( k < -1){putpixel(-y, x, abs(getpixel(-y,x)-c));}else if(k < 0){putpixel(x, -y, abs(getpixel(x,-y)-c));}else {}if(d >= 0){y++;d+=2*dy-2*dx;}else{d+=2*dy;}}}void init(){int i,l,x1,x2,y1,y2;setbkcolor(1);Bcircle(300,240,200,15);Bcircle(300,240,205,15);Bcircle(300,240,5,15);for(i=0;i<60;i++){if(i%5==0) l=15;else l=5;x1=200*cos(i*6*pi/180)+300;y1=200*sin(i*6*pi/180)+240;x2=(200-l)*cos(i*6*pi/180)+300;y2=(200-l)*sin(i*6*pi/180)+240;Bline(x1,y1,x2,y2,15);}}void main(){int x,y;int gd,gm;unsigned char h,m,s;struct time t[1];detectgraph(&gd, &gm);initgraph(&gd,&gm," ");init();gettime(t);h=t[0].ti_hour;m=t[0].ti_min;s=t[0].ti_sec;d(150,h,30,7);d(170,m,6,14);d(190,s,6,4);while(!kbhit()){while(t[0].ti_sec==s)gettime(t);sound(400);delay(70);sound(200);delay(30);nosound();d(190,s,6,4);s=t[0].ti_sec;d(190,s,6,4);if (t[0].ti_min!=m){d(170,m,6,14);m=t[0].ti_min;d(170,m,6,14);}if (t[0].ti_hour!=h){d(150,h,30,7);h=t[0].ti_hour;d(150,h,30,7);sound(1000);delay(240);nosound();delay(140);sound(2000);delay(240);nosound();}}}2、笑脸(初学者作品很漂亮的!)#include "Conio.h"#include "graphics.h"#define closegr closegraphvoid initgr(void){int graphdriver=DETECT, graphmode=0;initgraph(&graphdriver, &graphmode, " "); }int main(){int i,j;initgr();setbkcolor(0);cleardevice();setcolor(2);circle(320,240,200);setcolor(14);line(320,280,320,200);ellipse(230,210,40,140,70,60);ellipse(410,210,40,140,70,60);ellipse(320,220,220,320,120,140);outtextxy(500,450,"xiao xiao!");getch();closegraph();return 0;}3、电扇(只能叫这个了本来想画车轮,没想到。
万年历时钟芯片代码
万年历时钟芯片代码/******************************************************************** * 文件名: 时钟DS1302LCD.c* 描述: 该程序实现了用单片机来控制时钟芯片DS1302进行时钟的显示。
时钟会在1602上显示.* 创建人:东流,2012年2月7日* 版本号:1.0* 杜邦线接法:P3.5接J18的1端;J3.6接J18的2端;J3.7接J18的3端。
1602接到J17的排座上。
********************************************************************* **/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit ACC0 = ACC^0;sbit ACC7 = ACC^7;sbit T_CLK = P3^5; /*实时时钟时钟线引脚*/sbit T_IO = P3^6; /*实时时钟数据线引脚*/sbit T_RST = P3^7; /*实时时钟复位线引脚*///这三个引脚参考资料sbit E=P2^7;//1602使能引脚sbit RW=P2^6;//1602读写引脚sbit RS=P2^5;//1602数据/命令选择引脚/******************************************************************** * 名称: delay()* 功能: 延时,延时时间大概为5US。
* 输入: 无* 输出: 无********************************************************************* **/void delay(){_nop_();_nop_();_nop_();_nop_();}void Delay(uint i){uint x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}/******************************************************************** * 名称: bit Busy(void)* 功能: 这个是一个读状态函数,读出函数是否处在忙状态* 输入: 输入的命令值* 输出: 无********************************************************************* **/bit Busy(void){bit busy_flag = 0;RS = 0;RW = 1;E = 1;delay();busy_flag = (bit)(P0 & 0x80);E = 0;return busy_flag;}/******************************************************************** * 名称: wcmd(uchar del)* 功能: 1602命令函数* 输入: 输入的命令值* 输出: 无********************************************************************* **/void wcmd(uchar del){while(Busy());RS = 0;RW = 0;E = 0;delay();delay();E = 1;delay();E = 0;}/******************************************************************** * 名称: wdata(uchar del)* 功能: 1602写数据函数* 输入: 需要写入1602的数据* 输出: 无********************************************************************* **/void wdata(uchar del){while(Busy());RS = 1;RW = 0;E = 0;delay();P0 = del;delay();E = 1;delay();E = 0;}/******************************************************************** * 名称: L1602_init()* 功能: 1602初始化,请参考1602的资料* 输入: 无* 输出: 无********************************************************************* **/void L1602_init(void){wcmd(0x38);Delay(5);wcmd(0x38);Delay(5);wcmd(0x38);Delay(5);wcmd(0x38);wcmd(0x08);wcmd(0x0c);wcmd(0x04);wcmd(0x01);}/******************************************************************** * 名称: L1602_char(uchar hang,uchar lie,char sign)* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下L1602_char(1,5,'b')* 输入: 行,列,需要输入1602的数据* 输出: 无********************************************************************* **/void L1602_char(uchar hang,uchar lie,char sign){uchar a;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;wcmd(a);wdata(sign);}/******************************************************************** * 名称: L1602_string(uchar hang,uchar lie,uchar *p)* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下L1602_string(1,5,"ab cd ef;")* 输入: 行,列,需要输入1602的数据* 输出: 无********************************************************************* **/void L1602_string(uchar hang,uchar lie,uchar *p){uchar a,b=0;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;while(1){wcmd(a++);if((*p == '\0')||(b==16)) break;b++;wdata(*p);p++;}}/******************************************************************** * 名称: v_RTInputByte()* 功能: 往DS1302写入1Byte数据* 输入: ucDa 写入的数据* 输出: 无********************************************************************* **/void v_RTInputByte(uchar ucDa){uchar i;ACC = ucDa;T_RST = 1;for(i=8; i>0; i--){T_IO = ACC0;T_CLK = 1;T_CLK = 0;ACC = ACC >> 1;}}/******************************************************************** * 名称: uc_RTOutputByte()* 功能: 从DS1302读取1Byte数据* 输入:无* 返回值: ACC********************************************************************* **/uchar uc_RTOutputByte(void){uchar i;T_RST = 1;for(i=8; i>0; i--){ACC = ACC >>1;T_IO=1;ACC7 = T_IO;T_CLK = 1;T_CLK = 0;}return(ACC);}/******************************************************************** * 名称: v_W1302(uchar ucAddr, uchar ucDa)* 功能: 往DS1302写入数据* 输入: ucAddr: DS1302地址, ucDa: 要写的数据* 返回值: 无********************************************************************* **/void v_W1302(uchar ucAddr, uchar ucDa){T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(ucAddr); // 写地址_nop_();_nop_();v_RTInputByte(ucDa); // 写1Byte数据T_CLK = 1;T_RST = 0;}/******************************************************************** * 名称: uc_R1302(uchar ucAddr)* 功能: 读取DS1302某地址的数据* 输入: ucAddr: DS1302地址* 返回值: ucDa :读取的数据********************************************************************* **/uchar uc_R1302(uchar ucAddr){uchar ucDa;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(ucAddr); //写地址,命令_nop_();_nop_();ucDa = uc_RTOutputByte(); //读1Byte数据T_CLK = 1;T_RST = 0;return(ucDa);}/******************************************************************** * 名称: v_BurstW1302T* 功能: 往DS1302写入时钟数据(多字节方式)* 输入: pSecDa: 时钟数据地址格式为: 秒分时日月星期年控制* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B* 返回值: 无********************************************************************* **/void v_BurstW1302T(uchar *pSecDa){uchar i;v_W1302(0x8e, 0x00); //控制命令,WP=0,写操作T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xbe); //0xbe:时钟多字节写命令for(i=8; i>0; i--) //8Byte = 7Byte 时钟数据+ 1Byte 控制{v_RTInputByte(*pSecDa); //写1Byte数据pSecDa++;}T_CLK = 1;T_RST = 0;}/******************************************************************** * 名称: v_BurstR1302T(uchar *pSecDa)* 功能: 读取DS1302时钟数据* 输入: pSecDa: 时钟数据地址格式为: 秒分时日月星期年* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B* 返回值: ucDa :读取的数据***********************************************************************/void v_BurstR1302T(uchar *pSecDa){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xbf); //0xbf:时钟多字节读命令for(i=8; i>0; i--){*pSecDa = uc_RTOutputByte(); //读1Byte数据pSecDa++;}T_CLK = 1;T_RST = 0;}/******************************************************************** * 名称: v_BurstW1302R(uchar *pReDa)* 功能: 往DS1302寄存器数写入数据(多字节方式)* 输入: pReDa: 寄存器数据地址* 返回值: 无********************************************************************* **/void v_BurstW1302R(uchar *pReDa){uchar i;v_W1302(0x8e,0x00); //控制命令,WP=0,写操作T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xfe); //0xbe:时钟多字节写命令for(i=31; i>0; i--) //31Byte 寄存器数据{v_RTInputByte(*pReDa); //写1Byte数据pReDa++;}T_CLK = 1;T_RST = 0;}/******************************************************************** * 名称: v_BurstR1302R(uchar *pReDa)* 功能: 读取DS1302寄存器数据* 输入: pReDa: 寄存器数据地址* 返回值: 无********************************************************************* **/void v_BurstR1302R(uchar *pReDa){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xff); //0xbf:时钟多字节读命令for(i=31; i>0; i--) //31Byte 寄存器数据{*pReDa = uc_RTOutputByte(); //读1Byte数据pReDa++;}T_CLK = 1;T_RST = 0;}/********************************************************************* 名称: v_Set1302(uchar *pSecDa)* 功能: 设置初始时间* 输入: pSecDa: 初始时间地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果当前时间是下午两点,则它返回的值是14。getHours()
是Javascript的日期对象内置的方法调用。
var minutes = today.getMinutes(); var seconds = today.getSeconds();
下面两行将字符串组合在一起并显示出来,
the_timeout = setTimeout('writeTime();', 500);
设置没半秒执行一次该函数的循环。
下面我们将学习如何在定时器中加入变量。>>
JavaScript高级教程
第一页 Javascript高级教程 - 第三课
第二页 如何给事件定时
第三页 定时循环的概念
第四页 定时循环的做法
第五页 一个Javascript编写的时钟
第六页 给定时器加入变量
第七页 识别用户的浏览器
第八页 如何识别用户的浏览器
第九页 对象和方法的识别
第十页 History对象
}
function fixTime(the_time) {
if (the_time <10) { the_time = "0" + the_time; } return the_time; }
我们仔细研究一下代码。
var today = new Date();
正如new Array() 可以生成一个新的数组,你可以可以
var seconds = today.getSeconds();
// fixTime 使分和秒可以正常显示
// 对于小于10的数字则在该数字前加一个0
minutes = fixTime(minutes);
seconds = fixTime(seconds);
//将时间字符串组合在一起并写出
var the_time = hours + ":" + minutes + ":" + seconds;
window.document.the_form.the_text.value = the_time;
//每半秒钟执行一次该函数
the_timeout= setTimeout('writeTime();',500);
五页:一个Javascript编写的时钟
现在时间是:
点击“启动时钟”则时钟开始运行。它从你的计算机中读取时间
并每半秒更新一次文字框中的显示。这个例子通过一个自调用
的函数设置了一个定时器。同时这个例子可以让你了解一点Date
对象的功能。当讲解cookies时,我提到过Date对象。
这几行原理和getHours()类似。
minutes = fixTime(minutes);
getMinutes存在一些问题,如果分钟是11:01, getMinutes
将返回 "1"。时钟的显示格式可不是这样,它应该显示为
“01”。fixTime函数就是用于执行纠正显示格式的功能。
以下是代码:
function writeTime() {
// 获得日期对象
var today = new Date();
// 从对象中获得信息
var hours = today.getHours();
var mi
用new Date() 生成一个新的日期对象。生成对象之后,
你可以对其提出你的问题。你生成的新的日期对象的括号
中间没有任何参数, 但JavaScript会查询计算机的始终
并用其生成新的日期对象。现在我们的日期对象名为
"today" ,我们可以从中提取相应的信息。
var hours = today.getHours();