设计一个秒表

1、通过LED数码管实现不停的加1计数。
2、分别设计暂停健与继续健。
3、通过(IIC)AT 24C02C保存计数数字(Proteus元件库中没有AT24C02,可用FM24C02芯片代替。),以便重启系统后继续计数。

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit SCL=P1^1;
sbit SDA=P1^0;

uchar Second,total=100;

uchar code DSY_CODE[]=
{
 	0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
uchar DSY_Buffer[4]={0,0,0,0};

void delay(){ ;; }

void Start()
{
 	SDA=1;SCL=1;delay();SDA=0;delay();SCL=0;
}

void Stop()
{
 	SDA=0;SCL=0;delay();SCL=1;delay();SDA=1;
}
void RACK()
{
 	SDA=1;delay();SCL=1;delay();SCL=0;
}
/*void NO_ACK()
{
 	SDA=1;SCL=1;delay();SCL=0;SDA=0;
} */
void initint()
{
	TMOD = 0x01;
	TH0 = 0xee;
	TL0 = 0x00;
	EA = 1;
	ET0 = 1;
	TR0 = 1;

	EX0 = 1;
	EX1 = 1;
	IT0 = 1;
	IT1 = 1;
	//PX0 = 0;
	//PX1 = 1;
}

void initiic()
{
	SDA=1;
	delay();
	SCL=1;
	delay();
}

void Write_A_Byte(uchar b)
{
 	uchar i;
	for(i=0;i<8;i++)
	{
	 	b<<=1;SDA=CY;_nop_();SCL=1;delay();SCL=0;
	}
	RACK();
}

uchar Receive_A_Byte()
{
 	uchar i,d;
	for(i=0;i<8;i++)
	{
	 	SCL=1;d<<=1;d|=SDA;SCL=0;
	}
	return d;
}

void delay1(uchar x)
{
	uchar a,b;
	for(a=x;a>0;a--)
	 for(b=100;b>0;b--);
}

void write_add(uchar address,uchar date)
{
	Start();
	Write_A_Byte(0xa0);	
	Write_A_Byte(address);
	Write_A_Byte(date);
	Stop();
}

uchar read_add(uchar address)
{
	uchar date;
	Start();
	Write_A_Byte(0xa0);
	Write_A_Byte(address);
	Start();
	Write_A_Byte(0xa1);
	date=Receive_A_Byte();
	Stop();
	return date;
}


void main()
{
	uchar i,m,Num;	
	initiic();
	initint();
	Second=read_add(23);
	while(1)
	{
		Num = Second;
	 	m = 0x7f;
		DSY_Buffer[1] = Num/100;
		DSY_Buffer[2] = Num/10%10;
		DSY_Buffer[3] = Num%10;
		DSY_Buffer[0] = 0;
		for(i=0;i<4;i++)
		{
		 	m = _crol_(m,1);
			P2 = m;
			P0 = DSY_CODE[DSY_Buffer[i]];
			delay1(10);
		}
	}	
}

void timer0() interrupt 1
{
	TH0 = 0xee;
	TL0 = 0x00;
	total--;
	if(total <= 0)
	{
		Second++;
		write_add(23,Second);
		delay1(100);
		total = 100;
	}

}  

void int0() interrupt 0
{
	ET0 = 0;
	TR0 = 0;
}

void int1() interrupt  2
{
	ET0 = 1;
	TR0 = 1;
}

图片:
在这里插入图片描述

Verilog HDL是一种硬件描述语言,常用于设计数字电路系统状态机。为了用Verilog设计一个秒表的状态机,我们通常会创建以下几个状态: 1. **启动状态** (Start): 当用户按下开始时进入此状态,系统初始化计数器为02. **计数状态** (Counting): 在这个状态下,每经过一个时间单位(比如毫秒或定时周期),计数一,显示当前数。 3. **暂停状态** (Paused): 用户暂停计数时,系统停止计数器的递增。 4. **停止状态** (Stopped): 用户停止计数并读取当前,然后回到初始状态。 以下是简化的状态机结构示例: ```verilog module stopwatch ( input clk, // 主时钟信号 input start, // 启动按钮 input pause, // 暂停按钮 output [7:0] display, // 显示当前数 input reset // 重置信号 ); reg [63:0] counter; // 64位计数器 reg is_running = 1'b0; // 运行标志 // 状态机 always @(posedge clk or posedge reset) begin if (reset) begin counter <= 0; is_running <= 1'b0; display <= 8'h00; end else if (start && !is_running) begin is_running <= 1'b1; counter <= 0; end else if (pause && is_running) begin is_running <= 1'b0; end else if (!is_running) begin // 当运行标志变为0,更新显示暂停状态或读取计数 // 这里仅做简化,实际需要考虑如何处理停止后计数的保存或显示 display <= 8'h00; end else begin counter <= counter + 1; // 根据计数转换为二进制表示并显示 display <= {counter[5:0], display}; end end endmodule ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值