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