利用单片机设计59秒计时器

作者&投稿:前时 (若有异议请与网页底部的电邮联系)
单片机00-59秒计时器(利用软件延时)C语言源程序~

哥,你这是在学单片机么?学单片机数组里面是什么东西你都看不出来吗?那分明是共阴极数码管显示从0到9的CODE表啊。你没看把数组里面的数一个求除一个求余送到两个端口了吗?那两个端口一定是数码管的,你这程序问题好多啊,送给数码管也不能用总线的形式操作啊。再说,你要定时这段程序也太繁琐了,完全可以减少一半的代码。而且我没听说谁定时还用delay()的,都用定时器中断定时,那样才会精准。好好学吧,单片机以后还是有发展的,多看看书,以后这些问题提出来会被人笑的。

#include#include#define u16 unsigned int#define u8 unsigned char#define Pin00x01#define Pin10x02#define Pin20x04#define Pin30x08#define Pin40x10#define Pin50x20#define Pin60x40#define Pin70x80sbit k1=P3^3;sbit k2=P3^4;sbit k3=P3^5;#define K1Pin0#define K2Pin1#define K3Pin2u8 key=0xff;//消抖后的有效按键值u8 key_down=0x00;//按键下降沿扫描结果,1有效u8 key_up=0x00; //上升沿扫描结果,1有效u8 key_sc=0xff;//上次扫描的按键值//按键扫描程序void scanKey(){static u8 temp0;static u8 ms;u8 temp=0;if(k1==1)temp|=K1;if(k2==1)temp|=K2;if(k3==1)temp|=K3;if(temp==temp0){// 按键消抖if(++ms>=5){//连续5次扫描的值一样,则认为是稳定状态key=temp;ms=0;}}else {temp0=temp;ms=0;}key_down=key_sc&(~key);//下降沿扫描key_up=(~key_sc)&key;//下降沿扫描key_sc=key;}u8 readPIN(u8 port,u8 pin){ return ((port&pin)==0?0:1);}u8 ds[4]; //数码管显示缓存code u8 w[]={0x01,0x02,0x04,0x08,};//位码code u8 d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//断码code u8 dand[]={0xff,0x7f,0xff,0xff};void dispaly(){//显示函数static u8 a;a++;if(a>3)a=0;P0=0xff;P2=w[a];P0=d[ds[a]]&dand[a];}void Timer0Init(void)//1毫秒@11.0592MHz{AUXR &= 0x7F;//定时器时钟12T模式TMOD &= 0xF0;//设置定时器模式TMOD |= 0x01;//设置定时器模式TL0 = 0x66;//设置定时初值TH0 = 0xFC;//设置定时初值TF0 = 0;//清除TF0标志TR0 = 1;//定时器0开始计时}void init()//初始化函数{ Timer0Init();}u16 js_ms=0;u8 flag=0;u16 count=0;void main()//主函数{init();TR0=1;while(1){ds[0]=count/1000%10;//将当前分值送到数码管缓存ds[1]=count/100%10;ds[2]=count/10%10;ds[3]=count%10;scanKey();//扫描按键if(readPIN(key_down,K1)==1){//k1,开始flag=1;}if(readPIN(key_down,K2)==1){//k2,停止flag=0;}if(readPIN(key_down,K3)==1){//k3,复位count=0;}}}void timer0() interrupt 1//定时器,实现倒计时{ TH0=(65536-1000)/256;TL0=(65536-1000)%256;dispaly();if(++js_ms>=10&&flag!=0){js_ms=0;if(count<5999)count++;}}

共阳共阴只是你在选COM端时给其高低电平的问题无关大雅
我给一段PIC单片机的程序让你参考一下,如果你看懂的话应该能做出来了
#include <pic.h>
#include <math.h>
//此程序实现计时秒表功能,时钟显示范围00.00~99.99秒,分辨度:0.01秒
unsigned char s0,s1,s2,s3;
//定义0.01 秒、0.1 秒、1秒、10秒计时器
unsigned char s[4];
unsigned char k ,data ,sreg;
unsigned int i;
const table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
//不带小数点的显示段码表
const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
//带小数点的显示段码表
//TMR0初始化子程序
void tmint()
{
T0CS=0; //TMR0工作于定时器方式
PSA=1; //TMR0不用分频
T0IF=0; //清除TMR0的中断标志
T0IE=1; //TMR0中断允许
}
//spi显示初始化子程序
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
//设置SPI的控制方式,允许SSP方式,并且时钟下降沿发送。与"74HC595,当其
//SCLK从低到高跳变时,串行输入寄存器"的特点相对应
TRISC=0xD7; //SDO引脚为输出,SCK引脚为输出
TRISA5=0; //RA5引脚置为输出,输出显示锁存信号
}
//系统其它部分初始化子程序
void initial()
{
TRISB1=0;
TRISB2=0;
TRISB4=1;
TRISB5=1; //设置与键盘有关的各口的输入输出方式
RB1=0;
RB2=0; //建立键盘扫描的初始条件
}
//SPI传输数据子程序
void SPILED(data)
{
SSPBUF=data; //启动发送
do {

}while(SSPIF==0);
SSPIF=0;
}
//显示子程序,显示4位数
void dispaly()
{
RA5=0; //准备锁存
for(k=4;k>0;k--)
{
data=s[k-1];
if(k==3) data=table0[data];//第二位需要显示小数点
else data=table[data];
SPILED(data); //发送显示段码
}
for(k=0;k<4;k++)
{
data=0xFF;
SPILED(data); //连续发送4个DARK,使显示好看一些
}
RA5=1; //最后给锁存信号,代表显示任务完成
}
//软件延时子程序
void DELAY()
{
for(i = 3553; --i ;) continue;
}
//键扫描子程序
void KEYSCAN()
{
while(1){
while(1)
{
dispaly(); //调用一次显示子程序
if ((RB5==0)||(RB4==0)) break;
}
DELAY(); //若有键按下,则软件延时
if ((RB5==0)||(RB4==0)) break;//若还有键按下,则终止循环扫描,返回
}
}
//等键松开子程序
void keyrelax()
{
while(1){
dispaly(); //调用一次显示子程序
if ((RB5==1)&&(RB4==1)) break;
} //为防止按键过于灵敏,每次等键松开才返回
}
//系统赋值初始化子程序
void inizhi()
{
s0=0x00;
s[0]=s0;
s1=0x00;
s[1]=s1;
s2=0x00;
s[2]=s2;
s3=0x00;
s[3]=s3; //s0=s1=s2=s3=0,并放入显示缓冲数组中
sreg=0x00; //tmr0中断次数寄存器清0
}
//中断服务程序
void interrupt clkint(void)
{
TMR0=0X13; //对TMR0写入一个调整值。因为写入TMR0后接着的
//两个周期不能增量,中断需要3个周期的响应时间,
//以及C语言自动进行现场保护要消耗周期
T0IF=0; //清除中断标志
CLRWDT();
sreg=sreg+1; //中断计数器加1
if(sreg==40) //中断次数为40后,才对S0,S1,S2,S3 操作
{
sreg=0;
s0=s0+1;
if(s0==10){
s0=0 ;
s1=s1+1;
if(s1==10){
s1=0 ;
s2=s2+1;
if(s2==10){
s2=0;
s3=s3+1;
if(s3==10) s3=0 ;
}
}
}
}
s[0]=s0;
s[1]=s1;
s[2]=s2;
s[3]=s3;
}
//主程序
main()
{
OPTION=0XFF;
tmint(); //TMR0初始化
SPIINIT(); //spi显示初始化
initial(); //系统其它部分初始化
di(); //总中断禁止
while(1) {
inizhi(); //系统赋值初始化
KEYSCAN(); //键扫描,直到开始键按下
keyrelax(); //等键松开
ei(); //总中断允许
TMR0=0X08;
KEYSCAN(); //键扫描直到停止键按下,在键扫描时有显示
keyrelax() ; //等键松开
di(); //总中断禁止
KEYSCAN(); //键扫描到清0键按下,在键扫描时有显示
keyrelax() ; //等键松开
}
}

我写的STC89C52的利用定时器1在六位数码管前三位显示秒表。精确到0.01秒,你可以参考下,改下IO口。不知道你的硬件设计只能给予程序参考。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//段选编码表
uchar code tablewe[]={
0xfe,0xfd,0xfb,
0xf7,0xef,0xdf}; //位选编码表
void delay();
void inti();
uint temp;
display(temp);
void main()
{

inti();
while(1)
{
display(temp);
}
}
void inti()
{
temp=0;
TMOD=0x10;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;
ET1=1;
TR1=1;
}
void timer1() interrupt 3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
temp++;
if(temp==999)
temp=0;
}
display(x)
{
uchar bai,shi,ge;

bai=x/100;
shi=x%100/10;
ge=x%10;

wela=1;
P0=tablewe[2];
wela=0;

dula=1;
P0=tabledu[ge];
dula=0;
delay();
P0=0xff;

wela=1;
P0=tablewe[1];
wela=0;

dula=1;
P0=tabledu[shi];
dula=0;
delay();
P0=0xff;

wela=1;
P0=tablewe[0];
wela=0;

dula=1;
P0=tabledu[bai];
dula=0;
delay();

}
void delay()
{
uint i,j;
for(i=1;i>0;i--)
for(j=110;j>0;j--);
}


单片机0~59秒数吗显示程序
unsigned char ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};unsigned char sec;void t0isr() interrupt 1 \/\/秒计时 { TR0=0;TH0=0x3c;TL0=0xb0;TR0=1;time++;if(time==20){ time=0;sec++;if(sec>59)sec=0;...

单片机编程制作电子秒表能显示分(0-99),秒(0-59)
、位选(决定多位数码管中哪一位显示)、段选(决定数码管显示的数字),另外还有锁存器(教材P36,可通过控制锁存端来改变数据输出的状态)。上周单片机实验课的内容是编一个秒表,在4位数码管中分别显示分和秒还有分秒,即最多可显示“9:59.9”。这里我用两个键实现了秒表的启动\/暂停和清零功能,...

用52单片机C语言编写程序,实现00~59计时。要求用T0,工作方式1。_百度...
include <reg52.h> define uint unsigned int define uchar unsigned char sbit dula=P2^6; \/\/段选 sbit wela=P2^7; \/\/位选 uchar shi,ge,num1,num2; \/\/变量 uchar code table[]={0x3f,0x06,0x5b,0x4f,\/\/共阴极字型码 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39...

求52单片机汇编程序,简单的电子钟实现59到0循环显示,倒计时秒表_百度知 ...
MOV SECC,#59 LCALL DISSEC SETB TR0 SETB TR1 LOOP:SJMP ;--- T1INT:PUSH ACC CLR TR1 MOV TH1,#0F4H MOV TL1,#48H SETB TR1 MOV DPTR,#TABLE MOV R0,#LEDD MOV A,LEDC T1INT0:JNZ T1INT1 MOV P2,#01H MOV A,@R0 MOVC A,@A+DPTR CPL A MOV P1,A SJMP T1INTD T1INT...

AT89S52单片机分秒计时显示汇编编程,4块晶体管,完成分、秒计时。低两 ...
LCALLCLR0;调用清零程序,这里只清零秒 AJMPLOOP;跳转LOOP循环 LOOP2:AJMPLOOP;跳转LOOP循环 MIN_SET:CALLDISP;调用显示程序 JNBP1.1,MIN_SET;P1.1按下跳到调分程序 INC76H;分的个位加1 MOVR5,76H CJNER5,#10,MIS1;个位不为10跳到MIS1 MOV76H,#0;个位清零 INC77H;十位加1 MOVR5,77...

用51单片机写一个程序,求大神
1、使用定时器0方式二,结合软件计数器来实现秒信号的产生;2、定时器必须使用中断的方式来实现;3、使用单片机开发板上的左边四位来扫描显示时间,显示格式为“MM.SS”;4、开机时显示00.00,最大值显示到59.59(59分59秒);5、第一次按电路板上K1(P3.2)键启动走时,K1必须使用中断方式实现...

单片机秒表C语言设计,精度为0.1,:计时长度为9:59:59
你好!是用液晶显示还是数码管显示呢,下面这是液晶完成的

AT89S52单片机分秒计时显示汇编编程,4块晶体管,完成分、秒计时。低两 ...
下面以常规方式制作的电路:为了节省端口,使用锁存器来分时复用P0口。\/\/52头文件 include<reg52.h> \/\/特殊寄存器定义 \/\/变量类型宏 define uint unsigned int \/\/无符整型变量 define uchr unsigned char \/\/无符字符变量 \/\/变量定义 uchr aa; \/\/中断计次 uchr miao,fen; \/\/秒,分计数 uchr...

51单片机时钟用液晶显示时为什么秒加到59就出现01;而不是0?
你可以设定:如果秒计数到60时就变为01,这样在每次计数到59之后,再加1就回到01了,即:假设s变量记录秒:if(s==60) s=1;...从0开始也不用担心,只要不但计数,直到59之后就恢复正常了。

51单片机c程序用定时器控制两个数码管显示0到59,一直没弄懂段位和位选...
数码管 的 一位 数字 称一个位,两个数字为 两位,三个---,每个数字 有 八个段 为 a b c d e f g h,(h 为小数点)数码管 有 两位一体的、三位一体的,四位一体的等,如四位一体的数码管有12个脚,分为 a b c d e f g h 八个 段码脚,四个 ...

徽县17117377949: 利用单片机设计59秒计时器 -
瞿丹西维: 我写的STC89C52的利用定时器1在六位数码管前三位显示秒表.精确到0.01秒,你可以参考下,改下IO口.不知道你的硬件设计只能给予程序参考. #include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7;...

徽县17117377949: 求单片机计时59分59秒的程序
瞿丹西维: 以下程序可以计时23小时59分59秒. ORG 0000H JMP BEGIN ORG 000BH LJMP T0INT ORG 001BH LJMP T1INT LEDD EQU 30H LEDC EQU 36H SECC EQU 37H MINC EQU 38H HOUR EQU 39H TCNT EQU 3AH FLAG BIT 00H ORG 0030H...

徽县17117377949: 求基于AT89C52单片机共阴数码管0到59秒循环计时器c语言代码 -
瞿丹西维: #include<reg51.h> #include<INTRINS.h> #define u16 unsigned int #define u8 unsigned char/*********************************************************/ u8 ds[2]; //数码管显示缓存//共阴 code u8 w[]={~0x01,~0x02,~0x04,~0x08}; //位码 code u8 d[]={~0...

徽县17117377949: 修改单片机C语言程序:0~59秒计数器;1个独立按键控制,第一次按按键,实现暂停,第二次按按键,实现复位
瞿丹西维: <p>#include<reg52.h></p> <p>#include<intrins.h></p> <p>#define uint unsigned int</p> <p>#define uchar unsigned char</p> <p>sbit KEY = P3^0;</p> <p>uchar aa,num,flag;</p> <p>uchar code table[]={</p> <p> 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x...

徽县17117377949: 用51单片机设计一个秒表,计时范围从00:00 - 59:59. -
瞿丹西维: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 ...

徽县17117377949: 求高手修改单片机C语言程序:0~59秒计数器;1个独立按键控制,2个数码管显示 -
瞿丹西维: //注意;P0口要加上拉电阻 .#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char sbit KEY=P1^0; uchar aa,num,num1,flag; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,...

徽县17117377949: 用单片机的定时器及中断设计一个60秒的定时器 -
瞿丹西维: ;数码管段选接P1口,位选接P2.0和P2.1,;采用定时器T1定时10ms,60H为1s计数单元,计数100次为1s ORG 0000H ;程序从0地址开始 LJMP MAIN ;跳到MAIN处执行 ORG 001BH ;定时器T1 LJMP TIME1 ORG 0030H MAIN:MOV TMOD,#01H ;设置T1工作在模式1 MOV TH1,#068H ;赋初值,定时10ms MOV TL1,#0F0H

徽县17117377949: 求高手修改单片机C语言程序,0~59秒计时器;两个独立按键控制;最后两个数码管显示数字… -
瞿丹西维: //注意;p0口要加上拉电阻 . #include #include #define uint unsigned int #define uchar unsigned char sbit key=p1^0; uchar aa,num,num1,flag; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x...

徽县17117377949: 单片机的计算发光管以200MS间隔闪烁,数码管59秒循环计时 -
瞿丹西维: shi=num/10 ; 例如 16/10 得 shi = 1 ge=num%10 ; 16/10 得 ge= 6这两部 是进行 num的十位和个位的分离,以便 void display(uchar shi,uchar ge) 函数进行十位、个位的显示( P0=table[shi];显示十位 P0=table[ge];显示个位 )

徽县17117377949: 求一段00 - 59秒表单片机控制程序 -
瞿丹西维: #include<reg52.h>/*定时器方式:晶振为11.0592M*/ int t=0,s=0; //s 为1秒 void main() { TMOD=0x01; //设置定时器0为工作方式1 TH0=(65536-46080)/256; TL0=(65536-46080)%256; EA=1; //开总中断. ET0=1; //开定时器0中断. TR0=1; //...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网