我想用51五一单片机0~9999.9做一个9999 9999秒的秒表(八位数码管),但是怎么计数到255就溢出归零了?

使用8051单片机设计实现一个秒表_百度知道
使用8051单片机设计实现一个秒表
1.使用7段数码管显示当前的计数值,数值范围为0~9999;2.包含两个按键,其中一个按键为开始/暂停计时按键,另一个为重置按键(让计数回零);(可以不考虑按键抖动问题)3.秒表计时要...
1. 使用7段数码管显示当前的计数值,数值范围为0~9999;2. 包含两个按键,其中一个按键为开始/暂停计时按键,另一个为重置按键(让计数回零);(可以不考虑按键抖动问题)3. 秒表计时要用定时/计数器实现。用C语言写,谢谢,急
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:4847
获赞数:6351
你好!程序什么时间要?把仿真源文件发一下,可以尝试写程序
这么简单的问题都不会, 可怜的孩子
初学者,会就帮帮我,谢谢
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。实验描述:
利用计数器中断做秒表程序,再利用165芯片读取当前的按键状态,然后利用595芯片将当前时间显示到八位数码管上 。并且随时响应用户的按键行为。
代码优点:可防止用户按键时间过长而误判。
代码缺点:暂停与开始功能彻底阻断了所有中断。使得秒表在暂停的时候无法响应任何中断。
#include &iom8v.h&#include &macros.h&/******************************** PC0
** PC1 --------
M595_SRCLK
** PC4 ----------
** PC5 ----------
** PD0~3 --------
** K1~K2 --------
M165_D0 ~ D1 ** a~h ----------- M595_Q0 ~ Q7 ********************************/#define M165_CP_LOW (PORTC &= ~BIT(PC4))#define M165_CP_HIGH (PORTC |= BIT(PC4))#define M165_PL_LOW (PORTC &= ~BIT(PC3))#define M165_PL_HIGH (PORTC |= BIT(PC3))#define M165_Q7 ((PINC & BIT(PC5)) ? BIT(0) : 0x00)#define M595_SER_HIGH (PORTC |= BIT(PC0))#define M595_SER_LOW (PORTC &= ~BIT(PC0))#define M595_SRCLK_HIGH (PORTC |= BIT(PC1))#define M595_SRCLK_LOW (PORTC &= ~BIT(PC1))#define M595_RCLK_HIGH (PORTC |= BIT(PC2))#define M595_RCLK_LOW (PORTC &= ~BIT(PC2))#define LED_BIT_SELECT PORTD#define KEY1_UP(n) ((n & BIT(0)) ? 0x01 : 0x00)#define KEY1_DOWN(n) ((n & BIT(0)) ? 0x00 : 0x01)#define KEY2_UP(n) ((n & BIT(1)) ? 0x01 : 0x00)#define KEY2_DOWN(n) ((n & BIT(1)) ? 0x00: 0x01)UINT16 LED_TEXT[24] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71,0x73, 0x38, 0x76, 0x3E, 0x50, 0x08, 0x40, 0x00};//8位数码管的24种状态。0-9分别代表了十个数字的代码#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVFUINT16 g_Time_C
//时间数void Count_Increase(void)
//时间增加函数{
g_Time_Count++;
if(g_Time_Count & 9999)
g_Time_Count = 0;
}}void Count_Clear(void)
//时间清空函数{
timer0_init();
//计数器复位
g_Time_Count = 0;
//时间清零}void Pause_Or_Start(void)
//暂停或者继续{
static UINT8 state = 0;
if (state)
}}void timer0_ovf_isr(void){
static UINT16 wCount = 0;
TCNT0 = 0x83; //reload counter value
if(wCount &= 1000)
wCount = 0;
Count_Increase();
wCount++;}void Device_Init(void){
Port_Init();
//stop errant interrupts until set up
CLI(); //disable all interrupts
timer0_init();
MCUCR = 0x00;
TIMSK = 0x01; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}void Port_Init(void){
DDRD = 0xFF;
DDRC = ~BIT(PC5);
PORTD = 0xFF;
PORTC = 0xFF;}void Delay_MS(UINT16 wTimer){
UINT16 i = 0,j = 0;
for (i = 0;i & wTi++)
for (j = 0;j & 200;j++)
}}void Show_Led(UINT16 wNum)
//将一个四位数显示到四个八位数码管上{
for(chBit = 0x08; chBit & 0; chBit &&= 1)
//从个位开始显示
LED_BIT_DATA = ~LED_TEXT[wNum % 10];
Write_Data_To_595(~LED_TEXT[wNum % 10]);
//将数字代码写入595芯片
Show_M595_Data();
//595芯片输出代码
LED_BIT_SELECT = chB
//选择相应的位
wNum /= 10;
if(wNum == 0)
}}void M165_Update_Data(void)
//给芯片一个上升沿以更新595芯片存储的内容{
M165_PL_LOW;
M165_PL_HIGH;}UINT8 Read_A_Byte_From_165(void)
//从165芯片中读取一个字节的内容{
UINT8 chCount = 0;
UINT8 chResult = 0;
M165_PL_HIGH;
//拉高PL端
for(chCount = 0; chCount & 8; ++chCount)
//依次读取八位数
chResult &&= 1;
chResult |= M165_Q7;
M165_CP_LOW;
//给出上升沿以使165移位
M165_CP_HIGH;
return chR}void Write_Data_To_595(UINT8 chData)
//向595芯片中写入值{
UINT8 chCount = 0;
for(chCount = 0; chCount & 8; chCount++)
//计数控制
M595_SRCLK_LOW;
//拉低SRCLK端
if((chData & BIT(7 - chCount)) != 0x00)
//根据当前位的状态将SER端拉高或拉低
M595_SER_HIGH;
M595_SER_LOW;
M595_SRCLK_HIGH;
//给出上升沿
}}void Show_M595_Data(void)
//在RCLK上给上升沿以输出595芯片内容{
M595_RCLK_LOW;
M595_RCLK_HIGH;}void timer0_init(void)
//计数器初始化{
TCCR0 = 0x00; //stop
TCNT0 = 0x83; //set count
TCCR0 = 0x03; //start timer}void main(){
UINT8 chKey_S
//当前的所有按键状态
UINT8 chKey_State_Pre = 0xFF;
//上次读取的按键状态
g_Time_Count = 0;
//时间置零
Device_Init();
M165_Update_Data();
//165芯片更新数据
chKey_State = Read_A_Byte_From_165();
//从165芯片中读取数据
if (KEY1_UP(chKey_State_Pre) && KEY1_DOWN(chKey_State))
//如果KEY1刚被按下
Pause_Or_Start();
//执行继续、暂停功能
else if(KEY2_UP(chKey_State_Pre) && KEY2_DOWN(chKey_State))
//如果KEY2刚被按下
Count_Clear();
//执行清零功能
chKey_State_Pre = chKey_S
Show_Led(g_Time_Count);
//将当前时间显示到数码管
没有更多推荐了,秒表,用动态数码管显示,范围从,可暂停,可复位。要求用MC51单片机,用汇编语言编程。_百度知道
秒表,用动态数码管显示,范围从,可暂停,可复位。要求用MC51单片机,用汇编语言编程。
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:107
获赞数:378
usecond&&equ&&50hmsecond&&equ&&51hsecond1&&equ&&52hsecond2&&equ&&53hsecond3&&equ&&54hsecond4&&equ&&55h org&&&00h ljmp&&start org&&&03h ljmp&&int_ex0 org&&&0bh ljmp&&int_t0 org&&&013h ljmp&&int_ex1 org&&&01bh ljmp&&int_t1 org&&&0100hstart:&&mov&&&tmod,#12h&&&&&&&&mov&&&th0,#6&&&&&&&&mov&&&tl0,#6&&&&&&&&mov&&&th1,#0d8h&&&&&&&&mov&&&tl1,#0f0h&&&&&&&&mov&&&usecond,#40&&&&&&&&mov&&&msecond,#10&&&&&&&&mov&&&second1,#0&&&&&&&&mov&&&second2,#0&&&&&&&&mov&&&second3,#0&&&&&&&&mov&&&second4,#0&&&&&&&&setb&&it0&&&&&&&&setb&&it1&&&&&&&&setb&&ex0&&&&&&&&setb&&ex1&&&&&&&&setb&&et0&&&&&&&&setb&&et1&&&&&&&&setb&&tr1&&&&&&&&setb&&ea mov&&&r0,#second1 mov&&&r7,#0feh&&&&&&&&sjmp&&$int_ex0:cpl&&&tr0&&&&&&&&retiint_ex1:clr&&&tr0&&&&&&&&mov&&&usecond,#40&&&&&&&&mov&&&msecond,#100&&&&&&&&mov&&&second1,#0&&&&&&&&mov&&&second2,#0&&&&&&&&mov&&&second3,#0&&&&&&&&mov&&&second4,#0&&&&&&&&retiint_t0:&djnz&&usecond,t0_end&&&&&&&&mov&&&usecond,#40&&&&&&&&djnz&&msecond,t0_end&&&&&&&&mov&&&msecond,#100&&&&&&&&inc&&&second1 mov&&&a,second1&&&&&&&&cjne&&a,#10,t0_end&&&&&&&&mov&&&second1,#0&&&&&&&&inc&&&second2&&&&&&&&mov&&&a,second2&&&&&&&&cjne&&a,#10,t0_end&&&&&&&&mov&&&second2,#0&&&&&&&&inc&&&second3&&&&&&&&mov&&&a,second3&&&&&&&&cjne&&a,#10,t0_end&&&&&&&&mov&&&second3,#0&&&&&&&&inc&&&second4&&&&&&&&mov&&&a,second4&&&&&&&&cjne&&a,#10,t0_end&&&&&&&&mov&&&second4,#0t0_end:&retiint_t1:&mov&&&th1,#0d8h&&&&&&&&mov&&&tl1,#0f0h cpl&&&p1.0 mov&&&p0,#0 mov&&&p2,#0ffh mov&&&a,@r0 mov&&&dptr,#tab movc&&a,@a+dptr mov&&&p0,a mov&&&p2,r7 inc&&&r0 mov&&&a,r7 rl&&&&a mov&&&r7,a jb&&&&acc.4,t1_end mov&&&r0,#second1 mov&&&r7,#0feht1_end:&retitab&:db&3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
用什么软件编程
kiel c51 编程,Proteus仿真。
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。查看: 1078|回复: 3
秒表可以连续走到9999秒
秒表可以连续走到9999秒,到9999秒自动复位到0,重新计时可以按复位键或停止键。本程序经过上板实验,完全可靠。
#include&reg51.h&
#define GPIO_DIG& &P0
#define GPIO_PLACE P1
unsigned char code DIG_PLACE[4] = {0xfe,0xfd,0xfb,0xf7};//,0xef,0xdf,0xbf,0x7f};//位选控制& &查表的方法控制
unsigned char code DIG_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char DisplayData[8]; //用来存放要显示的8位数的值
unsigned char T& && && && && && && && &//用来存放定时时间
unsigned int S
/*********************使用数码管显示*******************/
void DigDisplay()
{
& && &&&
& && &&&
& && &&&for(i=0; i&8; i++)
& && &&&{
& && && && && & GPIO_PLACE=DIG_PLACE[i];& && && &//发送位选
& && && && && & GPIO_DIG=DisplayData[i];& &//发送段码
& && && && && & j=10;& && && && && && && && && && && && && && && && && && && &&&//扫描间隔时间设定
& && && && && & while(j--);& && &&&
& && && && && & GPIO_DIG=0x00;& && && && & //消隐
& && &&&}
}
/*********************配置定时器************************/
void Timer0init(void)
{
& && &&&TMOD=0x01;& &&&//定时器0选择工作方式1
&&TH0 =()/256;& && && &//设置初始值,定时50MS
&&TL0 =()%256;
&&EA&&=1;& && && &&&//打开总中断
&&ET0 =1;& && && && && &&&//打开定时器0中断
&&TR0 =1;& && && && && &&&//启动定时器0& && &&&
}
/**********************主函数***************************/
void main(void)
{& && && &
&&Timer0init();&&
&&while(1)& &
&&{
& & if(Second&9999)
& & {
& && &Second=0;
& & }
& & DisplayData[0]=DIG_CODE[(Second)/10000];
& & DisplayData[1]=DIG_CODE[(Second)%];
& & DisplayData[2]=DIG_CODE[(Second)%100/10];
& & DisplayData[3]=DIG_CODE[(Second)%10];
& & DigDisplay();
&&}& && && && && && && && && && &&&
}
/*******************定时器0中断函数**********************/& && && && && && &
void Timer0() interrupt 1
{
& && &&&TH0=()/256; //设置初始值
& && &&&TL0=()%256;
& && &&&Time++;
& && &&&if(Time==40)&&//控制秒时间长短
& && &&&{
& && && && && & Second++;
& && && && && & Time=0;
& && &&&}
}
复制代码
共享资料的黑币奖励!
无效楼层,该帖已经被删除
虽然不需要 但是还是要感谢楼主的奉献精神
本帖最后由 zl2168 于
14:47 编辑
实例93&&99.9秒秒表
先Proteus仿真一下,确认有效。
(38.86 KB, 下载次数: 7)
14:46 上传
点击文件名下载附件
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,书中电路和程序设计有详细说明,电路与程序真实可靠可信可行,程序语句条条有注解。若需99.99秒,硬件电路增加一位595。软件程序增加0.01s(10ms)计数器,并修改相应计数显示程序。另外,显示也可改成I/O口直接驱动。
Powered by两种方式实现
/*用定时器以间隔500MS在6位数码管上
依次显示0、1、2、3….C、D、E、F,重复。*//*轮流在每一位数码管上显示*/
-----------------------------------------------------①---------------------------------------------------------------------
/*利用一个定时器实现数码管从左到右每位依次显示数字,且数字由0变到F再变到0,循环。*/
#include&reg52.h&
#define ui unsigned int
#define uc unsigned char
void init();
sbit we=P2^7;
sbit du=P2^6;
/*数码管段码表*/
uc code tabledu[]=
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
F 不显示*/
0x39,0x5e,0x79,0x71,0
/*数码管位码表*/
uc code tablewe[]=
//位码表(从高位到低位)
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f
uc numdu=0;
uc numwe=0;
uc flag=0;
void main()
//初始化定时器0
P0=tablewe[0]; //显示第一位数码管;
P0=tabledu[0];
if(numdu==16)
if(numwe==8)
P0=tablewe[numwe];
P0=tabledu[numdu];
void init()
TMOD=0x01;
//设置定时器0为工作方式1
TH0=()/256;
"/"是求模运算 即能被几个整除
TL0=()%256;
"%"是求余运算 即整除后剩余
//开总中断
//开定时器0中断
//启动定时器0
void time0()interrupt 1
TH0=()/256;
TL0=()%256;
-----------------------------------------------------②---------------------------------------------------------------------
/*用定时器以间隔500MS在6位数码管上
依次显示0、1、2、3….C、D、E、F,重复。*/
/*轮流在每一位数码管上显示*/
#include&reg52.h&
#define ui unsigned int
#define uc unsigned char
sbit du=P2^6;
sbit we=P2^7;
uc flag=0;
uc code tabledu[]=
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
F 不显示*/
0x39,0x5e,0x79,0x71,0
uc code tablewe[]=
//位码表(从高位到低位)
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f
void delay(ui z)
for(x=z;x&0;x--)
for(y=114;y&0;y--);
void init_timer0()
TMOD=0x01;
TH0=()/256;
TL0=()%256;
void display()
P0=tabledu[0];
if(numwe==8)
P0=tablewe[numwe];
if(numdu==16)
P0=tabledu[numdu];
void main()
init_timer0();
display();
void timer0() interrupt 1
TH0=()/256;
TL0=()%256;
if(tt==10)
定时器计时,并在数码管实时显示时间
6.简易电子钟数码管动态扫描(使用定时器)有调时功能
定时器和数码管
第二十七节:在定时中断里动态扫描数码管的程序。
使用TIM1产生1秒定时控制数码管显示0-9(STM32_10)
没有更多推荐了,}

我要回帖

更多关于 51单片机实现9999秒倒计时 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信