导航:首页 > 操作系统 > 单片机计时器设计

单片机计时器设计

发布时间:2022-12-17 23:21:25

‘壹’ 51单片机 秒表设计

// 51单片机 秒表,显示时间为0000—9999秒,启动、停止,(停止后再次启动复位)

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar ,shi;

uint a1,a2;

sbit D1=P3^0;

sbit D2=P3^1;

sbit D3=P3^2;

sbit D4=P3^3;

sbit key=P3^5;

sbit key1=P3^7;

bit j ;

uint y ;

void main()

{

TMOD=0x01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

EA=1;

ET0=1;

TR0=1;

=0;

shi=0;

while(1)

{

if(key==0)

{

j=0;

}

if(key1==0)

{

j=1; a2=0;

}

}

}

void timer0()interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

a1++;

y++;

if(a1==100)

{

a1=0;

if(j==1) a2++;

if(a2>=10000) a2=0;

}

D1 = 1; D2 = 1; D3 = 1; D4 = 1;

if(y==1)

{

P1=table[a2%10000/1000];

D4=0;

}

if(y==2)

{

P1=table[a2%1000/100];

D3=0;

}

if(y==3)

{

P1=table[a2%100/10];

D2=0;

}

if(y==4)

{

P1=table[a2%10];

D1=0;

y=0;

}

}

‘贰’ 利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开始每1秒钟加1。

共阳数码管中断程序:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[]=

{

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x83,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};

uint num,a;

uchar ,shi,ge;

void init();

void delay(uint);

void display(uchar,ucharshi,ucharge);

uint fb();

uint fs();

uint fg();

void main()

{

init();

while(1)

{

display(fb(),fs(),fg());

}

}

void init()

{

num=0;

a=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void display(uchar,ucharshi,ucharge)

{

P1=0xfd;

P0=table[];

delay(1);

P1=0xfb;

P0=table[shi];

delay(1);

P1=0xf7;

P0=table[ge];

delay(1);

}

void timeoff() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65526-50000)%256;

a++;

if(a%20==0)

{

num++;

if(num==999)

{

num=0;

}

}

}
void delay(uint z)
{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

uint fb()

{

=num/100;

return ;

}

uint fs()

{

shi=num%100/10;

return shi;

}

uint fg()

{

ge =num%100%10;

return ge;

}

(2)单片机计时器设计扩展阅读

2个可编程定时/计数器·5个中断源,2个优先级(52有6个)

一个全双工串行通信口

外部数据存储器寻址空间为64kB

外部程序存储器寻址空间为64kB

逻辑操作位寻址功能·双列直插40PinDIP封装

单一+5V电源供电

CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;

RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;

ROM:用以存放程序、一些原始数据和表格;

I/O口:四个8位并行I/O口,既可用作输入,也可用作输出

T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;

五个中断源的中断控制系统;

一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;

片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。

参考资料来源:网络-51单片机



‘叁’ 怎样用单片机定时器设计0到9秒的循环程序

#define uint unsigned int
#define uchar unsigned char
#include <reg52.h>
uint i;
uchar code TAB[]=[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main(void)
{
TMOD=0x22; /*定时器0设置为工作方式2,基准定时(256-6)/1M=0.25ms*/
TH0 =6; //赋T0的预置值6,溢出4000次就是1秒钟
TL0 =6;
ET0=1; //打开定时器0中断
EA=1; //打开总中断
TR0=1; //启动定时器
while(1) //程序循环
{
P3=TAB[(i)];//p3送数
}
}
//定时器0中断
void timer0(void) interrupt 1 using 1
{
static uint t; //注意t的范围,这里涉及到C51变量取值范围这个知识点
t++;
if(t==4000) //T0的预置值6,溢出4000次就是1秒钟,晶振12MHz
{
t=0;
i++;
i=i%10;
}
}

‘肆’ 单片机60秒计时器设计程序

ORG 0000H ;从地址0开始执行
JMP START ;跳转到START处
orG 000BH ;TIMER0 的中断向量
LJMP TIMER_0 ;跳转到TIMER—0
START:
MOV P0, #0FFH ;
MOV P1, #0FFH ;
MOV P2, #0FFH ;
MOV P3, #0FFH ;
MOV R4 , #40 ;R4=40
MOV IE , #10000010B ;开中断
MOV TMOD , #00000001B ;设定定时方式
MOV SP , #30H ;移开堆栈
MOV TH0, #75 ;设定定时初值
MOV TL0, #234 ;设定定时初值
NOP
NOP
MOV DPTR , #TABLE ;表首地址
MOV 50H, #0 ;50H=0
MOV 51H, #0 ;51H=0
MOV 52H, #0 ;52H=0
MOV 53H, #0 ;53H=0
NOP
NOP
SETB TR0 ;启动T0
LOOP_1:
MOV A , 50H ;A=(R0)
MOVC A, @A+DPTR ;读取数据
MOV P0,A ;把数据赋给P0口
CLR P2.7 ;打开位码
CALL DELAY
SETB P2.7 ;关闭位码
NOP
NOP
MOV A,51H ; A=(R1)
MOVC A,@A+DPTR ;读取第二位7---SEGMENT----- LED的数据
MOV P0, A ;把读取的数据送入P0口
NOP
NOP
CLR P2.6 ;打开第二个数码管的位码
CALL DELAY
SETB P2.6 ;关闭位码
MOV A, 52H ;A=(R2)
MOVC A, @A+DPTR ; 读取第三位7---SEGMENT----- LED的数据
MOV P0, A ;把读取的数据送入P0口
NOP
NOP
CLR P2.5 ;打开第三位的位码
CALL DELAY
SETB P2.5 ;关闭位码
MOV A , 53H ;A=(R3)
MOVC A , @A+DPTR ; 读取第四位7---SEGMENT----- LED的数据
MOV P0, A ;把读取的数据送入P0口
CLR P2.4 ;打开第四位的位码
CALL DELAY
SETB P2.4 ;关闭位码
NOP
NOP
JMP LOOP_1 ;跳转到LOOP-1
//*******************以下是TIMER0的中断服务子程序***********************//
TIMER_0:
PUSH PSW ;
CLR TR0 ;
DJNZ R4, NEXT ;不够一秒就继续执行
MOV A,50H ;
CJNE A, #9, LOOP_2 ;所要显示的数字是否达到9?若未达到,就跳转到LOOP-2
MOV 50H,#0 ;(50H)=0
MOV A ,51H ;A=(50H)
CJNE A,#9,LOOP_4 ; 所要显示的数字是否达到9?若未达到,就跳转到LOOP-4
MOV 51,#0 ;(51H)=0
MOV A ,52H ;A=(52H)
CJNE A,#9,LOOP_5 ; 所要显示的数字是否达到9?若未达到,就跳转到LOOP-5
MOV 52H ,#0 ;(52H)=0
MOV A ,53H ;A=(53H)
CJNE A ,#9,LOOP_6 ; 所要显示的数字是否达到9?若未达到,就跳转到LOOP-6
MOV 53H,#0 ;(53H)=0
JMP LOOP_3 ;跳转到LOOP--3
LOOP_2:
INC 50H ;50H的数据增加1
JMP LOOP_3 ;跳转到LOOP--3
LOOP_4:
INC 51H ;51H的内容增加1
JMP LOOP_3 ;跳转到LOOP--3
LOOP_5:
INC 52H ;52H的内容增加1
JMP LOOP_3 ;跳转到LOOP--3
LOOP_6:
INC 53H ;53H的内容增加1
LOOP_3:
MOV R4, #40 ;R4=40
NEXT:
MOV TH0,#75 ;设定定时初值
MOV TL0,#234 ;设定定时初值
SETB TR0 ;启动TIMER0
POP PSW ;
RETI ;返回
DELAY: ;100MS?????
MOV R7,#2
D1: MOV R6,#25
D2: DJNZ R6,D2
DJNZ R7,D1
RET
TABLE: DB 03FH,06H,5BH,4FH;
DB 66H,6DH,7DH,07H;
DB 7FH,6FH;
END; 这是以前做过的,硬件电路图找不到了,仔细看一看引脚的I/O,可以参考用的

‘伍’ 利用单片机设计59秒计时器

共阳共阴只是你在选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 ini()
{
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) {
ini(); //系统赋值初始化
KEYSCAN(); //键扫描,直到开始键按下
keyrelax(); //等键松开
ei(); //总中断允许
TMR0=0X08;
KEYSCAN(); //键扫描直到停止键按下,在键扫描时有显示
keyrelax() ; //等键松开
di(); //总中断禁止
KEYSCAN(); //键扫描到清0键按下,在键扫描时有显示
keyrelax() ; //等键松开
}
}

‘陆’ 如何用单片机汇编语言设计一个秒表

C51 http://..com/question/42921479.html?fr=qrl&cid=192&index=1

http://..com/question/29519178.html?fr=qrl&cid=192&index=2
1.基于单片机的设计
2.计时精度:百分之一秒
2.5键操作完成 清除 启动 停止 设置初值 程序退出的功能
采用LED显示时、分、秒、百分之一.PROTEL图最好也有

用89C51,外接晶振,复位电路,二个数码管,二个按键,做一个电子秒表,具体要求为用按键起停电子表,可用按键设计倒计时时间(如10S,20S,60S),并启动倒计时功能。能用按键选择以上两功能之一。
三、程序代码:
A_BIT EQU 20H
B_BIT EQU 21H
TEMP EQU 22H
MOV P3,#0FFH
MOV P0,#0FFH
CLR F0
CLR F1
MOV DPTR,#NUMTAB
MOV P3,#0FFH
MOV P0,#0FFH
START:JB P3.6,START1
ACALL DELAY10
JB P3.6,START
JNB P3.6,$
LJMP GN1
START1: JB P3.7,START
ACALL DELAY10
JB P3.7,START1
JNB P3.7,$
LJMP GN2
GN1:
S1:MOV A,#0
MOV TEMP,A
GOON1: MOV R2,#2
JS1: MOV R3,#250
TIME1: MOV A,TEMP
MOV B,#10
DIV AB
MOV B_BIT,A
MOV A_BIT,B
LCALL DPLOP1
C1: JB P3.6,B1
ACALL DELAY10
JB P3.6,C1
JNB P3.6,$
CPL F0
ZT1: ; MOV P3,#0FFH
JB P3.6,$
ACALL DELAY10
JB P3.6,ZT1
JNB P3.6,$
LCALL DPLOP1

B1: JB P3.7,LOOP1
ACALL DELAY10
JB P3.7,B1
JNB P3.7,$
AJMP OVER
LOOP1: DJNZ R3,TIME1
DJNZ R2,JS1
INC TEMP
MOV A,TEMP
CLR C
SUBB A,#60
JNZ GOON1

ACALL OVER
RET
GN2: MOV A,#14H
MOV TEMP,A
MOV P3,#0FFH
MOV P0,#14H
GOON2: MOV R2,#2
JS2: MOV R3,#250
TIME2: MOV A,TEMP
MOV B,#10
DIV AB
MOV B_BIT,A
MOV A_BIT,B
MOV DPTR,#NUMTAB
DPLOP2: MOV A,A_BIT
MOVC A,@A+DPTR
MOV P0,A

CLR P2.5
ACALL DELY1
SETB P2.5
MOV A,B_BIT
MOVC A,@A+DPTR

MOV P0,A

CLR P2.6
ACALL DELY1
SETB P2.6
C2: JB P3.6,B2
ACALL DELAY10
JB P3.6,C2
JNB P3.6,$

ZT2: MOV P3,#0FFH
JB P3.6,$
ACALL DELAY10
JB P3.6,ZT2
JNB P3.6,$

B2: JB P3.7,LOOP2
ACALL DELAY10
JB P3.7,B1
JNB P3.7,$
AJMP OVER
LOOP2: DJNZ R3,TIME2
DJNZ R2,JS2
DEC TEMP
MOV A,TEMP
JNZ GOON2
ACALL OVER
RET

OVER: AJMP START
DELY1: MOV R4,#2
D1:MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
DELAY10: MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET
NUMTAB: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
DPLOP1: MOV A,A_BIT
MOVC A,@A+DPTR
MOV P0,A

CLR P2.5
ACALL DELY1
SETB P2.5
MOV A,B_BIT
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
ACALL DELY1
SETB P2.6
RET
END

‘柒’ 用单片机设计定时器T1,工作方式2中断方式优先级为高,实现P1.0输出1khz,占空比可调的方波

#include
<reg52.h>
unsigned
char
timer1;
sbit
Tout=P1^0;
void
system_Init()
{
TMOD|=
0x21;
//
T1为方式2定时器
TH1
=
156;
//
定时初值为18,每100微秒中断一次。
TL1
=
156;
TR1
=
1;
IE
=0x8A;
//
允许T1中断
EA=1;
//
开放中断
}
void
main(void)
{
system_Init();
while(1)
{
if(timer1==5)
//
半周期500微秒
{
timer1=0;
Tout=~Tout;
//
输出求反
}
}
}
///////////////////////////////////////////
//
T1
(0.1ms)中断
///////////////////////////////////////////
void
T1zd(void)
interrupt
3
//3
为定时器1的中断号
1
定时器0的中断号
0
外部中断1
2
外部中断2
4
串口中断
{
//
TH1
=
28;
//11.0592
//
TL1
=
28;
timer1++;
}

‘捌’ 单片机计时器的设计

org 0000h
jmp main
org 000bh
jmp intt0
org 0030h
main: mov r7,#12 //初始化r7:时,r6:分,r5:秒,r4:0.05秒
mov r6,#00
mov r5,#00
clr pt0
mov tmod,#01h
mov th0,#3ch
mov tl0,#0b0h
setb ea
setb et0
setb tr0

start: mov r2,#07fh
mov a,r5
call dis

mov a,r2 //数码管移动
rr a
mov r2,a

mov a,r6 //分
call dis

mov a,r2 //数码管移动
rr a
mov r2,a

mov a,r7 //分
call dis
jmp start

intt0:
inc r4
cjne r4,#0ah,exit
mov r4,#00h
inc r5
cjne r5,#03ch,exit
mov r5,#00h
inc r6
cjne r6,#03ch,exit
mov r6,#00h
inc r7
cjne r7,#018h,exit
mov r7,#00h

exit: reti

dis: add a,#00h
da a
mov r0,a
anl a,#0fh
mov dptr,#tab
movc a,@a+dptr
mov p0,a
mov p2,r2
call delay

mov a,r2
rr a
mov r2,a

mov a,r0
anl a,#0f0h
swap a
movc a,@a+dptr
mov p0,a
mov p2,r2
call delay
mov a,r2
rr a
mov r2,a
ret

delay: mov r3,#04h
dd: mov r1,#0ffh
djnz r1 ,$
djnz r3 ,dd
ret
tab:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh
end

看看,再加上一个关于按键的程序就可以了。

阅读全文

与单片机计时器设计相关的资料

热点内容
51单片机程序单步视频 浏览:239
家庭宽带如何连接服务器 浏览:117
汽车高压泵解压 浏览:770
上门正骨用什么app 浏览:758
安卓为什么免费使用 浏览:397
加密货币都有哪些平台 浏览:625
python和matlab难度 浏览:388
python爬虫很难学么 浏览:572
小米解压积木可以组成什么呢 浏览:816
为什么滴滴出行app还能用 浏览:564
怎么升级手机android 浏览:923
php权威编程pdf 浏览:994
扣扣加密技巧 浏览:720
苹果如何创建服务器错误 浏览:497
软考初级程序员大题分值 浏览:475
js压缩视频文件 浏览:580
linux如何通过命令创建文件 浏览:991
应用加密app还能访问应用嘛 浏览:435
安卓怎么用支付宝交违章罚款 浏览:667
php面向对象的程序设计 浏览:506