❶ 用C語言編寫一個單片機控制LED燈閃爍變化的編程 急用!!!!!!!!!
C語言實現LED燈閃爍控制配套51單片機開發板。
#include //包含單片機寄存器的頭文件
/****************************************
函數功能:延時一段時間
*****************************************/
void delay(void) //兩個void意思分別為無需返回值,沒有參數傳遞。
{
unsigned int i; //定義無符號整數,最大取值范圍65535。
for(i=0;i<20000;i++) //做20000次空循環。
; //什麼也不做,等待一個機器周期。
}
/*******************************************************
函數功能:主函數 (C語言規定必須有也只能有1個主函數)。
********************************************************/
void main(void)
{
while(1) //無限循環。
{
P0=0xfe; //P1=1111 1110B, P0.0輸出低電平。
delay(); //延時一段時間。
P0=0xff; //P1=1111 1111B, P0.0輸出高電平。
delay(); //延時一段時間。
}
}
單片機驅動LED燈的源程序:
#include<reg52.h> //頭文件。
#define uint unsigned int
#define uchar unsigned char
sbit LED1=P1^7; //位定義。
void delay_ms(uint);//mS級帶參數延時函數。
void main()
{
while(1)
{
LED1=0;
delay_ms(1000);
LED1=1;
delay_ms(1000);
}
}
void delay_ms(uint z) //延時子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
(1)延時器開關燈單片機程序擴展閱讀:
單片機應用分類:
通用型:
這是按單片機(Microcontrollers)適用范圍來區分的。例如,80C51式通用型單片機,它不是為某種專門用途設計的;專用型單片機是針對一類產品甚至某一個產品設計生產的,例如為了滿足電子體溫計的要求,在片內集成ADC介面等功能的溫度測量控制電路。
匯流排型:
這是按單片機(Microcontrollers)是否提供並行匯流排來區分的。匯流排型單片機普遍設置有並行地址匯流排、 數據匯流排、控制匯流排,這些引腳用以擴展並行外圍器件都可通過串列口與單片機連接。
另外,許多單片機已把所需要的外圍器件及外設介面集成一片內,因此在許多情況下可以不要並行擴展匯流排,大大減省封裝成本和晶元體積,這類單片機稱為非匯流排型單片機。
控制型:
這是按照單片機(Microcontrollers)大致應用的領域進行區分的。一般而言,工控型定址范圍大,運算能力強;用於家電的單片機多為專用型。
通常是小封裝、低價格,外圍器件和外設介面集成度高。 顯然,上述分類並不是惟一的和嚴格的。例如,80C51類單片機既是通用型又是匯流排型,還可以作工控用。
參考資料來源:網路-單片機
❷ 51單片機如何用一個定時器當多個延時電路用, 就是按下開關一 ,亮三秒。 按下開關二,燈泡亮五秒。
沒想法就不會有創新,你的想法就很好。像這種亮燈的程序,對時間要求不是那麼嚴格(如果極其嚴格就沒法實現),那麼可以採用如下方法實現你的要求:
//假設晶振12MHZ,按鍵輸入P1.0,P1.1,P1.2;LED控制P2.0,P2.1,P2.2,都是低電平有效
#include "reg51.h"
unsigned int YSJS1=0;
unsigned int YSJS2=0;
unsigned int YSJS3=0;
sbit KEY1=P1^0;按鍵
sbit KEY2=P1^1;按鍵
sbit KEY3=P1^2;按鍵
sbit LED1=P2^0;燈
sbit LED2=P2^1;燈
sbit LED3=P2^2;燈
void Timer1Init(void) //500微秒@12.000MHz
{
AUXR &= 0xBF; //定時器時鍾12T模式
TMOD &= 0x0F; //設置定時器模式
TMOD |= 0x10; //設置定時器模式
TL1 = 0x0C; //設置定時初值
TH1 = 0xFE; //設置定時初值
TF1 = 0; //清除TF1標志
ET1 = 1; //使能定時器1中斷
TR1=1; //定時器1開始計時
EA =1; //開總中斷
}
void main(void)
{
LED1=1;
LED2=1;
LED3=1;
KEY1=1;
KEY2=1;
KEY3=1;
Timer1Init()
while(1)
{
if(KEY1==0)
{
YSJS=6000;
LED1=0;
}
if(KEY2==0)
{
YSJS=10000;
LED2=0;
}
if(KEY3==0)
{
YSJS=16000;
LED3=0;
}
}
}
void TIMER1(void) interrupt 3 //定時器1中斷函數使用默認寄存器組
{
TH1 = 0XFE; //定時器1定時時間=500us
TL1 = 0X0C;
if(YSJS1!=0)
{
YSJS1--;
}
else LED1=1;
if(YSJS2!=0)
{
YSJS2--;
}
else LED2=1;
if(YSJS2!=0)
{
YSJS2--;
}
else LED2=1;
}
❸ 單片機流水燈C語言程序(8個燈,依次點亮每個燈,延時500MS)
單片機流水燈C語言程序的源代碼如下:
#include //51系列單片機定義文件
#define uchar unsigned char //定義無符號字元
#define uint unsigned int //定義無符號整數
void delay(uint); //聲明延時函數
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++) //8個流水燈逐個閃動
{
P1=~temp;
delay(100); //調用延時函數
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++) //8個流水燈反向逐個閃動
{
P1=~temp;
delay(100); //調用延時函數
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++) //8個流水燈依次全部點亮
{
P1=temp;
delay(100); //調用延時函數
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++) //8個流水燈依次反向全部點亮
{
P1=temp;
delay(100); //調用延時函數
temp>>=1;
}
void delay(uint t) //定義延時函數
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
(3)延時器開關燈單片機程序擴展閱讀
51單片機流水燈的源代碼如下
#include<reg51.h>
#include<intrins.h>
voiddelay(inta)
{
inti;
while(a--)for(i=0;i<110;i++);
}
main()
{
inti;
while(1)
{
P0=0xfe;
for(i=0;i<8;i++)
{
P0=_crol_(P0,1);
delay(500);
}
}
}
❹ 想讓單片機控制定時器延時閃爍,但是燈卻一直亮著,沒有達到要的效果(用c語言控制的)
delay()實現裡面不能用if來判斷TF0,因為程序運行到這時定時計數器還在計數,TH0還沒有溢出,TF0還是0;所以你要用個while(!TF0);讓程序在這等一下,等到TH0溢出,這時TF0被硬體自動置1,while(!TF0)循環結束,程序繼續往下走,這時令TR0=0,關閉定時器。delay()運行完總共延時也就是50毫秒。以方式0為例():
❺ 怎樣用單片機做一個簡單的流水燈
單片機流水燈代碼:#include<reg51.h>//51頭文件void delay(int t)//定義延時函數{int j;while(t--){for(j=0;j<500;j++);}}void main(){int i;while(1){for(i=0;i<7;i++)//循環點亮LED,到第7個LED延時一會就結束循環。
在這個單片機流水燈代碼中,假設使用的是8051單片機。需要定義8個LED燈,分別連接到P1埠的不同引腳上。然後使用一個循環結構來控制這8個LED燈按照一定的順序逐個亮起,形成流水燈的效果。
具體來說,使用for循環來控制LED燈的亮滅順序。在每次循環中,通過給P1埠賦值來控制LED燈的亮滅狀態。例如,給P1埠賦值為0x01,那麼第一個LED燈就會亮起,其他LED燈則熄滅。然後使用delay函數來延遲一段時間,以便觀察到LED燈的亮滅變化。接著再給P1埠賦值為0x02,第二個LED燈就會亮起,其他LED燈則熄滅。以此類推,直到最後一個LED燈亮起為止。
最後,我們需要在程序中定義delay函數,以便實現LED燈的亮滅延遲。這個函數可以通過使用while循環來實現,需要注意的是,在實際應用中,需要根據不同的單片機型號和硬體環境來進行相應的調整和修改。
單片機流水燈的定義
單片機流水燈是一種常見的電子裝置,通過單片機控制多個LED燈以一定的順序逐個亮起,形成流水般的效果。其原理是通過編寫程序來控制單片機的輸出埠,從而控制LED燈的亮滅狀態。在實際應用中,可以使用不同的單片機型號和開發環境來實現流水燈功能,具體的實現方法會因硬體環境和軟體工具的不同而有所差異。
一般來說,實現流水燈功能需要以下步驟:首先確定單片機型號和開發環境,並熟悉指令集和寄存器配置。然後確定LED燈的連接方式,並編寫程序來控制LED燈的亮滅狀態。最後在程序中添加延時函數來實現LED燈的亮滅延遲。在編寫程序時,需要注意語法錯誤和邏輯錯誤,並進行測試和調試,以確保程序能夠正確運行並實現預期的流水燈效果。
❻ 需要一個C語言程序。51單片機控制:按鍵按一下,延遲1分鍾後開燈,燈亮半個小時就熄滅的程序急需!
如果對時間要求不精確,用軟延時即可。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit s=P1^0;
sbit led=P1^1;
void delayms(uint i) //1ms延時程序
{
uchar j;
for(;i>0;i--)
{
for(j=0;j<125;j++)//如果延時時間誤差較大,可按比例改變125這個數
//取值范圍0-255,數值越大,延時越長
{;}
}
}
void delay1s(uint i) //1s延時程序
{
for(;i>0;i--){delay1ms(1000);}
}
void main()
{
led=0;
while(1)
{
if (s==0)
{
delayms(20);
if (s==0);{delay1s(60);led=1; }
}
if(led==1){delay1s(1800);led=0; }
}
}
如果對時間要求精確,則要用到定時器,還要確保電路外接有晶振,並已知晶振頻率
❼ 單片機編程,控制LED延時亮滅的程序,
#include<reg51.h>
#include<INTRINS.h>
#defineu16unsignedint
#defineu8unsignedchar
#definePin00x01
#definePin10x02
#definePin20x04
#definePin30x08
#definePin40x10
#definePin50x20
#definePin60x40
#definePin70x80
sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
sbitled4=P1^4;
sbitled5=P1^5;
sbitkg1=P3^1;
sbitkey2=P3^2;
sbitkey3=P3^3;
/****************************************/
voidinit() //初始化函數
{TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
}
/////////////////////////
u8s(){//掃描按鍵
staticu8ms;
u8t=0;
// if(key1==0)t|=Pin1;
if(key2==0)t|=Pin2;
if(key3==0)t|=Pin3;
if(t!=0x00){
if(ms<100)ms++;
if(ms==5){
returnt;
}
}elsems=0;
return0x00;
}
///////////////////////
typedefstruct{
u16time;//n毫秒後
u8l; //亮的燈
u8m; //滅的燈
}ledcmd;
#defineLED_CMD_SIZE10
codeledcmdlcmd[]={
{0,Pin2,0},//0s後led2亮
{500,Pin4,0,},//0.5s後led4亮
{1000,0,Pin4},//1s後led4滅
{300,Pin3,0,},
{300,Pin4,0,},
{1000,0,Pin4,},
{300,0,Pin2,},
{200,Pin5,0,},
{40,0,Pin5|Pin3},
{500,0,Pin1},
};
voidled_l(u8v){//亮燈程序
P1=P1&(~v);
}
voidled_m(u8v){//滅燈程序
P1=P1|(v);
}
u8ledzt=0xff;//led任務zt為0xff表示待機
u16ledjs;//倒計時
voidled_start(){//啟動程序
ledzt=0;
ledjs=lcmd[ledzt].time;
}
voidledcx(){//led流程程序
if(ledzt<LED_CMD_SIZE){
if((ledjs==0)&&(ledzt<LED_CMD_SIZE)){//計時到0
ledzt++;
if(ledzt!=LED_CMD_SIZE){
ledjs=lcmd[ledzt].time;
}
}
if(ledzt>1){//
led_l(lcmd[ledzt-1].l);
led_m(lcmd[ledzt-1].m);
}
}
}
/***********************************/
voidmain()//主函數
{
u8k;
init();//系統初始化
TR0=1;//定時器開始計時
while(1){
if(ledzt==0xff){led1=(kg1!=0);};//led不在運行狀態時根據開關改變led1
k=s();//讀取按鍵值
if((k&Pin2)!=0){//key2
if(led1==0&&ledzt==0xff){
led_start();
}
}
if((k&Pin3)!=0){//key3
ledzt=0xff;
led_m(Pin2|Pin4);
}
ledcx();
}
}
/****************************/
voidtimer0()interrupt1//1ms定時器
{
TH0=(65536-1000)/256;//重載初值
TL0=(65536-1000)%256;
if(ledjs>0)ledjs--;
}
❽ 單片機間隔點亮一led燈的C語言程序
以下是一個單片機間隔點亮一LED燈的C語言程序,以8051單片機為例:
c
Copy code
#include
//包含了AT89C51的寄存器定義
void delay(unsigned int xms) //延時函數,xms為要延時的毫秒數
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void main()
{
P1=0x00; //將P1口全部置為0,防止其它引腳影響
while(1)
{
P1=0xff; //點亮P1口第0個引腳上的LED燈友念行,0xff為二進制的11111111
delay(1000); //延時1秒
P1=0x00; //將P1口全部置好嘩為0,熄滅LED燈
delay(1000); //延時1秒
}
}
上述程序的作用是在單片機的P1口上間隔高遲點亮一盞LED燈,每隔1秒鍾燈的狀態會發生一次變化,即由點亮狀態變為熄滅狀態,再由熄滅狀態變為點亮狀態。