標題:
想做一個時間累加,到60后,清零的單片機程序,兩位數時候出錯
[打印本頁]
作者:
shuai帥
時間:
2019-3-18 21:09
標題:
想做一個時間累加,到60后,清零的單片機程序,兩位數時候出錯
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LED1=P1^0;
sbit wela=P2^6;
sbit dula=P2^7;
//void delayms(uint);
uchar num,shi,num,ge,num1;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71}; //顯示0~F的十六進制的數;0 1 2 3 4 5 6 7 8 9
void delayms(uint xms) //延時函數
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar shi, uchar ge)
{
dula=1;
P1=0xfe;
dula=0;
wela=1;
P0=table[shi]; //位選
wela=0;
delayms(5);
dula=1;
P1=0xfd;
dula=0;
wela=1;
P0=table[ge];
wela=0;
}
void main()
{
TMOD=0x01;
TH0=(65535-45872)/256; //付初值
TL0=(65535-45872)%256;
EA=1; //打開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0中斷
while(1) //等待中斷開啟
{
display(shi,ge);
}
}
void T0_time() interrupt 1 //方式1
{
TH0=(65535-45872)/256; //付初值
TL0=(65535-45872)%256;
num++;
if(num==20)
{
num=0;
num1++;
if(num1==9)
{
num1=0;
}
shi=num1/10;
ge=shi;
}
}
作者:
shuai帥
時間:
2019-3-18 21:12
代碼可以實現一位累加,但是兩位數時候,累加總出現顯示錯誤,不知道什么原因,求解答
作者:
niehaitao
時間:
2019-3-19 09:57
這是我學中斷時候寫的,你參考一下,這個程序在51HEL開發(fā)板驗證過的,數碼管從0到59累加后歸零,歸零的時候蜂鳴器響一聲,希望可以幫到您
#include<reg52.h> //52系列單片機頭文件
#include<math.h>
#define uint unsigned int//宏定義
#define uchar unsigned char//宏定義
sbit DUAN=P2^6; //74HC573的LE端 U1 數碼管LED的段選端
sbit WEI=P2^7; //74HC573的LE端 U1 數碼管LED的位選端
sbit LED8=P2^4;
sbit FG=P2^2; //蜂鳴器和繼電器的控制端
uchar num,num2,shi,ge;
uint num1;
void delayms(uint); //聲明延時子函數
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //共陰顯示字庫
void display(uchar,uchar);
void main() //主函數
{
TMOD=0x11; //設置定時器0和1為工作方式1(0001 0001)
TH0=(65536-45872)/256; //裝初值
TL0=(65536-45872)%256;
TH1=(65536-45872)/256; //裝初值
TL1=(65536-45872)%256;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
ET1=1; //開定時器1中斷
TR0=1; //啟動定時器0
TR1=1; //啟動定時器1
while(1) //程序在這里不停的對數碼管動態(tài)掃描同時等待中斷發(fā)生
{
display(shi,ge);
}
}
void display(uchar shi,uchar ge) //顯示子函數
{
DUAN=1; //打開段選
P0=table[shi]; //送段選數據
DUAN=0; //段選鎖定
P0=0xff; //送位選數據前關閉所有顯示,防止打開位選鎖存時原來段選數據通過位選鎖存器造成混亂
WEI=1; //打開位選
P0=0xfe; //送位選數據
WEI=0; //位選鎖定
delayms(5); //延時
DUAN=1; //打開段選
P0=table[ge]; //送段選數據
DUAN=0; //段選鎖定
P0=0xff; //送位選數據前關閉所有顯示,防止打開位選鎖存時原來段選數據通過位選鎖存器造成混亂
WEI=1; //打開位選
P0=0xfd; //送位選數據
WEI=0; //位選鎖定
delayms(5); //延時
}
void delayms(uint xms) //延時子函數
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--); //i=xms即延時約xms毫秒
}
void T0_time()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256; //重裝初值
num1++;
if(num1==1200) //如果到了1200次,說明60秒時間到
{
num1=0; //然后把num1清0重新再計1200次
FG=~FG; //讓蜂鳴器狀態(tài)取反
delayms(100);
FG=~FG;
}
}
void T1_time() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256; //重裝初值
num2++;
if(num2==20) //如果到了20次,說明1秒時間到
{
num2=0; //然后把num2清0重新再計20次
num++;
if(num==60) //這個數用來送數碼管顯示,到60后歸0
num=0;
shi=num/10; //把一個二位數分離后分別送數碼管顯示
ge=num%10; //十位和個位
}
}
作者:
zhb2004xp
時間:
2019-3-19 11:11
你的程序應該是50ms中斷累加,1S計數每秒+1,你的程序
if(num1==9)
{
num1=0;
}
shi=num1/10;
ge=shi;
}
這里不對的,你要顯示的是num1的值,按照你的設想就應該num1到60再進行清零,你這里到9就清零了。應該是if(num1==60),這樣才能顯示0~59
作者:
wulin
時間:
2019-3-19 12:54
你的中斷程序和顯示程序都有問題,給你改好了,你試試。
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LED1=P1^0;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num,num1,shi,ge;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71}; //顯示0~F的十六進制的數;0 1 2 3 4 5 6 7 8 9
void delayms(uint xms) //延時函數
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar i)
{
P0=0xfe;//送十位位碼
wela=1;
wela=0;
P0=table[i/10];//送十位段碼
dula=1;
dula=0;
delayms(2);
P0=0xfd;//送十位段碼
wela=1;
wela=0;
P0=table[i%10];//送個位段碼
dula=1;
dula=0;
delayms(2);
}
void main()
{
TMOD=0x01;
TH0=(65536-45872)/256; //賦初值
TL0=(65536-45872)%256;
EA=1; //打開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0中斷
while(1) //等待中斷開啟
{
display(num1);
}
}
void T0_time() interrupt 1 //方式1
{
TH0=(65536-45872)/256; //賦初值
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
LED1=~LED1;//LED閃爍
num1++;
if(num1==60)
{
num1=0;
}
}
}
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1