【CPLD EPM570】Verilog实现数码管电子时钟

【CPLD EPM570】Verilog实现数码管电子时钟
【CPLD EPM570】Verilog实现数码管电子时钟

Verilog实现数码管电子时钟

1 原理图

8位8段LED数码管,实现时钟的秒、分、小时、日期年月日的显示,其中主显示月、日、小时和分,按住按键S1显示年和秒;8x8的LED阵列显示秒的跳变,每一分钟点亮一圈,8位LED的跑马灯以1秒的频率移动;S1~S4按键实现时钟的设置,S1显示年和秒,S2选择设置的时钟段,S3实现设置数据的增加,S4跳出设置;4x4的矩阵按键,用了K1~K10共10个键,实现数据1~9、0的输入,可用于设置时钟(参考实例图)。

数码管显示的原理图如下,2个4位的8段数码管,组成的8位8段数码管,每个4位数码管的数据线独立,其实是可以以总线形式连接在一起的,可以减少IO。共阳极的供电端用了三极管增加驱动,否则IO供电驱动多个数码管时有困难。

按键检测及跑马灯原理图如下,共5个按键,其中一个作为Reset按键(设计未加电容,可以考虑优化),每个按键采用一个IO检测,低电平表示有按键按下。共8个LED灯,每个灯采用一个IO驱动,高电平点亮。

8x8的矩阵LED,行H1-H8为共阳,采用三极管增加驱动,但此实验板采用5V供电,因此无论行控制信号输出高电平或是低电平,都会导致LED有供电,只是供电强弱不一样,但都可能点亮LED,所以实现时需要将不供电时输出高阻z,同理对数据信号V1-V8。

此矩阵显示原理也是分时显示每一列数据,轮流显示速率较快,让人眼无法反映识别出

来,避免闪烁。

4x4的矩阵按键,8个IO,检测原理是IO63、66、67、68作为输出信号,轮流赋值高电平,IO59、60、61、62作为输入信号,检测对应的按键按下。比如,在IO68赋值高电平时,

检测到IO59信号为高电平,则表示按键K1被按下,本时钟只用了10个按键,K1~K10。

2 CPLD代码

module clock (

clk_24m, //24M时钟

reset_n, //全局异步复位

/******************************************* 8位8段数码管显示接口信号

*******************************************/ Bit_line,

Data_line_h,

Data_line_l,

/******************************************* 8位跑马灯接口信号

*******************************************/ led_Bit_line,

/******************************************* S1-S5按键信号

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

Key_line,

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

8x8 LED数码管矩阵接口信号

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

Hline,

Vline,

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

按键阵列接口信号

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

Keyarray_Vline,

Keyarray_Hline

);

input wire clk_24m;

input wire reset_n;

output wire [7:0] Hline;

output wire [7:0] Vline;

output wire [7:0] Bit_line;

output wire [0:7] Data_line_h;

output wire [0:7] Data_line_l;

output wire [7:0] led_Bit_line;

input wire [3:0] Key_line;

input wire [3:0] Keyarray_Vline;

output wire [2:0] Keyarray_Hline;

/*************************************************************** 内部分频时钟,便于计数。

****************************************************************/ reg [16:0] count_div1;

wire condition_183;

wire condition_732;

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

count_div1 <= 17'h00000;

else

count_div1 <= count_div1 + 17'h00001;

end

assign condition_183 = &count_div1[16:0]; //24M/2^17=183Hz,不同频率内部时钟。assign condition_732 = &count_div1[14:0]; //24M/2^15=732Hz.

assign condition_46k = &count_div1[8:0]; //24M/2^9=46875Hz.

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

分出的时钟频率较低,避免计数器位数过多,采用2次计数分频。

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

reg [7:0] count_div2;

wire condition_1_4s;

wire condition_20;

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

count_div2 <= 8'h00;

else if (condition_183 == 1'b1)

count_div2 <= count_div2 + 8'h01;

else;

end

assign condition_20 = (&count_div2[2:0])&condition_183; //183/2^3=23Hz.

assign condition_1_4s = (&count_div2[4:0])&condition_183; //183/2^5=5.7Hz.

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

分频时钟,用于设置时钟时,LED灯闪烁。

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

reg [1:0] count_div3;

wire condition_2s;

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

count_div3 <= 2'b00;

else if (condition_1_4s == 1'b1)

count_div3 <= count_div3 + 2'b01;

else;

end

assign condition_2s = ~(&count_div3[1:0]);

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

分频时钟,精确的1S计数,用于时钟秒计数。

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

reg condition_1s_reg;

wire condition_1s;

reg [15:0] count_1s_2;

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

begin

count_1s_2 <= 16'h0000;

condition_1s_reg <= 1'b0;

end

else

begin

if (condition_46k == 1'b1)

count_1s_2 <= count_1s_2 + 16'h0001;

else;

if (count_1s_2 >= 16'hB71B) //计数1S,0xB71B*2^9=24M。

begin

condition_1s_reg <= 1'b1;

count_1s_2 <= 16'h0000;

end

else

condition_1s_reg <= 1'b0;

end

end

assign condition_1s = condition_1s_reg; //每计数到1S,输出一个高电平脉冲。

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

分频时钟,精确的2S计数,用于8*8LED阵列点灯。

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

wire condition_2ss;

reg count_1ss;

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

count_1ss <= 1'b0;

else if (condition_1s == 1'b1)

count_1ss <= count_1ss + 1'b1;

else;

end

assign condition_2ss = count_1ss&condition_1s; //每计数到1S,输出一个高电平脉冲。

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

时钟自动运行,及按键设置驱动.

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

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

电子时钟计数逻辑。每位十进制,采用4bit的16进制数表示。如2014-07-13 17:16:32数字共14个,与下面定义对应。

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

reg [3:0] sec_h,min_h,hour_h,date_h,mon_h;

reg [3:0] sec_l,min_l,hour_l,date_l,mon_l;

reg [3:0] year_l,year_h,year_hl,year_hh;

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

begin //时钟初值,2014-07-05 11:34:00 sec_h <= 4'h0;

min_h <= 4'h3;

hour_h <= 4'h1;

date_h <= 4'h0;

mon_h <= 4'h0;

year_h <= 4'h1;

sec_l <= 4'h0;

min_l <= 4'h4;

hour_l <= 4'h1;

date_l <= 4'h5;

mon_l <= 4'h7;

year_l <= 4'h4;

year_hl <= 4'h0;

year_hh <= 4'h2;

end

else

begin

if(condition_1s == 1'b1 ) //计满1S,秒数加1.

sec_l <= sec_l+4'h1;

else;

if(sec_l == 4'ha ) //秒数个位到9,十位进1.

begin

sec_l <= 4'h0;

sec_h <= sec_h+4'h1;

end

else;

if(sec_h == 4'h6 ) //秒数十位到6,分钟加1.

begin

sec_h <= 4'h0;

min_l <= min_l+4'h1;

end

else;

if(min_l == 4'ha ) //分钟个位到9,十位进1.

begin

min_l <= 4'h0;

end

else;

if(min_h >= 4'h6 ) //分钟十位到6,小时加1.

begin

min_h <= 4'h0;

hour_l <= hour_l+4'h1;

end

else;

if(hour_l == 4'ha ) //小时个位到9,十位进1.

begin

hour_l <= 4'h0;

hour_h <= hour_h+4'h1;

end

else;

if((hour_h == 4'h2) && (hour_l >= 4'h4)) //小时计到24及以上,日期加1.

begin

hour_l <= 4'h0;

hour_h <= 4'h0;

date_l <= date_l+4'h1;

end

else if(hour_h > 4'h2)

begin

hour_l <= 4'h0;

hour_h <= 4'h0;

date_l <= date_l+4'h1;

end

else;

if(date_l == 4'ha) //日期个位计到9,十位进1.

begin

date_l <= 4'h0;

date_h <= date_h+4'h1;

end

else;

if((mon_l == 4'h4) || (mon_l == 4'h6) || (mon_l == 4'h9) || ((mon_l == 4'h1)&&(mon_h == 4'h1))) //如果是小月,日期计数超过31,月数加1.

begin

if((date_h == 4'h3) && (date_l >= 4'h1))

begin

mon_l <= mon_l+4'h1;

date_h <= 4'h0;

end

else if(date_h > 4'h3)

begin

mon_l <= mon_l+4'h1;

date_l <= 4'h1;

date_h <= 4'h0;

end

else;

end

else if((mon_h == 4'h0) && (mon_l == 4'h2)) //如果是2月,则根据年数确定是否闰月。

begin

if(((((year_h&4'h03)+(year_h&4'h03)+(year_l&4'h03))&4'h03) == 4'h00) && ((year_l != 8'h00) || (year_h != 8'h00)))

//如果年数能被4整除,且并非整百年份,闰月,计数超过29月份加1。

/*

(year_h*10+ year_l)%4= (year_h*8+ year_h*2+ year_l)%4= (year_h*2+ year_l)%4= (year_h+year_h+ year_l)%4=(year_h%4+year_h%4+ year_l%4)%4=

((year_h&4'h03)+(year_h&4'h03)+(year_l&4'h03))&4'h03)

*/

begin

if((date_h == 4'h3) && (date_l >= 4'h0))

begin

mon_l <= mon_l+4'h1;

date_l <= 4'h1;

date_h <= 4'h0;

end

else if(date_h > 4'h3)

begin

mon_l <= mon_l+4'h1;

date_l <= 4'h1;

date_h <= 4'h0;

end

else;

end

else if(((year_l == 4'h0) && (year_h == 4'h0)) &&

((((year_hh&4'h3)+(year_hh&4'h3)+(year_hl&4'h3))&4'h3) == 4'h0))

//如果年数整百年份,且能被400整除,闰月,计数超过29月份加1。

begin

if((date_h == 4'h3) && (date_l >= 4'h0))

begin

mon_l <= mon_l+4'h1;

date_l <= 4'h1;

date_h <= 4'h0;

end

else if(date_h > 4'h3)

begin

mon_l <= mon_l+4'h1;

date_l <= 4'h1;

date_h <= 4'h0;

end

else;

end

else if((date_h == 4'h2) && (date_l == 4'h9)) begin

mon_l <= mon_l+4'h1;

date_l <= 4'h1;

date_h <= 4'h0;

end

else if(date_h > 4'h2)

begin

mon_l <= mon_l+4'h1;

date_l <= 4'h1;

date_h <= 4'h0;

end

end

else //大月,日期计数超过31,月份加1.

begin

if((date_h == 4'h3) && (date_l >= 4'h2))

begin

mon_l <= mon_l+4'h1;

date_l <= 4'h1;

date_h <= 4'h0;

end

else if(date_h > 4'h3)

begin

mon_l <= mon_l+4'h1;

date_l <= 4'h1;

date_h <= 4'h0;

end

else;

end

if(mon_l == 4'ha) //月数个位计数到9,十位进1. begin

mon_l <= 4'h0;

mon_h <= mon_h+4'h1;

end

else;

if((mon_h == 4'h1) && (mon_l >= 4'h3)) //月数计数超过12,年份加1.

begin

mon_l <= 4'h1;

mon_h <= 4'h0;

year_l <= year_l+4'h1;

end

else if(mon_h > 4'h1)

begin

mon_l <= 4'h1;

mon_h <= 4'h0;

year_l <= year_l+4'h1;

end

else;

if(year_l == 4'ha) //年份个位计数到9,十位进1.

begin

year_l <= 4'h0;

year_h <= year_h+4'h1;

end

else;

if(year_h == 4'ha) //年份十位计数超过9,百位进1.

begin

year_h <= 4'h0;

year_hl <= year_hl+4'h1;

end

else;

if(year_hl == 4'ha) //年份百位计数超过9,千位进1.

begin

year_hl <= 4'h0;

year_hh <= year_hh+4'h1;

end

else;

if(year_hh == 4'ha) //年份千位计数超过9,归零.

begin

year_hh <= 4'h0;

end

else;

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

时钟设置逻辑,当有按键,且处于设置状态时,相应的各段计数值加1.

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

if(Key_edge_plus[2] == 1'b1) //按S3按键,相应设置数据加1.

begin

case(clock_set_status_reg) //不同的设置位有效,不同的设置数据变化.

7'h01: min_l <= min_l+4'h1;

7'h02: hour_l <= hour_l+4'h1;

7'h04: date_l <= date_l+4'h1;

7'h08: mon_l <= mon_l+4'h1;

7'h10: year_l <= year_l+4'h1;

7'h20: year_hl <= year_hl+4'h1;

default;

endcase

end

else;

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

时钟设置逻辑,当时钟处于设置状态时,按矩阵数字键,对相应的位设置.

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

if(Key_status == 1'b1) //当矩阵按键有按键时,下面判断生效.

begin

case(clock_set_status_reg) //不同的设置位有效,不同的设置数据变化.

7'h01: //设置分钟.

begin

if(Key_time_flag == 1'b0) //通过此判读设置数据的高位还是低位。

min_h <= Key_value;

else if(Key_time_flag == 1'b1)

min_l <= Key_value;

else;

end

7'h02: //设置小时.

begin

if(Key_time_flag == 1'b0)

hour_h <= Key_value;

else if(Key_time_flag == 1'b1)

hour_l <= Key_value;

else;

end

7'h04: //设置日期.

begin

if(Key_time_flag == 1'b0)

date_h <= Key_value;

else if(Key_time_flag == 1'b1)

date_l <= Key_value;

else;

end

7'h08: //设置月份.

begin

if(Key_time_flag == 1'b0)

mon_h <= Key_value;

else if(Key_time_flag == 1'b1)

mon_l <= Key_value;

else;

end

7'h10: //设置年份十位和个位.

begin

if(Key_time_flag == 1'b0)

year_h <= Key_value;

else if(Key_time_flag == 1'b1)

year_l <= Key_value;

else;

end

7'h20: //设置年份千位和百位.

begin

if(Key_time_flag == 1'b0)

year_hh <= Key_value;

else if(Key_time_flag == 1'b1)

year_hl <= Key_value;

else;

end

default;

endcase

end

else;

end

end

/*************************************************************** 8位8段数码管,显示驱动.

****************************************************************/ /*************************************************************** 8位8段数码管,分时显示每一段.

****************************************************************/ reg [7:0] Bit_shift;

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

Bit_shift <= 8'h01;

else if (condition_732 == 1'b1)

Bit_shift <= { Bit_shift[6:0],Bit_shift[7] };

//移位寄存器实现分时显示,每段显示时间1/732s。

else;

end

assign Bit_line = ~Bit_shift;

//数码管的外部IO输出信号赋值,逻辑中高有效,实际电路低电平有效,所以取反。

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

8位8段数码管,分时显示每一段时,设置此段显示的数据.

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

reg [3:0] Data_bit;

//中转的数据寄存器,用于下面的解码逻辑,将数据解码后输出到LED数码管上显示。reg [3:0] Data_reg [7:0]; //每段显示数据寄存器,值为0~9有效。

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

begin

Data_bit <= 4'hf;

end

else

begin

case(Bit_shift) //根据每时刻显示的Bit,选择不同的值显示。

8'h01:

Data_bit <= Data_reg[0];

8'h02:

Data_bit <= Data_reg[1];

8'h04:

Data_bit <= Data_reg[2];

8'h08:

Data_bit <= Data_reg[3];

8'h10:

Data_bit <= Data_reg[4];

8'h20:

Data_bit <= Data_reg[5];

8'h40:

Data_bit <= Data_reg[6];

8'h80:

Data_bit <= Data_reg[7];

default;

endcase

end

end

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

显示的数据0~9,通过解码后,输出到IO引脚,通过数码管显示出来。

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

reg [7:0] Data_decode; //解码后输出给IO的数据。

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

begin

Data_decode <= 8'hff;

end

else

begin

case(Data_bit) //数字0~9,解码成不同的信号数据,赋给外部点数码管。

4'h1:

Data_decode <= 8'h9f; //数码管显示数据1.

4'h2:

Data_decode <= 8'h25; //数码管显示数据2.

4'h3:

Data_decode <= 8'h0d; //数码管显示数据3.

4'h4:

Data_decode <= 8'h99; //数码管显示数据4.

4'h5:

Data_decode <= 8'h49; //数码管显示数据5.

4'h6:

Data_decode <= 8'h41; //数码管显示数据6.

4'h7:

Data_decode <= 8'h1f; //数码管显示数据7.

4'h8:

Data_decode <= 8'h01; //数码管显示数据8.

4'h9:

Data_decode <= 8'h09; //数码管显示数据9.

4'h0:

Data_decode <= 8'h03; //数码管显示数据0.

default

Data_decode <= 8'hfe; //0~9以外的其他值,数码管不显示.

endcase

end

end

assign Data_line_h = Data_decode; //赋显示值给外部数据信号。

assign Data_line_l = Data_decode; //赋显示值给外部数据信号。

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

8位8段数码管,显示对应的时钟数据.

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

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

8位8段数码管,分时显示每一段.

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

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

begin

Data_reg[0]<= 4'h8;

Data_reg[1]<= 4'h0;

Data_reg[2]<= 4'h1;

Data_reg[3]<= 4'h1;

Data_reg[4]<= 4'h5;

Data_reg[5]<= 4'h7;

Data_reg[6]<= 4'h4;

Data_reg[7]<= 4'h1;

end

else if(( Key_Data_reg[0] == 1'b1 )||(clock_set_status_reg == 6'h10)||(clock_set_status_reg == 6'h20))

//如果按键S1按下,或是设置年份数据时,按如下数据显示。

begin

case(clock_set_status_reg)

6'h10: //设置年份十位和个位。

begin

if(condition_2s == 1'b1) //需要设置的数据闪烁。

begin

Data_reg[0]<= sec_l;

Data_reg[1]<= sec_h;

Data_reg[2]<= 4'hf;

Data_reg[3]<= 4'hf;

Data_reg[4]<= year_l; //对比else,此数据为闪烁的数据。

Data_reg[5]<= year_h;//对比else,此数据为闪烁的数据。

Data_reg[6]<= year_hl;

Data_reg[7]<= year_hh;

end

else

begin

Data_reg[4]<= 4'hf;

Data_reg[5]<= 4'hf;

Data_reg[0]<= sec_l;

Data_reg[1]<= sec_h;

Data_reg[2]<= 4'hf;

Data_reg[3]<= 4'hf;

Data_reg[6]<= year_hl;

Data_reg[7]<= year_hh;

end

end

6'h20: //设置年份千位和百位。

begin

if(condition_2s == 1'b1) //需要设置的数据闪烁。

begin

Data_reg[0]<= sec_l;

Data_reg[1]<= sec_h;

Data_reg[2]<= 4'hf;

Data_reg[3]<= 4'hf;

Data_reg[4]<= year_l;

Data_reg[5]<= year_h;

Data_reg[6]<= year_hl; //对比else,此数据为闪烁的数据。

Data_reg[7]<= year_hh; //对比else,此数据为闪烁的数据。

end

else

begin

Data_reg[6]<= 4'hf;

Data_reg[7]<= 4'hf;

Data_reg[0]<= sec_l;

Data_reg[1]<= sec_h;

Data_reg[2]<= 4'hf;

Data_reg[3]<= 4'hf;

Data_reg[4]<= year_l;

Data_reg[5]<= year_h;

end

end

default //默认正常显示,按键S1时有效。begin

Data_reg[0]<= sec_l;

Data_reg[1]<= sec_h;

Data_reg[2]<= 4'hf;

Data_reg[3]<= 4'hf;

Data_reg[4]<= year_l;

Data_reg[5]<= year_h;

Data_reg[6]<= year_hl;

Data_reg[7]<= year_hh;

end

endcase

end

else //如果不是按S1或是设置时钟年份,则显示月、日、小时、分钟。

begin

case(clock_set_status_reg) //通过设置状态寄存器的值,决定需要设置的数据位闪烁。6'h01: //设置分钟数据。

begin

if(condition_2s == 1'b1) //分钟数据闪烁。

begin

Data_reg[0]<= min_l;

Data_reg[1]<= min_h;

Data_reg[2]<= hour_l;

Data_reg[3]<= hour_h;

Data_reg[4]<= date_l;

Data_reg[5]<= date_h;

Data_reg[6]<= mon_l;

Data_reg[7]<= mon_h;

end

else

begin

Data_reg[0]<= 4'hf;

Data_reg[1]<= 4'hf;

Data_reg[2]<= hour_l;

Data_reg[3]<= hour_h;

Data_reg[4]<= date_l;

Data_reg[5]<= date_h;

Data_reg[6]<= mon_l;

Data_reg[7]<= mon_h;

end

end

6'h02: //设置小时数据。

begin

if(condition_2s == 1'b1) //小时数据闪烁。

begin

Data_reg[0]<= min_l;

Data_reg[1]<= min_h;

Data_reg[2]<= hour_l;

Data_reg[3]<= hour_h;

Data_reg[4]<= date_l;

Data_reg[5]<= date_h;

Data_reg[6]<= mon_l;

Data_reg[7]<= mon_h;

end

else

begin

Data_reg[2]<= 4'hf;

Data_reg[3]<= 4'hf;

Data_reg[0]<= min_l;

Data_reg[1]<= min_h;

Data_reg[4]<= date_l;

Data_reg[5]<= date_h;

Data_reg[6]<= mon_l;

Data_reg[7]<= mon_h;

end

end

6'h04: //设置日期数据。begin

if(condition_2s == 1'b1) //日期数据闪烁。begin

Data_reg[0]<= min_l;

Data_reg[1]<= min_h;

Data_reg[2]<= hour_l;

Data_reg[3]<= hour_h;

Data_reg[4]<= date_l;

Data_reg[5]<= date_h;

Data_reg[6]<= mon_l;

Data_reg[7]<= mon_h;

end

else

begin

Data_reg[4]<= 4'hf;

Data_reg[5]<= 4'hf;

Data_reg[0]<= min_l;

Data_reg[1]<= min_h;

Data_reg[2]<= hour_l;

Data_reg[3]<= hour_h;

Data_reg[6]<= mon_l;

Data_reg[7]<= mon_h;

end

end

6'h08: //设置月份数据。begin

if(condition_2s == 1'b1) //月份数据闪烁。begin

Data_reg[0]<= min_l;

Data_reg[1]<= min_h;

Data_reg[2]<= hour_l;

Data_reg[3]<= hour_h;

Data_reg[4]<= date_l;

Data_reg[5]<= date_h;

Data_reg[6]<= mon_l;

Data_reg[7]<= mon_h;

end

else

begin

Data_reg[6]<= 4'hf;

Data_reg[7]<= 4'hf;

Data_reg[0]<= min_l;

Data_reg[1]<= min_h;

Data_reg[2]<= hour_l;

Data_reg[3]<= hour_h;

Data_reg[4]<= date_l;

Data_reg[5]<= date_h;

end

end

default //默认正常显示月、日、小时、分钟数据。

begin

Data_reg[0]<= min_l;

Data_reg[1]<= min_h;

Data_reg[2]<= hour_l;

Data_reg[3]<= hour_h;

Data_reg[4]<= date_l;

Data_reg[5]<= date_h;

Data_reg[6]<= mon_l;

Data_reg[7]<= mon_h;

end

endcase

end

end

/*************************************************************** 矩阵按键键盘实现数字0~9的输入驱动。

****************************************************************/ /*************************************************************** 分时对每一行按键扫描.

****************************************************************/ reg [2:0] Key_hline_shift;

always @ (posedge clk_24m or negedge reset_n)

begin

if(reset_n == 1'b0)

Key_hline_shift <= 3'h01;

else if (condition_20 == 1'b1)

Key_hline_shift <= { Key_hline_shift[1:0],Key_hline_shift[2] };

//通过移位寄存器实现分时,赋值每一行按键高电平。

else;

end

基于51单片机的4位数码管秒表

原理图: 源程序: /************************************************************* 标题:定时器中断精确到00.01的秒表 效果:能清零重新开始,暂停,继续计时,能精确到0.01秒 作者:皖绩小挺 说明:使用12M晶振,四位数码管,3个按键 ****************************************************************/ #include #define uint unsigned int #define uchar unsigned char uint temp,tt,qian,bai,shi,ge; sbit smg_q=P1^0; sbit smg_b=P1^1; sbit smg_s=P1^2; sbit smg_g=P1^3; sbit key1 = P3^7; sbit key2 = P3^6; sbit key3 = P3^5; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90};

uchar code table1[]={0x40,0x79,0x24,0x30,0x19, 0x12,0x02,0x78,0x00,0x10}; //带小数点 void keyscan(); void display(uint shi,uint ge); void delay(uint z); void init(); /************************************************************** 主函数 ******************************************************************/ void main() { init();//初始化子程序 while(1) { if(tt==1) { tt=0; temp++; if(temp==10000) { temp=0; } qian=temp/1000; bai=temp%1000/100; shi=temp%100/10; ge=temp%10; } keyscan(); display(shi,ge); } } /********************************************************************* 延时 ***********************************************************************/ void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /*********************************************************************

利用CPLD设计可调时数字钟

利用C P L D设计可调时 数字钟 The Standardization Office was revised on the afternoon of December 13, 2020

数字电路课程设计 题目:利用CPLD 设计可调时数字钟 学院电子信息工程学院 专业 学号 姓名 教师 装 订 线

基于CPLD数字时钟设计 摘要 本次课程设计是用数字电路知识以及MaxplusⅡ软件进行的制作,首先理解电路原理图,然后进行了焊接,本次焊接增加自己的动手能力。然后对数字电路书又进行了复习,最后应用MaxplusⅡ软件进行了编程。 电路通过使用数字元件,来构成完成二十四小时的数字钟设计,并且将译码器和数据选择器配合使用来完成动态的显示输出。此外,外部控制开关用来控制电路,使得该电路可以完成保持、清零、快速校对时间等一系列的功能。本系统的难点在于EDA系统作图及最后系统优化的应用。尤其是小数点的显示控制,用一个或门,通过1Hz来控制第三个数码管的点显示,再通过一个与非门来控制第五个数码管的点显示,第五个数码管的点在整个脉冲阶段显示,而第三个数码管的点只有在低电平时显示,以达到结果是第五个数码显示管的点常亮,而第三个数码管的点以1Hz的频率闪烁。 制作中经常遇到各种问题,如第一次用的七段译码器显示六和九时,显示的不是很好,就重新自己做的译码器,让其显示的比较完美,而且也出现了制作的程序太大问题,最后不断的修改终于成功了。 关键词:数字电路MaxplusⅡ七段译码器

目录 设计要求.............................................. 设计原理.............................................. 电源电路........................................... 显示电路........................................... 二各模块说明........................................ 设计思路及步骤........................................ 总体框图.............................................. 各模块说明............................................ 段译码显示电路..................................... 时间计数器电路..................................... 数据选择器电路..................................... 译码器电路......................................... 比较器电路......................................... 按键消抖电路....................................... 数字钟电路总图........................................ 三课程总结............................................ 遇到的问题及其解决办法................................ 收获与体会............................................

用LCD设计的可调式电子钟

单片机应用 课程设计说明书 用1602LCD设计的可调式电子钟专业自动化 学生姓名 班级自动化142 学号 14100 指导教师蒋 完成日期 20年1 月23 日

目录 1 概述.......................................................................................... 错误!未指定书签。 2 课题研究背景与意义...................................................................... 错误!未指定书签。 2.1 课题研究背景....................................................................... 错误!未指定书签。 2.2 课题研究意义....................................................................... 错误!未指定书签。 3 系统方案设计与主要设计工作 ..................................................... 错误!未指定书签。 3.1 设计任务............................................................................... 错误!未指定书签。 3.2 功能要求说明....................................................................... 错误!未指定书签。4设计课题总体方案........................................................................... 错误!未指定书签。 4.1硬件设计方案........................................................................ 错误!未指定书签。 4.2系统软件设计........................................................................ 错误!未指定书签。 5. 软件仿真及实物设计调试 ........................................................... 错误!未指定书签。 5.1PROTUES仿真软件介绍 ......................................................... 错误!未指定书签。 5.2仿真运行结果说明 ............................................................... 错误!未指定书签。 5.3实物设计结果与调试 ........................................................... 错误!未指定书签。6课程设计实验总结........................................................................... 错误!未指定书签。参考文献.............................................................................................. 错误!未指定书签。附录.............................................................................................. 错误!未指定书签。 附录1:程序清单........................................................................ 错误!未指定书签。 附录2:系统电路原理图 ........................................................... 错误!未指定书签。 附录3:元器件清单.................................................................... 错误!未指定书签。

基于AT89C51单片机的可调式电子时钟设计

摘要 电子时钟主要是利用了电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。对当前的电子时钟开发手段进行了比较和分析,最终确定了采用单片机技术实现的电子时钟。本次课题介绍了以AT89C51单片机为主控芯片的可调式电子时钟,功耗小,能在3V的低压工作。时钟芯片采用美国DALLAS公司提供的具有涓细电流低功耗的DS1302。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。显示部分采用LCD1602液晶显示,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,与普通数码管相比功耗较小,硬件连接简单,较直观。软件使用高级C语言编程,具有灵活的可移植性,同时该时钟具有按键可调的功能,能够对日期时间调整。本设计说明书首先介绍的是总体方案设计,接着是硬件设计,本部分详细的介绍了各模块的工作原理及相互的连接,再接着介绍了软件设计部分,最后是仿真调试。经仿真验证,该设计能满足所有的功能。 关键词:可调式;AT89C51;DS1302;C语言

ABSTRACT Electronic clock basically is to use the electronic technology will clock electronic, digital, has the clock accurate, small volume, friendly interface, can be expanded performance is strong and other characteristics, are widely used in life and work. On the current development of the electronic clock means were compared and analyzed, finally determined by single chip microcomputer technology to the electronic clock. This subject introduces the AT89C51 as the controller chip adjustable electronic clock, power consumption is small, can be in 3 V of low-pressure work. The clock chip adopt American DALLAS company has Juan fine current DS1302 of low power consumption. It can be to year, month, day, Sunday, when, minutes and seconds for the time, also has a leap year compensation and other functions, and the DS1302 long service life and small error. Show LCD1602 part adopts LCD display, LCD screen shows powerful, can show a large text, graphics, show diversity, clearly visible, compared with common digital tube power consumption is small, hardware connect a simple, more intuitive. Senior software use the C programming language, has the flexible portability, and the clock is the key adjustable function to adjust to a time and date. The design manual introduced is first overall design, then the hardware design. This part describes in detail the modules and working principle of the mutual connection, then introduces the design of the software in part, and finally the simulation test. The simulation results, this design can meet all functions. Keywords: adjustable;AT89C51;DS1302;C language

数码管显示转换的电压值数码管显示秒表

数码管显示转换的电压值数码管显示秒表 标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]

电子科技大学微电子与固体电子学院 实验报告 实验名称现代电子技术综合实验 姓名:詹朋璇 学号:20 评分: 教师签字 电子科技大学教务处制

电子科技大学 实验报告 学生姓名:詹朋璇学号: 20 指导教师:熊万安 实验地点: 211大楼308 实验时间:2014. 晚 一、实验室名称:单片机技术综合实验室 实验项目名称:数码管显示A/D转换的电压值&数码管显示秒表 二、实验学时: 12 三、实验目的与任务: 1、熟悉系统设计与实现原理 2、掌握KEIL C51的基本使用方法 3、熟悉实验板的应用 4、连接电路,编程调试,实现各部分的功能 5、完成系统软件的编写与调试 四、实验器材 1、PC机一台 2、实验板一块

五、实验原理、步骤及内容 试验要求:数码管的第1位显示任务号1,第3位到第5位显示、A/D转换的电压值,可调节电压,第7、8位显示两位学号;数码管第2位和第6位显示“-”号; 按按键key1进行切换,此时数码管第1位显示任务号2,第7、8位显示循环倒计时的秒表,范围为08秒到01秒后,再过01秒,秒表又显示为08秒;(单片机系统中利用定时器/计数器计数秒表的值:利用定时器T0延时1秒进行计数。),其它位显示不变,按按键key2时,秒表停止计数,再按按键key2时,秒表继续计数,按key1键,又回到任务1的显示状态。 当电压值大于2伏时,按按键不起作用。 1、硬件设计(可打印) 2、各部分硬件原理(可打印) 数码管动态扫描 TLS549ADC工作时序图 3、软件设计 按下

整点报时可调式数字电子时钟的设计

用EDA软件实现整点报时数字式可调电子时钟的设计 一、设计目的 了解常见中规模数字集成电路的使用方法,包括计数器、显示译码器、多谐振荡器的工作原理及使用方法。通过组装具有整点报时数字可调电子时钟,了解这类电路的使用技巧及调整方法。通过对电路板的实际布线焊接检测调试,提高电子技术硬件的基本能力。 二、系统组成 1、先用Multisim实现如下系统: 本组合电路包括时基多谐振荡器、计数器、十进制译码显示器、发光数码管等部分组成。各部分组成框图如下: 系统组成图 2、仿真通过 三、单元电路组成原理与参数选择 1、多谐振荡器:这里采用最常见的时基电路555组成的周期为1秒的振荡器。555集成电路的原理及应用可以参见教材,此不重复。通常选择适当的定时电阻和电容元件使振荡刚好为1秒钟。多谐振荡器的电路图和NE555的芯片引脚图如下:

2、十进制计数器: 本系统采用的是十进制计数器7490。本系统秒钟是用两个7490构成60进制组成。分钟也是用两个7490构成60进制组成时钟采用两个7490构成24进制计数器组成。将三个计数器级连起来就构成了电子时钟。7490的芯片图和真值表如下:(5脚接电源VCC,10脚接地其中1脚和12脚相连)。 X 0 0 X COUNT 下面介绍秒钟和分钟连接方法如下图(如果是秒钟14脚则接多谐振荡器555电路的第3脚,如果是分钟14脚则接秒钟的7408(与门)芯片的第3脚。

下面介绍时钟的接法(14脚接分钟的7408的第3脚): 3、7448实现多位数字码显示译(如果是选用共阳极七段数码管则选择7447) 7448为七段译码显示器,其功能可详细参见数字电路书。它实现的功能是把7490输出 的(QA、QB、QC、QD)实现译码驱动七段共阴极数码显示它的接法如下:

时钟可调时间可报时程序

///////////////////////////////////////////////////////// // 工程名称:可调时报时电子钟 // 使用描述: // K1 按一次进入时间调整模块调完后,再按一次恢复时间 // K2 非时间调整模式下,按键报时时间调整模块下,按键选择调整秒分时 // K3 时间调整模块下,时间值增加 // K4 时间调整模块下,时间值减小 // 硬件连接:IOA0~IOA7接SEG IOA8~IOA15接1*8KEY // IOB0~IOB7接DIG 2*4KEY.D_dp接高电平 // 维护记录:2012-8-15 增加时间调整功能,增加报时功能 // /////////////////////////////////////////////////////////// #include "spce061a.h" #include "Sound.h" #include "Clock_Speech.h" //定义各种宏 #define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Buffer (volatile unsigned int *)0x7001 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_IOB_Data (volatile unsigned int *)0x7005 #define P_IOB_Buffer (volatile unsigned int *)0x7006 #define P_IOB_Dir (volatile unsigned int *)0x7007 #define P_IOB_Attrib (volatile unsigned int *)0x7008 #define P_Watchdog_Clear (volatile unsigned int *)0x7012 #define P_INT_Ctrl (volatile unsigned int *)0x7010 #define P_INT_Clear (volatile unsigned int *)0x7011 #define uint unsigned int #define KEY_ALL 0xff00 int DispTbl[10] = { 0x003F,0x0006,0x005B,0x004F,0x0066, 0x006D,0x007D,0x0007,0x007F,0x006F}; uint sec=0,min=0,hour=0; uint Start_End_Flag=0; uint Adjust_Wei=4; uint flag=1;

用LED数码管显示的秒表设计

单片机课程设计说明书 用LED 数码管显示的秒表设计 专业 电气工程及其自动化 学生姓名 刘宁 班级 B 电气081 学 号 04 指导教师 张兰红 完成日期 2011年 6月 26 日

目录 1、概述 (2) 2、课题方案设计 (2) 系统总体设计要求 (2) 系统模块结构论证 (2) 3、系统硬件设计 (3) 总体设计 (3) 单片机运行的最小系统 (4) 52单片机最小系统电路介绍 (4) 单片机的振荡电路与复位电路 (7) 数码管介绍 (8) 驱动电路 (9) 4、软硬件联调及调试结果 (10) 软硬件调试中出现的问题及解决措施 (10) 实物图 (11) 调试结果 (13) 5、结束语 (13) 参考文献 (14) 附录 (14) 附录1:基于单片机的秒表设计原理图 (14) 附录2:基于单片机的秒表设计PCB图 (15) 附录3:PROTEUS仿真图 (16) 附录4:基于单片机的秒表设计C语言程序清单 (17) 附录5:基于单片机的秒表设计元器件目录表 (19)

1、概述 21世纪是一个电子技术和电子元件有更大发展的世纪。回顾百年来电子技术和电子工业发展的成就,举世瞩目。作为一个电气专业的大学生,我们不但要有扎实的基础知识、课本知识,还应该有较强的动手能力。现实也要求我们既精通电子技术理论,更要掌握电子电路设计、实验研究和调试技术。课程设计就是一个理论联系实际的机会。 本次设计主要完成具备基本功能的电子秒表的理论设计,电子秒表是重要的记时工具,广泛运用于各行各业中。作为一种测量工具,电子秒表相对其它一般的记时工具具有便捷、准确、可比性高等优点,不仅可以提高精确度,而且可以大大减轻操作人员的负担,降低错误率。 在设计中应用到数码管,数码管主要用于楼体墙面,广告招牌、高档的DISCO、酒吧、夜总会、会所的门头广告牌等。特别适合应用于广告牌背景、立交桥、河、湖护栏、建筑物轮廓等大型动感光带之中,可产生彩虹般绚丽的效果。用护栏管装饰建筑物的轮廓,可以起到突出美彩亮化建筑物的效果。事实证明,它已经成为照明产品中的一只奇葩,绽放在动感都市。 2、课题方案设计 系统总体设计要求 用AT89C52设计一个2位LED数码显示“秒表”,显示时间为00~59秒,每秒自动加一。另设计一个“开始”按键和一个“复位”按键,一个“暂停”按键。接上电源后从00开始计时,至59后再回到00,继续循环。 系统模块结构论证 1.单片机模块选择 方案一:选用飞思卡尔单片机,飞思卡尔单片机功能强大,但是价格相对要高,而且对此不熟悉。

基于单片机的可调电子钟的设计说明

编号: 基础工程设计 题目:基于单片机设计的可调电子时钟院(系):信息与通信学院 专业:微电子科学与工程 学生姓名:卢镜 学号:1300240119 指导教师:宋保林

2016 年 1 月 6 日 摘要 本人设计的是一个以单片机STC89C52为核心部件的电子钟,结合LCD液晶显示屏。可以在液晶屏上显示时间和字符,并可任意调整时间。本来想用数码管来显示,但是想到数码管仅能显示数字,所以采用了液晶显示屏。它不仅能显示数字,还能显示字符。它的计时周期为24小时,显满刻度为“23时59分59秒”。 文中详细论述了可调电子钟设计原理、使用的各芯片的介绍,阐明了本实例所使用的设计方案、详细的电路图以及程序。本文编写的主导思想是软硬件相结合,以硬件为基础,来进行各功能模块的编写。本系统以单片机的C语言进行软件设计,并着重介绍了所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程,并且还进行了软件仿真调试和硬件调试。 关键词:单片机STC89C52 ;可调电子钟;液晶显示;仿真

目录 摘要 (1) 前言 (3) 第一章设计说明 (5) 1.1 设计目的和内容 (5) 1.2 设计方案选择 (5) 1.3 设计总体框图 (7) 第二章系统主要硬件设计 (5) 2.1 单片机主控模块 (7)

2.1.1 STC89C52芯片简介 (7) 2.1.2 封装和引脚说明 (8) 2.2 液晶显示模块 (7) 2.2.1 LCD1602模块简介 (11) 2.2.2 LCD1602的控制指令及操作流程 (12) 2.3时钟电路及按键电路 (9) 2.3.1时钟电路 (9) 2.3.2按键电路 (10) 第三章系统软件设计 (10) 3.1 系统程序流程图 (10) 3.2系统程序设计电子时钟清单 (11) 第四章系统调试 (12) 4.1软件调试 (12) 4.2源代码 (14) 4.3硬件调试 (20) 4.3.1原理图 (20) 4.3.2 PCB图 (20) 4.3.3用跳线修改电路 (21) 结语 (21) 谢辞 (22) 参考文献 (23) 附录Ⅰ (24)

数字电子钟设计报告

《电子线路课程设计报告》 系别:自动化 专业班级:自动化0803 学生姓名:冯刚 指导教师:朱定华 (课程设计时间:2010年05月31日——2010年06月12日) 华中科技大学武昌分校

目录 1.课程设计目的 (3) 2.课程设计题目描述和要求 (3) 3.课程设计报告内容.....................................................................3-9 3.1实验名称 (3) 3.2实验目的 (3) 3.3实验器材及主要器件 (3) 3.4数字电子钟基本原理 (4) 3.5数字电子钟单元电路设计、参数计算和器件选择..............................4-8 3.6数字电子钟电路图 (8) 3.7数字电子钟的组装与调试............................................................8-9 4.总结 (9) 参考文献 (10)

1.课程设计目的 ※掌握组合逻辑电路、时序逻辑电路及数字逻辑电路系统的设计、安装、测试方法; ※进一步巩固所学的理论知识,提高运用所学知识分析和解决实际问题的能力;※提高电路布局﹑布线及检查和排除故障的能力; ※培养书写综合实验报告的能力。 2.课程设计题目描述和要求 (1)设计一个有“时”、“分”、“秒”(12小时59分59秒)显示,且有校时功能的电子钟; (2)用中小规模集成电路组成电子钟,并在实验箱上进行组装、调试; (3)画出框图和逻辑电路图,写出设计、实验总结报告; (4)选做:整点报时。在59分51秒、53秒、55秒、57秒输出500Hz音频信号,在59分59秒时输出1000Hz信号,音频持续1s,在1000Hz荧屏结束时刻为整点。 3.课程设计报告内容 3.1实验名称 数字电子钟 3.2实验目的 ·掌握数字电子钟的设计、组装与调试方法; ·熟悉集成电路的使用方法。 3.3实验器材及主要器件 (1)74LS48(6片)(2)74LS90(5片)(3)74LS191(1片)(4)74LS00(5片)(5)74LS04(3片)(6)74LS74(1片)(7)74LS2O(2片) (8)555集成芯片(1片) (9)共阴七段显示器(6片)(10)电阻、电容、导线等(若干)

51单片机简易可调的数码管电子钟程序

#include sbit KEY1=P3^0; sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; sbit LED=P1^2; code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0-9 unsigned char StrTab[8]; //定义缓冲区 unsigned char minute=30,hour=12,second; //定义并且初始化值12:30:00 void delay(unsigned int cnt)//延时函数 { while(--cnt); } void Displaypro(void) { StrTab[0]=tab[hour/10]; //显示正常时间 StrTab[1]=tab[hour%10]; StrTab[2]=0xBF; StrTab[3]=tab[minute/10]; StrTab[4]=tab[minute%10]; StrTab[5]=0xBF; StrTab[6]=tab[second/10]; StrTab[7]=tab[second%10]; } main()//主函数 { TMOD |=0x01;//定时器0 10ms in 12M crystal 用于计时 TH0=0xd8; TL0=0xf0; ET0=1; TR0=1; TMOD |=0x10; //定时器1用于动态扫描 TH1=0xF8; TL1=0xf0; ET1=1; TR1=1; EA =1; Displaypro();

51单片机可调电子时钟

目录 摘要 (2) Abstract (3) 1.设计目的 (4) 2.设计任务 (4) 2.1.任务1:开机界面的设置 (4) 2.2.任务2:LCD-1602显示日期时间 (4) 2.3.任务3:时间与日期的调整 (4) 3.硬件设计 (4) 3.1.STC89C51(51单片机) (4) 3.2.LCD-1602液晶显示屏 (5) 4.软件设计 (7) 4.1.应用软件 (7) 4.2.程序框图 (7) 4.3.使用说明 (7) 4.4.注意事项 (8) 4.5.调试结果 (8) 5.收获 (9) 附录: (10) 附录A.硬件图 (10) 附录B.主要程序 (11)

摘要 电子时钟是单片机系统的一个应用,由硬件和软件相配合使用。本文通过对单片机的控制实现日历功能电子时钟的设计,以达到学习、了解单片机相关指令在各方面的应用。硬件由主控器、显示电路、键盘接口等三个模块组成。该时钟设计以STC-89C51作为主控器,控制显示时钟信息;显示模块用LCD-1602液晶屏;键盘接口电路由普通按键完成。软件利用C语言编程实现单片机的控制功能。 关键词:电子时钟、单片机、LCD-1602液晶显示

Abstract Electronic clock is a single chip microcomputer system application, by the use of hardware and software. In this paper, through the control of single-chip microcomputer to achieve the design of the electronic clock, in order to achieve learning, to understand the microcontroller related instructions in various aspects of the application. The hardware is composed of three modules, such as the main controller, the display circuit, the keyboard interface and so on. The clock is designed with STC-89C51 as the main controller, controlling the display clock information; the display module uses the LCD-1602 LCD screen; the keyboard interface circuit is completed by the ordinary button.Software uses C language programming microcontroller control functions. Key words: electronic clock, single chip microcomputer,LCD-1602 liquidcrystal display

基于proteus的数字电子钟的仿真设计

题目:基于Proteus的数字电子钟的设计 与仿真 课程名称:单片机系统设计与Proteus仿真 学生姓名:马珂 学生学号: 1305010323 系别:电子工程学院 专业:通信工程 年级: 13级 任课教师:徐锋 电子工程学院 2015年5月

目录 一、设计目的与要求 (3) 二、设计内容与方案制定 (3) 三、设计步骤 (3) 1.硬件电路设计 (3) 1.1.硬件电路组成框图 (3) 1.2.各单元电路及工作原理 (4) 1.3.绘制原理图 (5) 1.4.元件清单列表 (6) 2.程序设计 (6) 2.1程序流程 (6) 2.2汇编程序 (7) 四、调试与仿真 (12) 五、心得体会 (14) 六、参考文献: (14)

基于Proteus的数字电子钟的设计与仿真 一、设计目的与要求 设计目的:通过课程设计,培养学生运用已学知识解决实际问题的能力、查阅资料的能力、自学能力和独立分析问题、解决问题的能力和能通过独立思考。 设计要求:设计一个时、分可调的数字电子钟、开机显示“9-58-00”。 二、设计内容与方案制定 具有校时功能,按键控制电路其中时键、分键两个键分别控制时、分时间的调整。按分键分加1;按时键时加1。 以AT89C51单片机进行实现秒、分、时上的正常显示和进位,其中显示功能由单片机控制共阴极数码管来实现,数码管进行动态显示。 三、设计步骤 1、硬件电路设计 1.1.硬件电路组成框图 1.2.各单元电路及工作原理 (1)晶振电路 单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。本系统中

AT89C51单片机采用内部时钟方式。采用外接晶体和电容组成的并联谐振回路。其电路图如下: (2)键盘控制电路 键盘可实现对时间的校对,用两个按键来实现。按时键来调节小时的时间,按分键来调节分针的时间。其电路连接图如下: (3)显示电路 LED显示器是现在最常用的显示器之一发光二极管(LED)分段式显示器由7条线段围成8字型,每一段包含一个发光二极管。外加正向电压时二极管导通,发出清晰的光。只要按规律控制各发光段亮、灭,就可以显示各种字形或符号。显示电路显示模块需要实时显示当前的时间,即时、分、秒,因此需要6个数码管,采用动态显示方式显示时间,其硬件连接方式如下图所示。

微机原理课程设计——可调电子时钟

《微机原理课程设计》 设计报告 姓名:张经纬 学号: 1345533124 班级: 13 电气 1 班 专业:电气工程及其自动化 学院:电气与工程信息学院 2016年3月

目录 一、设计任务描述 (3) 1.1设计题目 (3) 1.2设计目的 (3) 1.3设计要求 (3) 二、设计方案描述 (3) 2.1设计原理 (3) 2.2设计芯片结构 (4) 三、具体模块设计 (5) 3.1概述 (5) 3.2小键盘模块 (5) 3.3显示模块 (5) 3.4定时模块 (6) 3.5中断处理模块 (6) 3.6硬件接线图 (6) 3.7主程序流程图 (6) 四、可控电子时钟源程序 (9) 五、心得体会 (14)

可调电子时钟 一、设计任务描述 1.1设计题目 可调电子钟设计 1.2设计目的 《微型计算机原理及应用》是一门实践性较强的课程,课堂上的理论学习 不足以让学生熟练掌握这门课程。所以让学生在学完该课程之后,进行一次课 程设计,使学生将课堂所学的知识和实践有机结合起来,初步掌握计算机应用 系统设计的步骤和接口设计的方法,提高分析和解决实际问题的能力。具体如下: 1、熟悉中断工作原理,定时计数原理,并行通信原理工作原理。 2、掌握8259芯片,8254芯片,8255芯片功能,结构,编程。 3、掌握七段数码管以及小键盘的使用。 4、能运用所提到的芯片,设计系统并进行程序开发,满足用户需求。 1.3设计要求 1、设计一电子时钟,能计时、在数码管上显示时间并用键盘调节时间。 2、根据所用的接口电路芯片设计出完整的接口电路,并在实验系统上完成 电路的连接和调试通过. 3、程序设计:要求画出程序框图,设计出全部程序并给出程序设计说明和程序注释。 4、前期完成的实验有:8259A中断控制器实验,8254定时计数器实验,8255并行接口实验。 二、设计方案描述 2.1设计原理 首先利用程序硬性规定分、秒的起始时间为零。利用实验台上提供的定时 器8254和扩展板上提供的8259以及键盘和数码显示电路,设计一个电子时钟,

自制可调式数字时钟完整版

《综合设计实训I》可调式数字时钟 姓名: 学号: 班级: 实训地点: 指导教师: 通信与电子学院编制 年月日

一、设计要求 数字时钟是采用数字电路实现对年,月,日,时,分,秒数字显示的计时装置,广泛用于个人,家庭,车站,码头,办公室等公共场所,成为人们日常生活中的必需品。 1,、设计时可以利用单片机内部定时器,也可以利用外部实时时钟芯片。(I/O,I2C总线) 2、有年,月,日,时,分,秒功能,而且要能够校正前面五项。 3、显示时可以用8位数码管,也可以用LCD液晶屏。(年只需显示后2位) 4、可选功能:闹钟功能。 二、设计方案 1、芯片分析 AT89C51引脚图 管脚说明: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输

入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4 个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示: 口管脚备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

相关文档
最新文档