導航:首頁 > 操作系統 > 59秒定時器單片機實驗

59秒定時器單片機實驗

發布時間:2022-07-29 07:32:32

單片機59秒計數器程序求大佬註解

#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
uchartab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//數碼管共陰極段碼
uchardata_L,data_H;
uchart,a;
sbitLSA=P2^2;//這是3-8解碼器的輸入信號
sbitLSB=P2^3;
sbitLSC=P2^4;
/****************************************/
voiddelay(uintk)//延時k毫秒
{
uintm,n;
for(m=0;m<k;m++)
{
for(n=0;n<120;n++);
}
}
/****************************************/
voiddisplay(void)//顯示子程序
{
LSC=0,LSB=0,LSA=1;//第二位位碼
P0=tab[data_H];//第二位段碼
delay(1);
LSC=0,LSB=0,LSA=0;//第一位位碼
P0=tab[data_L];//第一位段碼
delay(1);
}
/****************************************/
voidTimer0(void)
{
if(TF0==1)//如果T0溢出
{
t++;//變數t加1
TH0=0x3C;//重賦初值
TL0=0xB0;
TF0=0;
}
}
/****************************************/
voiddata_tim(void)
{
Timer0();//調用定時器延時子程序
if(t==20)//如果延時1秒時間到
{
a++;//變數a加1
t=0;//t復位為0
if(a==60)//如果1分到
{a=0;}//清0
}
}
/****************************************/
voiddata_in(void)
{
data_L=a%10;//將分鍾分成十位和各位
data_H=a/10;
}
/****************************************/
voidT0_init(void)
{
TMOD=0x01;//定時器0位模式1
TH0=0x3C;//定時時間50毫秒
TL0=0xB0;
ET0=0;//不允許定時器0中斷
TR0=1;//啟動定時器0
EA=0;//不允許中斷
}
/****************************************/
voidmain(void)
{
a=0;
T0_init();//初始化定時器
while(1)
{
data_tim();//調用定時器延時函數
data_in();//轉換顯示數據
display();//顯示
}
}

❷ 利用單片機內部定時器設計一個秒錶,顯示最大值為 59.99 秒。

#include<reg51.h>
#include<INTRINS.h>
#defineu16unsignedint
#defineu8unsignedchar

#definePin0 0x01
#definePin1 0x02
#definePin2 0x04
#definePin3 0x08
#definePin4 0x10
#definePin5 0x20
#definePin6 0x40
#definePin7 0x80sbitk1=P3^3;
sbitk2=P3^4;
sbitk3=P3^5;


#defineK1 Pin0
#defineK2 Pin1
#defineK3 Pin2


u8key=0xff;//消抖後的有效按鍵值
u8key_down=0x00;//按鍵下降沿掃描結果,1有效
u8key_up=0x00; //上升沿掃描結果,1有效
u8key_sc=0xff;//上次掃描的按鍵值

//按鍵掃描程序
voidscanKey(){
staticu8temp0;
staticu8ms;
u8temp=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;
}
u8readPIN(u8port,u8pin){
return((port&pin)==0?0:1);
}


u8ds[4];//數碼管顯示緩存
codeu8w[]={0x01,0x02,0x04,0x08,}; //位碼
codeu8d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//斷碼
codeu8dand[]={0xff,0x7f,0xff,0xff};
voiddispaly(){//顯示函數
staticu8a;
a++;
if(a>3)a=0;
P0=0xff;
P2=w[a];
P0=d[ds[a]]&dand[a];
}


voidTimer0Init(void) //1毫秒@11.0592MHz
{
AUXR&=0x7F; //定時器時鍾12T模式
TMOD&=0xF0; //設置定時器模式
TMOD|=0x01; //設置定時器模式
TL0=0x66; //設置定時初值
TH0=0xFC; //設置定時初值
TF0=0; //清除TF0標志
TR0=1; //定時器0開始計時
}
voidinit() //初始化函數
{Timer0Init();

}

u16js_ms=0;
u8flag=0;
u16count=0;
voidmain()//主函數
{
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;
}
}

}voidtimer0()interrupt1//定時器,實現倒計時
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
dispaly();
if(++js_ms>=10&&flag!=0){
js_ms=0;
if(count<5999)count++;
}
}

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

❹ 如何用單片機c語言弄數碼管59分59秒倒計時顯示和初始化數值顯示0000

使用一個4位數碼管,然後動態掃描顯示,你可以直接用兩個變數分別表示分和秒,然後上電的時候變數為0就可以了

❺ 實現1~59秒的動態LED 循環顯示 單片機89c51的程序 急急急!!!!!!

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit cs1=P2^0; //段
sbit cs2=P2^1; //位
sbit wr =P2^2; //使能
uchar num =0; //T0計時
uchar mark=0; //顯示數碼管標志
uchar time[2]; //顯示時間暫存
uchar code col_table[]={0xfe,0xfd}; //數碼管的第一位和第二位
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
}; //共陽極數碼管數字0-9的段碼
/*-----1ms延時函數-----*/
void Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
/*-----主函數-----*/
void main()
{
TMOD=0x01; //定時器工作在方式0
TH0=(65536-50000)/256; //裝初值
TL0=(65536-50000)%256; //裝初值
EA =1; //開總中斷
ET0=1; //允許T0中斷
TR0=1; //開T0

while(1) //死循環
{
P0=table[time[mark]]; //顯示段數據
cs1=0;
wr =0;
wr =1;
cs1=1;

P0=col_table[mark]; //顯示位數據
cs2=0;
wr =0;
wr =1;
cs2=1;
Delay(1); //延時1ms
mark++; //第一位和第二位間切換達到動態掃描顯示
if(mark==2) mark=0;
}
}
/*-----T0-----*/
void Timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;

num++;
if(num==2)
{
num=0;
time[0]++;
if(time[0]==10)
{
time[0]=0;
time[1]++;
if(time[1]==6) time[1]=0;
}
}
}

剛給你寫的,你自己看看吧,希望對你有幫助~~~

❻ 單片機00-59秒計時器(利用軟體延時)C語言源程序

哥,你這是在學單片機么?學單片機數組裡面是什麼東西你都看不出來嗎?那分明是共陰極數碼管顯示從0到9的CODE表啊。你沒看把數組裡面的數一個求除一個求余送到兩個埠了嗎?那兩個埠一定是數碼管的,你這程序問題好多啊,送給數碼管也不能用匯流排的形式操作啊。再說,你要定時這段程序也太繁瑣了,完全可以減少一半的代碼。而且我沒聽說誰定時還用delay()的,都用定時器中斷定時,那樣才會精準。好好學吧,單片機以後還是有發展的,多看看書,以後這些問題提出來會被人笑的。

❼ 修改單片機C語言程序:0~59秒計數器;1個獨立按鍵控制,第一次按按鍵,實現暫停,第二次按按鍵,實現復位

#include<reg52.h>

#include<intrins.h>

#defineuintunsignedint

#defineucharunsignedchar

sbitKEY=P3^0;

ucharaa,num,flag;

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

voiddelay(uintms)

{

uchart;

while(ms--)for(t=0;t<123;t++);

}

voidmain()

{

num=0;

aa=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

ET0=1;

EA=1;

P0=table[0];

P2=table[0];

while(1){

if(!KEY){

delay(10);

if(!KEY){

while(!KEY);

flag++;

if(flag==1)TR0=0;

if(flag==2){

P0=table[0];

P2=table[0];

flag=0;

aa=0;

num=0;

TR0=1;

}}}}

}

voidtimer0()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

aa++;

if(aa==20){

aa=0;

num++;

if(num==60)num=0;

P0=table[num/10];

P2=table[num%10];

}

}

模擬實驗截圖如下:

❽ 51單片機實驗(關於定時器計數器)

6mz的晶振 可算出一個時鍾周期為2微秒,200毫秒去除一下2微秒就是10000,然後吧10000取16進制為 27A0 ,用 FFFF減27A0再加1 得 C860,用定時方式一,TL0 ,#60H
TH0, #C8H

❾ 單片機程序 0-59s循環跑秒定時器 定時器值通過P1口連接8個LED燈顯示出來

給你個思路,用
定時器中斷
,然後計算中斷時間,對變數進行計數,當等於一秒的時候,送給
數碼管
顯示,依次累加,同時送給
LED燈
,就可以看到效果了

❿ AT89c51單片機程序控制兩個數碼管顯示00-59秒錶的程序要怎麼編啊

display(second)子函數與兩個數碼管的連接方式有關
void main(void )//主程序
{
TMOD=0x01;// 定時器1工作方式一
ET0=1;
EA=1;
TH0=(65536-10000)/256;//定時10ms
TL0=(65536-10000)%256;
TR0=0;//上電先不啟動
while(1)
{
if(key1==0)//判斷按鍵是否按下
{
Delay1ms(10);//延時消抖
if(key1==0)
{
while(key1==0);//等待按鍵抬起
TR0=!TR0;//啟動或停止
}
}
if(key2==0&&TR0==0)//判斷按鍵是否按下及是否在走時
{
Delay1ms(10);//延時消抖
if(key2==0)
{
while(key2==0);//等待按鍵抬起
a=0; second=0;
}
}
display(second);
}

}
//中斷子程序
void Timer0(void) interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a++;
if(a==100 ) second++;
if(second==60) second=0;
}

閱讀全文

與59秒定時器單片機實驗相關的資料

熱點內容
phpsae源碼 瀏覽:853
為什麼安卓手機一直要許可權 瀏覽:227
匯編程序的偽指令 瀏覽:803
蘋果7怎麼更新app 瀏覽:318
c語言常用演算法pdf 瀏覽:960
編程如何讓畫面動起來 瀏覽:865
大齡女程序員未來發展 瀏覽:976
數學書籍pdf 瀏覽:506
加密門禁卡寫入成功無法開門 瀏覽:464
齒輪傳動pdf 瀏覽:52
alpinelinux 瀏覽:150
手機端app的掃碼功能在哪裡 瀏覽:227
少兒編程中小班英語教案 瀏覽:452
鎖屏密碼加密手機怎麼解除 瀏覽:205
linuxlostfound 瀏覽:135
征途伺服器ip地址 瀏覽:330
git提交代碼命令行 瀏覽:165
什麼叫瀏覽器伺服器結構 瀏覽:157
於謙聊天哪個app 瀏覽:449
小鵬汽車nlp演算法工程師薪資 瀏覽:881