㈠ 單片機c語言程序問題,LED閃爍燈的,初學單片機,希望高手能回答的通俗易懂些
void DelayMS(uint x)//這是個延時函數
{
uchar i;
while(x--)
{
for(i=120;i>0;i--); //for 語句後邊可以接分號,意思是從120自減到1
}
}
void main()
{
while(1)//死循環,延時函數中的x變為0仍然可以閃爍的原因是一直在執行,燈亮燈滅的操作
{
LED = ~LED;//亮滅燈的操作
DelayMS(150);//延時150毫秒
}
}
//while(1)死循環,一直循環執行
LED = ~LED;//亮滅燈的操作
DelayMS(150);//延時150毫秒
這兩句代碼
㈡ 匯編語言或C語言編寫一個控制燈閃爍的程序
我寫的這個程序應該可以,按一下燈亮,再按一下燈滅
#include "REG52.H"
sbit LED1_01 = P1^1; //LED燈
sbit KEY0_01 = P1^2; //按鍵
void Delay_1ms(unsigned int Time)
{
unsigned int x, y;
for(x = Time; x > 0; x--)
for(y = 120; y > 0; y--);
}
int main(void)
{
LED1_01 = 1; //打開LED燈點亮
while(1)
{
if(KEY0_01 == 0) //檢測按鍵是否按下
{
Delay_1ms(10); //延時去抖動
if(KEY0_01 == 0) //確定按鍵按下
{
LED1_01 = ~ LED1_01; //取反LED燈 [ 亮 . 滅 ] }
while(KEY0_01 == 0); //檢測鬆手
}
}
}
你的圖里有A/D轉換器
AD轉換函數ADC_DIS.C
#include <REGX51.H>
#include"def.h"
#include"lib.h"
sbit adc_cs=P1^0;
sbit adc_rd=P1^1;
sbit adc_wr=P1^2;
/***ADC0804啟動轉換函數***/
INT8U start_ad()
{
INT8U
temp;
adc_cs=0;
adc_wr=1;
delay(1);
adc_wr=0;
delay(1);
adc_wr=1;
delay(1); //啟動AD
adc_rd=1;
delay(1);
adc_rd=0;
delay(1);
temp=P2;
delay(1);
adc_rd=1;
delay(1);
//讀取數據
return
temp;
}
用這個程序。
㈢ PIC12F629幫我用C語言寫個程序,控制三個LED亮滅!
/******************************************************************************
*IC:PIC12F629OSC:片內4MHz
*****************************************************************************/
#include<pic.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineLED1GPIO0
#defineLED2GPIO1
#defineLED3GPIO2
#defineKEYGPIO4
/******************************************************************************
*晶元配置字
*****************************************************************************/
__CONFIG(FOSC_INTRCIO&WDTE_ON&PWRTE_ON&MCLRE_OFF&BOREN_ON);
/******************************************************************************
*函數及變數聲明
*****************************************************************************/
voidinterruptISR(void);//中斷處理
voidflash();//LED12Hz閃爍函數
uinttime=0;//延時用變數
ucharcnt=0;//記錄按鍵被按下幾次
/******************************************************************************
*主函數
*****************************************************************************/
voidmain()
{
//選項寄存器
OPTION_REG=0x0F;/*GPIO上拉使能
*GP2/INT埠電平下降沿觸發中斷
*TIMER0時鍾源選擇內部時鍾
*TIMER0在GP2/TOCKI電平上升沿遞增
*預分頻器分配給WDT
*PS2:PS0=111WDT分頻比1:128
*/
//中斷控制寄存器
INTCON=0xC0;/*全局中斷使能
*外設中斷使能
*TMR0溢出中斷禁止
*GP2/INT外部中斷禁止
*埠電平變化中斷禁止
*TMR0中斷標志T0IF清零
*INT中斷標志INTF清零
*電平變化中斷標志GPIF清零
*/
//中斷標志位寄存器
PIR1=0x00;/*EEPROM寫操作完成中斷標志位EEIF清零
*bit6-4位未用
*比較器中斷標志位CMIF清零
*bit1未用
*TMR1溢出中斷標志位TMR1IF清零
*/
//電源控制寄存器
PCON=0x00;/*bit7-2未用
*上電復位標志位清零
*欠壓復位標志位清零
*/
//IO埠輸入輸出配置
CMCON=0x07;//關閉模擬比較器,使GP<2:0>為數字IO
TRISIO=0x38;//GP<5:3>輸入GP<2:0>輸出
GPIO=0x3F;//GP<2:0>輸出高電平
WPU=0x30;//GP<5:4>內部弱上拉開啟
IOC=0x30;//GP<5:4>埠電平變化中斷使能
//Timer1控制
TMR1H=0x3C;//使TMR1溢出時間為50000個周期(50ms)
TMR1L=0xB0;
PIE1=0x01;//TMR1IE計時器1溢出中斷使能
T1CON=0x01;//TMR1ON使能Timer1
//主循環
while(1)
{
if(KEY==0)//如果按鍵按下
{
time=0;
while(!KEY);//等待按鍵被松開,由中斷函數計數
if(time<60)//按下時間不足50ms*60=3000毫秒
{
cnt++;//按鍵次數加1,改變工作狀態
if(cnt>3)
{
cnt=0;
}
}
elseif(time>=60&&time<100)//按住時間3秒到5秒之間
{
LED2=!LED2;//LED2亮滅狀態翻轉
}
elseif(time>=100)//按住時間達到5秒
{
LED3=!LED3;//LED3亮滅狀態翻轉
}
}
switch(cnt)//檢測按鍵按下次數
{
case0:LED1=1;break;//LED1熄滅
case1:LED1=!LED1;break;//LED1低亮
case2:LED1=0;break;//LED1高亮
case3:flash();break;//LED1閃爍
default:break;
}
}
}
/******************************************************************************
*中斷處理函數
*****************************************************************************/
voidinterruptISR(void)
{
if(TMR1IE&&TMR1IF)//定時器1溢出中斷
{
asm("CLRWDT");//定時喂狗
++time;//延時計數
TMR1H=0x3C;//重設TIMER1初始值使TMR1溢出時間為50000個時鍾周期
TMR1L=0xB0;
TMR1IF=0;//定時器1溢出中斷標志位清零
}
}
/******************************************************************************
*LED1閃爍函數
*****************************************************************************/
voidflash()
{
time=0;
if(time%4==0)
{
LED1=!LED1;
}
}
㈣ 一個51單片機,晶振為12MHz,讓前三個LED燈分別以1ms,1s,5s的頻率閃爍,怎麼用c語言寫,謝謝各位了~~
LED1 1ms閃爍人眼分辨不出來 定時器設定為16位定時50ms 另設一變數作定時器中斷計數,到10(0.5S)的倍數時LED2取反,到50(2.5S)的倍數時LED3取反
#include<reg52.h>
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
unsigned int count;
void main()
{
TMOD=0x01; //定時器0,工作方式1
TH0=(65536-500)/256; /////////0.5ms
TL0=(65536-500)%256;
EA=1;
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
}
void time0() interrupt 1
{
led1=~led1;
count++;
if (!(count%1000)) {led2=~led2;}
if (count==5000) {led3=~led3;count=0;}
}
led1是看不出閃爍的 太快了
㈤ 用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--);
}
(5)c語言3個led燈閃爍擴展閱讀:
單片機應用分類:
通用型:
這是按單片機(Microcontrollers)適用范圍來區分的。例如,80C51式通用型單片機,它不是為某種專門用途設計的;專用型單片機是針對一類產品甚至某一個產品設計生產的,例如為了滿足電子體溫計的要求,在片內集成ADC介面等功能的溫度測量控制電路。
匯流排型:
這是按單片機(Microcontrollers)是否提供並行匯流排來區分的。匯流排型單片機普遍設置有並行地址匯流排、 數據匯流排、控制匯流排,這些引腳用以擴展並行外圍器件都可通過串列口與單片機連接。
另外,許多單片機已把所需要的外圍器件及外設介面集成一片內,因此在許多情況下可以不要並行擴展匯流排,大大減省封裝成本和晶元體積,這類單片機稱為非匯流排型單片機。
控制型:
這是按照單片機(Microcontrollers)大致應用的領域進行區分的。一般而言,工控型定址范圍大,運算能力強;用於家電的單片機多為專用型。
通常是小封裝、低價格,外圍器件和外設介面集成度高。 顯然,上述分類並不是惟一的和嚴格的。例如,80C51類單片機既是通用型又是匯流排型,還可以作工控用。
參考資料來源:網路-單片機
㈥ 求51單片機C語言,一個板子上完成一部分三個開關分別控制三個led燈光亮滅(不是流水燈),
#include<reg51.h>
sbitled1=P1^0;
sbitled2=P1^1;
sbitled3=P1^2;
sbitkey1=P1^4;
sbitkey2=P1^5;
sbitkey3=P1^6;
main()
{
while(1)
{
led1=key1;
led2=key2;
led3=key3;
}
}
㈦ 誰有單片機中3個led燈閃爍控制的流程圖與匯編語言,c語言程序
可以用外部中斷計數,來實現流水燈的正轉、暫停、以及反轉和爆閃。。這是我前幾天寫的一個這樣的程序,樓主可以結合protues 畫圖模擬,注意程序中所用到的IO埠就行了。
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
uchara,b;
voiddelay(ucharz)
{
uchari,j,k;
for(i=z;i>0;i--)
for(k=20;k>0;k--)
for(j=110;j>0;j--);
}
voidbegain()
{
EA=1;
EX0=1;
IT0=1;
}
voidmain()
{a=b=0;
P0=0xfe;
begain();
while(1)
{
if(a==1)
{
P0=_crol_(P0,1);
delay(50);
}
if(a==3)
{
P0=_cror_(P0,1);
delay(50);
}
if(a==4)
{
P0=0x00;
delay(50);
P0=0xff;
delay(50);
P0=0xfc;
}
if(a==5)
{
a=1;
}
}
}
voidint0()interrupt0
{
a++;
if(a==5)
{
a=1;
}
}
㈧ 用c語言編寫單片機按鍵控制多個led燈閃爍。按一次全亮,再按次全滅;長按5s流水燈模式,再按滅。
你可以簡單地認為單片機只能輸出5V或者0V的電壓 分別對應1和0,那麼LED燈的另一端接地或者接5V,如果你 的單片機輸出5V接到LED燈,LED燈另一端接地 , 那就產生電壓了,電路就導通了,燈就亮了 ,反之也是這個道理。時間方面可以寫大致的延時,或者用定時器,這樣就比較精確了,你學會了這個就可以說入門了。
㈨ 用C語言編寫一個單片機控制LED燈閃爍三次的程序,急求!
# P1上接LED等。
#include "reg51.h"
void delayms(unsigned int x)
{
int i,j;
for(i=x;i>0;i--)
for(j=0;j<120;j++);
}
void main(void)
{
char i;
for(i=0;i<6;i++)
{
P1 = ~P1;
delayms(1000);
}
while(1);
}
㈩ 用c語言編程三個按鍵對應點亮三個LED燈的程序,AT89S52單片機,最好有原理圖,謝謝。急求
這個也求?用按鍵點亮LED燈這個是51入門最基礎的東西,真心想學的話,買塊51的開發板,都帶有常式,很快就可以入門的。建議你還是多看看資料把基礎的東西學好。推薦你看一下《十天學會單片機和C語言編程》的視頻教程對入門還是不錯的。
三路搶答器提供你編程思路(按鍵掃描方式)參考,程序還是要根據你的硬體電路自己編寫。
埠配置:
1、選擇4個埠作為輸入埠連接按鍵(獨立按鍵,按鍵一端接單片機埠,另一端接地)。 三路為搶答的按鍵KEY1、KEY2、KEY3,一路為搶答後復位按鍵KEY0。
2、選擇3個埠作為輸出埠連接LED燈(高電平點亮還是低電平點亮要看你電路設計)對應為LED1、LED2、LED3。
編程思路:
1、初始設置一個搶答鍵按下與否的位標志變數:bit flag = 0;(沒有搶答按鍵按下flag = 0,有搶答按鍵按下flag = 1)。
2、主程序按鍵掃描循環。
3、按鍵按下程序KEY1、KEY2、KEY3基本相同。以KEY1為列:
首先判斷是否有搶答鍵按下(KEY1==0),如有搶答按鍵按下,延時10ms(消抖),再判斷是否KEY1==0,如果KEY1==0說明KEY1搶答按鍵已經按下,然後再判斷是否flag = =0,如果flag = =0,則點亮LED1(其他按鍵按下的話點亮相應的LED燈)、按鍵按下標志置「1」(flag = 1)。
4、復位按鍵程序判斷KEY0按下並且flag = =1時,關閉所有LED燈、按鍵按下標志復位置「0」(flag = 0)。