導航:首頁 > 操作系統 > 單片機簡易秒計數器設計

單片機簡易秒計數器設計

發布時間:2023-07-08 19:18:15

1. 單片機秒錶設計

用AT89C51設計一個2位的LED數碼顯示作為「秒錶」,這應該是一個模擬題,可用兩位一體的共陰數碼管,用定時器T0定時,得到1秒計時。

2. 51單片機的秒錶計時器設計,求大神幫忙設計電路圖和C語言程序!!

這個程序可以實現秒的計時,按鍵控制開始、暫停、清零功能,更多功能自己在看清程序的基礎上進行改進。

#include <reg51.H>
sbit P3_5 =P3^5;
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00};
unsigned char second;
unsigned char keycnt;
unsigned int tcnt;

void main(void)
{
unsigned char i,j;

TMOD=0x02;
ET0=1;
EA=1;
second=0;
P1=dispcode[second/10];
P2=dispcode[second%10];
while(1)
{
if(P3_5==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(P3_5==0)
{
keycnt++;
switch(keycnt)
{
case 1:
TH0=0x06;
TL0=0x06;
TR0=1;
break;
case 2:
TR0=0;
break;
case 3:
keycnt=0;
second=0;
P1=dispcode[second/10];
P2=dispcode[second%10];
break;
}
while(P3_5==0);
}
}
}
}

void t0(void) interrupt 1 using 0
{
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==100)
{
second=0;
}
P1=dispcode[second/10];
P2=dispcode[second%10];
}
}

3. 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);//顯示秒計數器值
}
}

4. 利用51單片機和3位數碼管實現10分鍾內的簡易計時器

修改如下:
#include<reg51.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbitkey1=P2^7;
sbitkey2=P2^6;
sbitweiH=P3^0;
sbitweiM=P3^1;
sbitweiL=P3^2;
uintnum=0,ge=0,shi=0,fen=0,k;//num用來計數,ge為各位顯示,shi為十位顯示,fen為分鍾顯示

voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=110;j>0;j--);
}

ucharkey1scan(void)
{if(key1==0)
{delayms(10);
if(key1==0)
{while(!key1);
return1;
}
return0;
}

ucharkey2scan(void)
{if(key2==0)
{delayms(10);
if(key2==0)
{while(!key2);
return1;
}
}
return0;
}

voidshowtime()interrupt1//時間顯示
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num++;
num%=3;
switch(num)
{
case0:
weiL=1;//顯示秒的個位
P1=0xff;
P1=table[ge];
delayms(5);
weiL=0;
break;
case1:
weiM=1;//顯示秒的十位
P1=0xff;
P1=table[shi];
delayms(5);
weiM=0;
break;
case2:
weiH=1;//顯示分鍾,只顯示0-9
P1=0xff;
P1=table[fen];
delayms(5);
weiH=0;
break;
}

voidmain()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
num=0;
while(1)
{
if((key1scan()==1)&&(key2scan()!=1))break;//按鍵1按下,按鍵2未按下開始計時
}
while(1)
{
delay(1000);
ge++;
if(ge>9)
{
ge=0;
shi++
if(shi>5)
{
fen++;
if(fen>9)fen=0;
}
}
showtime();
}
}

5. 利用單片機設計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() ; //等鍵松開
}
}

6. 51單片機十秒簡易計時器

因為樓主說,(不要太大面積修改)。
所以,就沒有敢進行大面積的修改。

只簡單的改改,未必能好用,僅供參考:

#include<reg51.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};

sbit key1=P2^7;
sbit key2=P2^6;
sbit weiH=P3^0;
sbit weiM=P3^1;
sbit weiL=P3^2;

uint num=0,ge=0,shi=0,fen=0,k;
//num用來計數,ge為各位顯示,shi為十位顯示,fen為分鍾顯示

void delayms(uint xms) //i=xms即延時約xms毫秒
{
uint i,j;
for(i=xms;i>0;i--) for(j=110;j>0;j--);
}

uchar key1scan()
{
if(key1==0) {
delayms(10);
if(key1==0) {
while(!key1) showtime();//等待釋放期間,也進行顯示
return 1;
}
}
return 0;//添上了返回值
}

uchar key2scan()
{
if(key2==0) {
delayms(10);
if(key2==0) {
while(!key2) showtime();
return 1;
}
}
return 0;//添上了返回值
}

void showtime() //時間顯示
{

//這里去掉了while(1) ,避免了死循環

P1=0xff; weiL=1; P1=table[ge]; delayms(5); weiL=0;//顯示秒的個位
P1=0xff; weiM=1; P1=table[shi]; delayms(5); weiM=0;//顯示秒的十位
P1=0xff; weiH=1; P1=table[fen]; delayms(5); weiH=0;//顯示分鍾,
}

7. 51單片機完成簡易秒錶的設計

硬體電路簡單,我說下軟體部分
用一個定時器定時中斷做鍵盤掃描,數碼管用動態掃描的方法,數碼管顯示和按鍵處理都放在主程序中進行

8. 單片機60秒計時器的程序,用AT89C51實現

//1:用AT89C51單片機的定時/計數器T0產生一秒的
//定時時間,作為秒計數時間,當一秒產生時,秒
//計數加1,秒計數到60時,自動從0開始。單片機
//晶振頻率為12MHZ
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};
void display(uchar fen,uchar miao);
uchar a,fen,miao,shu;
void delay(uint z);
void init();
void main()
{
init();
while(1)
{
display(fen,miao);
}

}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)
{
a=0;
shu++;
fen=shu/10;
miao=shu%10;
if(shu==60)
shu=0;
}

}

void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(uchar fen,uchar miao)
{
P1=0xFe;
P2=table[fen];
delay(5);//延時5毫秒

P1=0xFf;
P2=table[miao];
delay(5);//延時5毫秒
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

閱讀全文

與單片機簡易秒計數器設計相關的資料

熱點內容
英雄聯盟神魔怎麼綁定伺服器 瀏覽:978
音樂app怎麼換音質 瀏覽:974
python進階客戶流失 瀏覽:280
華為榮耀10伺服器地址 瀏覽:998
javastring相等判斷 瀏覽:411
程序員考研究生學校 瀏覽:935
java卡頓 瀏覽:500
編程軟體怎麼運行zip文件 瀏覽:505
單片機怎麼做組態 瀏覽:899
android參考文獻外文 瀏覽:684
銅電極電流效率的演算法 瀏覽:142
簡訊內存已滿怎麼處理安卓 瀏覽:312
ogg命令 瀏覽:784
南昌程序員最新消息 瀏覽:151
藍牙編程入門書籍 瀏覽:763
單片機秒錶實驗 瀏覽:411
小米3文件夾設置 瀏覽:566
手動添加dns伺服器加什麼數字 瀏覽:563
單片機中三位數碼管原件 瀏覽:141
pdf可以刪除其中一頁 瀏覽:217