① 用51单片机制作倒计时秒表需要什么元件,麻烦列个清单。新手刚刚开始学
至少需要:
1、单片机--1
2、30p电容--2
3、12M晶振--1
4、10u电容--1
5、8.2K电阻--1
6、按钮开关--1
7、数码管组--1(4个数码管)
8、8电阻排--1
9、辅料(导线、焊锡等)
② 求用单片机设计一个秒表AT89C51
;汇编程序如下。
;使用T0定时方式1,每隔50ms中断一次,用于修改时间及显示
;使用外部中断0、1,用于控制启动和清零
;========================================================
ORG0000H
AJMPMAIN
ORG0003H
AJMPX0_INT
ORG000BH
AJMPT0_INT
ORG0013H
AJMPX1_INT
MAIN:
MOVTMOD,#01H;T0定时方式1
MOVTH0,#(65536-50000)/256;50ms@12MHz
MOVTL0,#(65536-50000)MOD256;
SETBTR0
SETBET0;开启定时中断
SETBEX0
SETBEX1
SETBEA;定时器初始化结束,下面循环显示即可
MOVR1,#99H;0~99计数.
MOVR7,#1;50ms计数.
MOVP0,#0C0H
MOVP2,#0C0H
LOOP:
SJMPLOOP
;-----------------------------------------------------------
DELAY:;延时子程序.
AA4:MOVR4,#0
DJNZR4,$
DJNZR4,$
RET
;-----------------------------------------------------------
X0_INT:;启动/停止
CPLF0
RETI
;-----------------------------------------------------------
X1_INT:;清零
MOVR1,#0
MOVP0,#0C0H
MOVP2,#0C0H
RETI
;-----------------------------------------------------------
T0_INT:;50ms中断执行一次.
MOVTL0,#(65536-50000)MOD256;
MOVTH0,#(65536-50000)/256;50ms@12MHz
DJNZR7,T0_END;中断不到20次.
MOVR7,#20
JNBF0,T0_END
MOVA,R1
ADDA,#1
DAA
MOVR1,A
ANLA,#0FH
MOVDPTR,#TAB
MOVCA,@A+DPTR;查出段码
MOVP2,A
MOVA,R1
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR;查出段码
MOVP0,A;显示十位数.
T0_END:
RETI
;-----------------------------------------------------------
TAB:
DB0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
;===========================================================
;仿真截图如下:
③ 51单片机制作一个秒表
//功能:0~99秒的简易秒表设计,两个静态数码管,定时器采用中断方式
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar count=0;//对50ms定时时间进行计数
uchar miao=0; //秒计数器
//函数名:timer_1()
//函数功能:定时器T1的中断函数,T1在工作方式1下每50秒产生中断,执行该中断函数
//形式参数:无
//返回值:无
void timer_1() interrupt 3 //T1的中断类型号为3
{
TH1=(65536-50000)/256; //重新设置T1计数初值高8位
TL1=(65536-50000)%256; //重新设置T1计数初值低8位
count++; //50ms计数器加1
if(count==20) //1s时间到
{
count=0; //50ms计数器清0
miao++; //秒计数器加1
if(miao==100)miao=0; //miao计数到100,则从0开始计数
}
}
bit b=0;
void int_0() interrupt 0
{
if(b == 0){TR1 = 0;b = 1;}
else
{
b = 0;
TR1 = 1;
}
}
void int_1() interrupt 2
{
miao=0;
count = 0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
}
//函数名:disp
//函数功能:将i的值显示在两个静态连接的数码管上
//形式参数:i,取值范围0~99
//返回值:无
void disp(uchar i)
{
uchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//定义0~9显示码,共阳极数码管
P1=led[i/10]; //显示i高位
P2=led[i%10]; //显示i地位
}
void main()
{
TMOD=0x10;//设置T1在工作方式1
TH1=(65536-50000)/256;//设置T1计数初值高8位,定时时间50ms
TL1=(65536-50000)%256;//设置T1计数初值低8位
ET1=1;//开放T1中断允许
EX0 = 1;
IT0 = 1;
EX1 = 1;
IT1=1;
EA=1;//开放总中断允许
TR1=1;//启动T1开始计时
while(1)
{
disp(miao);//显示秒计数器值
}
}
④ 利用51单片机设计一个秒表
刚做的一个现实最小是0.1秒的,给你参考吧,0.01的也做过不过已经删除了,因为最后一位现实出来几乎都看不清楚,变化太快了。
#include<reg51.h>
#define uchar unsigned char
uchar ledtab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xfe,0x3e,0x9c,0x7a,0x9e,0x8e,0x00};
uchar keyval,dat,scanled,clk;
uchar disdat[4];
void ext0(void) interrupt 0
{
keyval++;
keyval%=3;
}
void t0isr(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
clk++;
if(clk>1)
{
clk=0;
disdat[3]++;
if(disdat[3]>9)
{
disdat[3]=0;
disdat[2]++;
if(disdat[2]>9)
{
disdat[2]=0;
disdat[1]++;
if(disdat[1]>9)
{
disdat[1]=0;
disdat[0]++;
if(disdat[0]>9)disdat[0]=0;
}
}
}
}
}
void t1isr(void) interrupt 3
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P2=0x01<<scanled;
dat=ledtab[disdat[scanled]];
if((scanled==0)||(scanled==2))dat|=0x01;
P0=~dat;
scanled++;
scanled%=4;
}
main()
{
uchar i;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
keyval=2;
scanled=0;
clk=0;
IT0=1;
EX0=1;
ET0=1;
TR1=1;
ET1=1;
EA=1;
while(1)
{
switch(keyval)
{
case 0:TR0=1;break;
case 1:TR0=0;break;
case 2:for(i=0;i<4;i++)disdat[i]=0;break;
default:break;
}
}
}
⑤ 单片机 按键秒表
秒表的设计程序
用89C51,外接晶振,复位电路,二个数码管,二个按键,做一个电子秒表,具体要求为用按键起停电子表,可用按键设计倒计时时间(如10S,20S,60S),并启动倒计时功能。能用按键选择以上两功能之一。
三、程序代码:
A_BIT EQU 20H ;数码管个位数存放内存位置
B_BIT EQU 21H ;数码管十位数存放内存位置
TEMP EQU 22H ;计数器数值存放内存位置 ;开机初始化
MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
MOV P0,#0FFH;使显示时间数码管熄灭
CLR F0
CLR F1
MOV DPTR,#NUMTAB ;指定查表启始地址
;等待按键输入
;根据按键的输入判断执行什么功能;按键1按下则执行功能1
MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
MOV P0,#0FFH;使显示时间数码管熄灭
START:JB P3.6,START1;循环判断开始按钮K1是否按下?
ACALL DELAY10;延时10毫秒触点消抖
JB P3.6,START;如果是干扰就返回
JNB P3.6,$;等待按键松开
LJMP GN1 ;按键2按下则执行功能2START1: JB P3.7,START;循环判断开始按钮K2是否按下?
ACALL DELAY10;延时10毫秒触点消抖
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 ;将TEMP中的十六进制数转换成10进制
MOV B,#10 ;10进制/10=10进制
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;个位在B LCALL DPLOP1 ;插入一段判断定时过程中是否有按键输入的程序段
C1: JB P3.6,B1
ACALL DELAY10;延时10毫秒消抖
JB P3.6,C1
JNB P3.6,$;等待按键松开
CPL F0
ZT1: ; MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
JB P3.6,$;循环判断开始按钮K1是否按下?
ACALL DELAY10;延时10毫秒触点消抖
JB P3.6,ZT1;如果是干扰就返回
JNB P3.6,$;等待按键松开
LCALL DPLOP1
B1: JB P3.7,LOOP1
ACALL DELAY10;延时10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按键松开
AJMP OVERLOOP1: DJNZ R3,TIME1 ;2毫秒循环执行250次,时间约0.5秒
DJNZ R2,JS1 ;循环执行2次,时间为1 秒钟INC TEMP;满一秒钟对时间加1
MOV A,TEMP
CLR C
SUBB A,#60
JNZ GOON1;判断TEMP的数值是否为60?不为60循环
ACALL OVER
RET
GN2: MOV A,#14H ; 设定倒计时的时间20S
MOV TEMP,A;数码管显示倒计时时间的程序
;初始化
MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
MOV P0,#14H;使显示时间为设定的倒计时时间 GOON2: MOV R2,#2
JS2: MOV R3,#250
TIME2: MOV A,TEMP ;将TEMP中的十六进制数转换成10进制
MOV B,#10 ;10进制/10=10进制
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;个位在B MOV DPTR,#NUMTAB ;指定查表启始地址
DPLOP2: MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P0,A ;送出个位的7段代码
CLR P2.5 ;开个位显示
ACALL DELY1;显示1毫秒
SETB P2.5;关闭个位显示,防止鬼影
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P0,A ;送出十位的7段代码
CLR P2.6 ;开十位显示
ACALL DELY1;显示1毫秒
SETB P2.6;关闭十位显示,防止鬼影 ;插入一段判断定时过程中是否有按键输入的程序段
C2: JB P3.6,B2
ACALL DELAY10;延时10毫秒消抖
JB P3.6,C2
JNB P3.6,$;等待按键松开
ZT2: MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
JB P3.6,$;循环判断开始按钮K1是否按下?
ACALL DELAY10;延时10毫秒触点消抖
JB P3.6,ZT2;如果是干扰就返回
JNB P3.6,$;等待按键松开
B2: JB P3.7,LOOP2
ACALL DELAY10;延时10毫秒消抖
JB P3.7,B1
JNB P3.7,$;等待按键松开
AJMP OVERLOOP2: DJNZ R3,TIME2 ;2毫秒循环执行250次,时间约0.5秒
DJNZ R2,JS2 ;循环执行2次,时间为1 秒钟DEC TEMP;满一秒钟对时间减1
MOV A,TEMP
JNZ GOON2;判断TEMP的数值是否为0?不为0循环
ACALL OVER
RET
;结束定时
OVER: AJMP START;退到开机初始化状态;1毫秒延时子程序
DELY1: MOV R4,#2
D1:MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET;10毫秒延时子程序
DELAY10: MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET;实验板上的两位一体的数码管0~9各数字的显示代码
NUMTAB: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
DPLOP1: MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P0,A ;送出个位的7段代码
CLR P2.5 ;开个位显示
ACALL DELY1;显示1毫秒
SETB P2.5;关闭个位显示,防止鬼影
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P0,A ;送出十位的7段代码
CLR P2.6 ;开十位显示
ACALL DELY1;显示1毫秒
SETB P2.6;关闭十位显示,防止鬼影
RET
END
⑥ 利用51单片机设计一个秒表 (一定要按要求做到0.01秒)
最低位,是0.01s 变化一次,一秒钟,变化 100 次。
这么快,人的眼睛,分辨不出来。
只能看到一个 8。
停止时,才能看到稳定的数字。
程序如下:
#include<reg52.h>
sbit P3_5 =P3^5;
unsigned char counet, m[4] = {0,0,0,0};
void display()
{
unsigned char code Tab[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code Bit[] = {8, 4, 2, 1};
unsigned char i, j;
for (i = 0; i < 4; i++) {
P0 = Tab[m[i]]; if (i == 2) P0 &= 127;
P2 = Bit[i]; for(; j > 0; j++); P2 = 0;
}
}
void wait_key()
{
while( P3_5) display();
while(!P3_5) display();
}
main()
{
TMOD = 0x02;
IE = 0x82;
while(1) {
wait_key(); TR0 = 1; TH0 = TL0 = 6;
wait_key(); TR0 = 0;
wait_key(); m[0] = m[1] = m[2] = m[3] = 0;
}
}
void time0() interrupt 1
{
counet++;
counet %= 40;
if(!counet) {
m[0]++; m[0] %= 10;
if(!m[0]) {
m[1]++; m[1] %= 10;
if(!m[1]) {
m[2]++; m[2] %= 10;
if(!m[2]) {
m[3]++; m[3] %= 10;
}}}}
}
⑦ 单片机秒表设计
用AT89C51设计一个2位的LED数码显示作为“秒表”,这应该是一个仿真题,可用两位一体的共阴数码管,用定时器T0定时,得到1秒计时。