A. 51單片機數碼管右移程序的理解問題
while(1)
{
j++;
if(j==20) //用於移動完成後顯示一段時間,這個程序上電時不會立即顯示對吧
{
j=0;
if(0==k) //K == 0時,以下程序表示在數據全部移出顯示的時候,對數碼做清零操作,以便數字能夠從左邊開始向右移動
{
for(s=0;s<8;s++) //完全循環完成後清零所有緩沖區
TempData[s]=0x00;
}
TempData[7-i]=DuanMa[k]; //把需要顯示的字元依次送緩沖區// 第一次 出來一個0,後面類推
TempData[8-i]=0x00; //不需要顯示的區域清零//由於上條語句給TempData[7]給了0的斷碼,那麼下次來的時候就要清掉,以保證只有一個數字移動。
i++;
if(i==(8-k)) //這里的不用解釋了吧,8個數碼管
{
i=0;
k++;
if(k==8)
k=0;
}
}
Display(0,8);//從第一位顯示,共顯示8位
}
B. 請教51單片機定時中斷檢測長按與短按問題-100分懸賞
首先你的程序寫的不夠合理,作為按鍵一般會使用外部中斷而不是定時中斷,外部中斷可以保證實時按鍵。
一般按鍵都是採用外部中斷,如果是在while循環裡面進行按鍵鍵值判斷,那麼在判斷之前最好加個小延時,進行按鍵去抖。
像你這個wile循環耗時很長,最適合使用外部中斷了,當然如果按鍵沒有接到外部中斷引腳,採用定時中斷也可以達到一定的效果,但是一定要把定時時間設置的短一些。
C. 問下·TX-51單片機中數碼管顯示如何移位,比如說我按鍵1在第6個根數碼管上顯示1。
其實不存在移位問題,只是一個數的顯示而已,按鍵1該數為1,銨鍵2該數為11……然後即時將該項數在數碼管中顯示。給你一個函數,作用時將一個數在第幾個數碼管中顯示。
void display(uchar firstbit,uchar Num) //firstbit為要第一位顯示數碼管,NUM是要顯示數的位數
{
uchar s;
for(s=0;s<Num;s++)
{
P0=0xff;
an=1;
an=0;
P0=table2[s+firstbit];
wei=1;
wei=0;
P0=tempdata[s];
an=1;
an=0;
delay(1);
}
}
D. 求單片機大神 寫10s的秒錶程序,用三個按鍵分別控制秒錶啟動、停止、清零(要求:使用定時器0定時,
/*-----------------------------------------------
數碼管顯示,按鍵控制秒錶
中斷按鍵控制,數碼管顯示,中斷0控制計時和停止,中斷1清零
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
unsigned int second;//定義全局變數
bit GoFlag;//定義停止,計時標志
#define DataPort P0 //定義數據埠 程序中遇到DataPort 則用P0 替換
sbit LATCH1=P2^2;//定義鎖存使能埠 段鎖存
sbit LATCH2=P2^3;// 位鎖存
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示段碼值0~9
unsigned char codedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
unsigned char TempData[8]; //存儲顯示值的全局變數
void DelayUs2x(unsigned char t);//函數聲明
void DelayMs(unsigned char t);
void Display(unsigned char FirstBit,unsigned char Num);
void Init_Timer0(void);
void CLR(void);
/*------------------------------------------------
主函數
------------------------------------------------*/
void main (void)
{
unsigned char num=0;
EX0=1; //外部中斷0開
IT0=1; //IT1=0表示邊沿觸發
EX1=1; //外部中斷1開
IT1=1; //IT1=1表示邊沿觸發
Init_Timer0();
while (1) //主循環
{
TempData[0]=dofly_DuanMa[second/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
TempData[1]=dofly_DuanMa[second%10];
//主循環中添加其他需要一直工作的程序
}
}
/*------------------------------------------------
顯示函數,用於動態掃描數碼管
輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數碼管開始顯示
如輸入0表示從第一個顯示。
Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
DataPort=0; //清空數據,防止有交替重影
LATCH1=1; //段鎖存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
LATCH2=1; //位鎖存
LATCH2=0;
DataPort=TempData[i]; //取顯示數據,段碼
LATCH1=1; //段鎖存
LATCH1=0;
i++;
if(i==Num)
i=0;
}
/*------------------------------------------------
定時器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
//TH0=0x00; //給定初值
//TL0=0x00;
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器開關打開
}
/*------------------------------------------------
定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned char num;
TH0=(65536-20000)/256; //重新賦值 20ms
TL0=(65536-20000)%256;
Display(0,8);
if(GoFlag)
{
num++;
if(num==5)
second++;//秒加1
if(second==10)
second=0;
}
}
/*------------------------------------------------
外部中斷0程序
------------------------------------------------*/
void ISR_INT0(void) interrupt 0
{
GoFlag=!GoFlag; //利用外部中斷打開和關閉定時標志 用於開始和停止計時
}
/*------------------------------------------------
外部中斷1程序
------------------------------------------------*/
void ISR_INT1(void) interrupt 2
{
if(GoFlag==0)//停止時才可以清零
CLR();
}/*------------------------------------------------
數值清零
------------------------------------------------*/
void CLR(void)
{
second=0; //利用外部中斷清零
msecond=0;
}
E. 關於單片機程序電子密碼器的問題
單片機中變數初值一般為0,最好在定義變數時,就給變數賦初值是最好的
F. 兩位秒錶 51單片機程序編程
你好:
三個警告應該是void int_initial()與void timer0_initial()前邊不用加void,然後就是Display()這個函數沒有用。
其次我想說,TMOD=0x01就行了,因為程序里邊只用到了定時器0,其他的狀態不管,甚至可以說把其他定時器關掉。,也用不著TMOD&=0xfd。
然後中斷函數要盡量精簡、短小實干、不宜過長,因為中斷本身就打擾了main函數的正常運行,而且中斷內容太多反而容易在下次中斷到來時還沒處理完,就會棧溢出。養成好的習慣,中斷就對最基本的時間計次就行,其餘的都拋給main函數吧。
EA、ET0盡量就和定時器0一起初始化,你這習慣看著別扭。可讀性略低。
中斷里不要聲明變數,你用個全局變數就OK。
希望我的回答能幫助到你。
G. 關於單片機聲光報警器程序誰給解釋一下。求高手,求高人。
觸發,報警。定時器1
H. 單片機告訴一個地址,怎樣用C語言編程讀取地址處的值
4X4鍵盤還有物理地址?
你是怎麼得到這個物理地址的呢?
-待續-
I. 單片機4*4矩陣鍵盤掃描 問題
LZ 應該把tempdata=P1; 寫在 while(1) 裡面,而不是寫在前面。
另外,如果鬆手了,P0 的燈怎麼辦?還是全亮不變?那效果就是你只能按一次,後面按的都沒反應。
搞錯,為什麼 P1又是 按鍵 又是 LED燈呢?你是什麼硬體連接啊?
J. c/c++ 單片機 硬體 驅動
這里的printf你知道51系列是怎麼樣實現的,先不管這個函數裡面的實現,首先我要告訴你調試串口的時候不要依賴於printf函數,原因是單片機中printf是通過串口去實現的跟PC上直接調用printf是有很大區別的,你這樣去調試就有問題了,通過printf函數會通過某個串口發送一串指令出去,對於你接收端的程序就有影響,而且還要依賴於printf函數裡面具體的實現,在單片機調試串口數據並需要列印的時候,很少這樣去做。你這里就是想看tempData 的值,好的辦法是,這里直接使用串口SendCharToUsart( tempData);把這個值發給電腦在電腦上顯示出這個值。