『壹』 51單片機定時器T1中斷使數碼管計數0—F,每秒加1,想要將if()函數寫到main()函數中,如何實現。
把初始化程序 Timer1Init(); 放在while(1) 的上面,你現在這樣,每次循環都初始化了,就永遠也不計數了 。另外,開機是顯示8,是因為,開機P0口全為1,要過1秒後開始從0開始顯示,可以在while(1)上面加一行 P0=0x3f; 這樣,開機就顯示0了。另外,這種定時1秒,定時器最好定時長點,如50ms ,你現在是定時1ms ,這中斷頻率太高了,如果有其它程序就會影響主程序的執行。
還有,if 語句下面的
if(i==1000)
{
//TR1=0;//要這行,就計數一遍就停了,要不停地計數就要刪掉
i=0;
P0=smgan[n++];
if(n==16) n=0;
}
『貳』 單片機編程錯誤
#include"reg52.h"
typedefunsignedcharu8;
typedefunsignedintu16;
sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;
sfrGPIO_KEY=0x90;
sfrGPIO_DIG=0x80;
u16KeyValue;
u8codesmgan[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
voiddelay(u16i)
{
while(i--);
}
voidKeyDown()
{
u8a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
delay(1000);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0x0f;
switch(GPIO_KEY)
{
case(0x07):KeyValue=0;break;
case(0x0b):KeyValue=1;break;
case(0x0d):KeyValue=2;break;
case(0x0e):KeyValue=3;break;
}
GPIO_KEY=0xf0;
switch(GPIO_KEY)
{
case(0x70):KeyValue=KeyValue;break;
case(0xb0):KeyValue=KeyValue+4;break;
case(0xd0):KeyValue=KeyValue+8;break;
case(0xe0):KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0))
{
delay(1000);
a++;
}
}
}
}
voidmain()
{
LSA=0;
LSB=0;
LSC=0;
while(1)
{
KeyDown();
GPIO_DIG=smgan[KeyValue];
}
}
『叄』 如何用單片機做一個簡單的倒計時器
我已經完成了,下面是電路圖和實際效果,你也試試,程序已經調試完成了!!!是使用秒錶程序改編完成的,喜歡的話,點一個贊吧!希望能幫到你!!!
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//顯示0~F的值
u8 ssec=100,sec=60,min=04;
u8 DisplayData[8];
sbit beep=P1^5;
unsigned long counter=0;
unsigned int c=0;
sbit p15=P1^5;
bit p;
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數 名 : Timer0Init
* 函數功能 : 定時器0初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0Init()
{
TMOD=0X11;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0=0Xd8; //給定時器賦初值,定時10ms
TL0=0Xf0;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器 -->啟動定時器中斷!
ET1=1;
TR1=1;
TH1=(65536-250)/256; //FC
TL1=(65536-250)%256;
}
/*******************************************************************************
* 函 數 名 : DigDisplay
* 函數功能 : 數碼管動態掃描函數,循環掃描8個數碼管顯示
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
P0=DisplayData[i];//發送段碼
delay(100); //間隔一段時間掃描
P0=0x00;//消隱-->撤銷選中;
}
}
void datapros()
{
DisplayData[0]=smgan[ssec%10];
DisplayData[1]=smgan[ssec/10];
DisplayData[2]=0x40;
DisplayData[3]=smgan[sec%10];
DisplayData[4]=smgan[sec/10];
DisplayData[5]=0x40;
DisplayData[6]=smgan[min%10];
DisplayData[7]=smgan[min/10];
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
Timer0Init(); //定時器0初始化
while(1)
{
datapros();
DigDisplay();
}
}
/*******************************************************************************
* 函 數 名 : void Timer0() interrupt 1
* 函數功能 : 定時器0中斷函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0() interrupt 1
{
TH0=0Xd8; //給定時器賦初值,定時10ms
TL0=0Xf0;
ssec--;
if(ssec==00) //1s
{
ssec=100;
sec--;
if(sec==00)
{
sec=60;
min--;
if(min==-1)
{
P1=1;
ssec=0;sec=0;min=0;
TR0=0;
}
}
}
}
void Timer1() interrupt 3
{
TH1=(65536-250)/256; //FC
TL1=(65536-250)%256;
if(p!=1) p15=~p15;
if(p==1) p15=0;
c++;
if(c==250)
{
//c=0;
p=~p;
}
if(c>=250&&1695);
if(c==1696) c=0;
}
『肆』 單片機p0=~smgan[0]是什麼意思
應該是大寫的字母,P0=~smgan[0]。這是從P0口輸出數字0的段碼,smgan[ i ],是程序前定義過的段碼表。但是,原理圖中或模擬圖中的數碼管類型與段碼表不符,兩者正相反。例如,數碼管是共陽的,而段碼表是共陰的,所以,從P0口輸出段碼之前要先取反,~ 符號是8位數都取反的意思。請及時採納。
『伍』 單片機編程里的smgan lednum password keycode 一般定義什麼
匯編語言和keil c語言!keil c實際上就是c語言,只不過裡面有些特殊定義,區別很小的,如果你c好的話建議你直接學keilc,匯編編起來比較復雜,代碼多,但是他也有c不具備的優勢,就是可以自己定義空間,把每個單元都用到極致,這點很重要尤其是你的系統比較大,內存比較緊張的時候就不能讓系統自動分配地址。但是不論哪種語言你都要對硬體有所了解,了解內部結構及工作流程,
『陸』 單片機延時函數
因為第二個延時時間太長導致數碼管刷新頻率太低
『柒』 51單片機開發模板製作溫度顯示按鍵控速風扇,程序編好,按鍵功能實現不了,求大神門幫忙看看,感謝,感謝
首先你這程序有問題,這四行不屬於任何的子程序,編譯都出錯。
DisplayData[1] = smgan[temp / 10000];
DisplayData[2] = smgan[temp % 10000 / 1000];
DisplayData[3] = smgan[temp % 1000 / 100] | 0x80;
DisplayData[4] = smgan[temp % 100 / 10];DisplayData[5] = smgan[temp % 10];
把這四行改正後,編譯後模擬運行程序,3個按鍵是起作用的。你感覺不起作用,是因為那3個按鍵,就是改變 flag 分別為0,1,2。可是,主程序中根據 flag 值不同,執行的卻是同一個動作,都是 moto=1; (稍稍有一點區別,只是你感覺不出來)所以,按什麼鍵都是這個動作,按不按都 一樣,當然那就會覺得按鍵不起作用。那3個按鍵控制的動作要有區別呀,或者動作區別要大,才能看出來按鍵起作用啦。最簡單,直接的方法是,按住按鍵不鬆手,看數碼管是不是全滅啦,如果全滅了,說明按鍵就是起作用的。
『捌』 單片機編程的問題。C141錯誤
smgan[15]。。你定義數組說有15個元素,而你[ ]內填寫的卻是16個元素,這樣必然是不對的。
smgan[15]中這15是指數組有多少的元素,並非是實際數組從smgan[0]、smgan[1]開始的那個元素標識值。。
u8 code smgan[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};
如果需要全部元素應該寫成:
u8 code smgan[16]=(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};
另外,數組定義數值可以前面不填寫成默認。u8 code smgan[]={n,n+1,n+2..}(定義時候後面要用花括弧)
仔細看c語言基礎書本上的例句,然後再編寫。。學習就是從簡單的會了,然後再逐漸擴展到難的,也就是不感覺多難了。。急於求成會挫傷自身自信和學習興趣的,真正智者所不取。