
代碼
#include<reg51.h>
bit int_flag; //定時器0,1S到標志位
unsigned char volatile T0Count; //定時器0的中斷次數
unsigned char volatile T1Count;
unsigned char code table[] //定時器1的中斷次數
={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //顯示段碼值為123456789
unsigned char code temp[] = {0xfe,0xfd,0xfb,0xf7}; //數碼管選通
unsigned long sum; //1S內脈沖總個數
unsigned char Led[4]; //Led顯示快取
void delay(unsigned int num ){ //軟體延時
while(--num); //定時器0初始化
}
void init(void){
TMOD=0x51; //T1定時器0作業于方式1,定時器1計數
TH0=(65536-50000)/256; //定時50ms
TL0=(65536-50000)%256;
TH1=0x00;
TL1=0x00;
}
void disp(void){ //數碼顯示
unsigned char i;
for(i=0;i<4;i++)
{
P2=temp[i];//片選
P0=table[Led[i]]; //取資料顯示
delay(100); //延時1毫秒
}
}
void main(void){
EA=1; //開總中斷
init(); //初始化定時器
TR0=1; //定時器開始作業
TR1=1;
ET1=1; //開T0中斷
ET0=1;
while(1){
if(int_flag==1){
int_flag=0;
sum=TL1+TH1*256+T1Count*65536; //計算1S內脈沖個數
//將資料格式化,轉化成可顯示的BCD碼
Led[3]=sum%10000/1000;//顯示千位
Led[2]=sum%1000/100;//顯示百位
Led[1]=sum%100/10;//顯示十位
Led[0]=sum%10;//顯示個位
T0Count=0x00;
T1Count=0;
TH1=0x00;
TL1=0x00;
TR1=1;
}
disp();
}
}
void int_t0(void) interrupt 1{
TH0=(65535-50000)/256;
TL0=(65536-50000)%256;
T0Count++;
if(T0Count==20){
TR1=0;
int_flag=1;
T0Count=0x00;
}
}
void int_T1(void) interrupt 3{
T1Count++;
}
uj5u.com熱心網友回復:
delay(100); //延時1毫秒調整到255試看
uj5u.com熱心網友回復:
不行啊 還是仿真的時候不能亮
uj5u.com熱心網友回復:
你看是不是程式有問題啊
uj5u.com熱心網友回復:
查找程式問題也是分部分除錯判斷的,先要除錯的就是數碼顯示,那是人和機器溝通的視窗,你先送固定數值去顯示看是否正常uj5u.com熱心網友回復:
數碼管那個是低電平有效但是我的那個資料口是高電平怎么回事
uj5u.com熱心網友回復:
是要該程式嗎 具體怎么做啊我這剛開始不太會
uj5u.com熱心網友回復:
假如你不是想自己學,那么你這帖子底部多的是相關內容的鏈接,隨便找個能用的代碼就是了.uj5u.com熱心網友回復:
主函式內送一個值去數碼顯示陳述句不會?!uj5u.com熱心網友回復:
不是我是想知道這個那錯了我想把他弄好
uj5u.com熱心網友回復:
void main(void){ Led[0]=1;Led[1]=2;Led[2]=3;Led[3]=4;disp();}uj5u.com熱心網友回復:

亮了但是沒有數
uj5u.com熱心網友回復:
先顯示了4321然后又變成了0000
uj5u.com熱心網友回復:
很好,先顯示了4321然后又變成了0000,知其所以然?把代碼放進主回圈內試看void main(void){ Led[0]=1;Led[1]=2;Led[2]=3;Led[3]=4;while(1){disp();}}
uj5u.com熱心網友回復:
這次能夠保持4321一直亮了
uj5u.com熱心網友回復:
我把那個Led[0]=1;Led[1]=2;Led[2]=3;Led[3]=4給清除了然后我外部加了一個頻率但是顯示0000測不出來
uj5u.com熱心網友回復:
這2次的程式除錯,你應該明白2次結果的原因是什么,調好了顯示,接下來除錯先給sum賦值:sum=1234;然后除錯下面陳述句是否正常
Led[3]=sum%10000/1000;//顯示千位
Led[2]=sum%1000/100;//顯示百位
Led[1]=sum%100/10;//顯示十位
Led[0]=sum%10;//顯示個位
uj5u.com熱心網友回復:
可以沒有問題可以顯示1234
uj5u.com熱心網友回復:
接下去的除錯就看你自己的了,提示一下:while(1){
if(int_flag==1){
int_flag=0;
sum=TL1+TH1*256+T1Count*65536; //計算1S內脈沖個數
//將資料格式化,轉化成可顯示的BCD碼
Led[3]=sum%10000/1000;//顯示千位
Led[2]=sum%1000/100;//顯示百位
Led[1]=sum%100/10;//顯示十位
Led[0]=sum%10;//顯示個位
T0Count=0x00;
T1Count=0;
TH1=0x00;////////////////////////
TL1=0x00;////////////////////////定時器賦值為何要放在主回圈內?什么目的,值又代表什么?
TR1=1;
}
disp();
}
uj5u.com熱心網友回復:
我把那個TH1=0XFF TL1=0XFF然后 sum=TL1+TH1*256+T1Count*65536然后算了一下是65535然后顯示的是5535和下面Led那個對照著就是5535
uj5u.com熱心網友回復:
你明白各陳述句作用就好,自己逐步除錯去轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/118507.html
標籤:單片機/工控
上一篇:MATLAB gui pid
