① 求用c語言編程實現51單片機的LED燈移動
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,b,c,d;
void delay()
{
uint i;
for(i=0;i<200;i++)
}
void anjian()
{
if(P1^0==0)
{
delay();
if(P1^0==0)
a=1;
}
if(P1^1==0)
{
delay();
if(P1^1==0)
b=1;
}
if(P1^2==0)
{
delay();
if(P1^2==0)
c=1;
}
if(P1^3==0)
{
delay();
if(P1^3==0)
d=1;
}
}
void main()
{
while(1)
{
anjian();
if(a==1)
....... //io口做相應的處理,這里你具體沒說明,我都不知道怎麼寫了
if(b==1)
.......
if(c==1)
.......
if(d==1)
.......
}
}
② 求通過一個開關的通斷實現兩種功能的切換,C語言程序,主程序應該如何設計
給你個沒有按鍵百的,按鍵程序自己加上就行了
#include <reg51.h>
void main()
{
unsigned int i = 0; //定義循環變數i,用於軟體延時度
unsigned char cnt = 0; //定義計數變數cnt,用於移位控制
while (1) //主循環,程序無限循環執行該循環體語句
{
P0 = ~回(0x01 << cnt); //P0等於1左移cnt位,控制8個LED
for (i=0; i<20000; i++); //軟體延時
cnt++; //移位計數變數自加1
if (cnt >= 8) //移位計數超過7後,再重新答從0開始
{
cnt = 0;
}
}
}
③ 用c語言一個開關控制兩個燈開關閉合燈1亮燈2滅開關打開燈1滅燈2亮
開關控制的話就不用編程語言了好嗎,因為開關是直接的物理連接,通過電路實現就好,那我就理解成你是想用單片機來實現吧,首先單片機與外設怎樣連接我不考慮,因為你沒說。那麼我就當是我可以隨意的使用單片機的輸出吧,然後開關閉合理解成按鍵是高電平,再按一次取反。
#include<89c51.h>//是不是這個頭文件記不清了。。
#defineuintunsignedint
#defineucharunsignedchar
#defineLED1P1_0
#defineLED2P1_1
#defineKEY1P0_1
/*函數聲明,延遲函數,LED燈初始化函數,按鍵KEY初始化,按鍵KEY查詢函數*/
voidDelayMs(uintn);
voidLEDInit(void);
voidKEYInit(void);
ucharKEYScan(void);
/*主函數*/
voidmain()
{
LED1=0;
LED2信襲碼=1;//不同的接法可能導致結果不一樣,有的高電平亮有的低電平
while(1)//具體看你自己的板子怎麼接的
{
if(KEYScan())
LED1=~LED1;
LED2=~LED2;
}
}
/*檢測按鍵狀態*/
ucharKEYScan(void)
{
if(KEY1==0)
DelayMs(100);//延時一段時間,以免抖動
禪宏if(KEY1==0)
{
滑哪DelayMs(100);
while(KEY1==0);
return1;
}
else
return0;
}
/*延遲函數*/
voidDelayMs(uintn)
{
inti;
while(n--)
{
for(i=587;i>0;i--);
}
}
以上代碼是做CC2530實驗的時候做的,修改了一下。
④ C語言:開關燈
#include"stdio.h"
intmain(intargc,char*argv[]){
charlmp[5001];
inti,j,N,M;
printf("PleaseenterN&M(int0<N<5001,0<M<=N)... ");
if(scanf("%d%d",&N,&M)!=2||N<1||N>5000||M<1||M>N){//保證輸入的N,M符合要求,否則退出
printf("Inputerror,exit... ");
return0;
}
for(i=1;i<=N;lmp[i++]=1);//N盞燈全開啟(原始狀態)
for(i=1;i<=M;i++)//遍歷M個人
for(j=1;j<=N;lmp[j++]^=!(j%i));//每個人把與自己編號成整數倍的燈作相反操作
for(j=0,i=1;i<=N;i++)//輸出,從編號小至大遍歷所有燈
if(!lmp[i])//輸出已被關閉的燈的編號
printf(j++?",%d":"%d",i);
printf(" ");
return0;
}
運行樣例:
⑤ 請按照如下下降沿/上升沿觸發時序圖寫一段C語言程序
電子的課程我幾乎全忘了,我翻了翻書,我當初學51單片機串口通信,用的是匯編。
我當初用C語言寫51單片機代碼的時候,編譯變成機器代碼,但是keil編輯器可以把機器代碼轉成助記符,就是匯編。我看了之後發現一條C語言代碼會翻譯成多條匯編,如果是循環,翻譯成匯編就會更復雜,所以用C語言寫51單片機代碼,代碼運行時間會更長,時間不能自己掌握,因為我不知道翻譯成多少條匯編了。所以51單片機還是要用匯編寫比較好。
我也不知道為什麼你會直接用C語言寫時序圖,我只是覺得用匯編會簡單點。
⑥ 用c語言來控制一個輕觸開關,那種開關是按下去是閉合的,但是一鬆手開關就斷開了。
這個開關如果不是總電源的話,還是很容易實現的,比如,你可以定義個全局變數,初始值為0,然後單片機檢測按鍵是否按下,按下則對這個變數取如坦慎反,然後判斷這個渣敬是否為0xff(定義開啟電機的值為0xff),是那就開啟電機,否則關閉;如信散果這個開關時總電源的開關的話,則有點麻煩,需要有硬體的支持。
⑦ c語言 用邊沿觸發使流水燈暫停,按鈕控制,按一下暫停,按一下繼續
#include<reg52.h> //引用庫文件
void delay() //延時函數
{
unsigned char i,j; //定義兩個變數,用於空循環
for(i=0;i<200;i++)
for(j=0;j<200;j++)
;
}
unsigned char flag;
void main()
{
unsigned char i;
flag=1;
EA=1; //開放總中斷
EX0=1; //允許使用外中斷
橘衫橋IT0=1; //選擇負跳變來觸發外中斷
while(1) //用於反復循環
{
for(i=0;i<8;i++)
{
P1=~(1<<i);
delay(); //調用延時函數
while(flag!=1);
}
i=0;
//
}
}
/**************************************************************
函數功能:外中斷T0的中斷服務程序
**************************************************************/
void int0(void) interrupt 0 using 0 //外中斷0的中斷編圓猛號為0
{
flag=~flag;
}
模擬圖:
樓主的採納率好低啊(時間久了,估計塌嘩給你回答的人會變少),不過我還是希望樓主能採納
⑧ 幫我看看這段程序為什麼編譯時錯誤,求高手幫我改下啊。修改後可以用的話我會追加分的。謝謝啦。
#include<reg51.h>
#define LEDData P0
unsigned char code LEDCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char time=99;
unsigned char second,count,count1; //秒,計數器
sbit LEDH = P2^6; //高位陰極
sbit LEDL = P2^7; //低位陰極
sbit buzzer = P2^5; //蜂鳴器
sbit Alam=P3^6;
bit Over = 0; //倒計時到0標志
void buzzer1(void);
void Delay5ms(void)
{
unsigned int i;
for(i=1000;i>0;i--);
}
void DisplayTime(void)
{
LEDData=LEDCode[second/10];
LEDH=0;
Delay5ms();
LEDH=1;
LEDData=LEDCode[second%10];
LEDL=0;
Delay5ms();
LEDL=1;
}
//******************************主函數*************************************************
void main(void)
{
TMOD=0x11; //兩個8為計數器
TL0=0xb0; //兩個8位定時計數器
TH0=0x3c; //兩個8位定時計時器
TL1=0xb0; //作計數器
TH1=0x3c; //作寄存器
second=time;
EA=1; //總中斷打開
ET0=1; //定時器0中斷打開
ET1=1; //定時器1中斷打開
TR0=0; //定時器0開關關閉
TR1=0; //定時器1開關關閉
EX0=1; //外部中斷0開
IT0=1; //邊沿觸發
IT1=1; //邊沿觸發
EX1=1; //外部中斷1開
PX0=1; //外部中斷0為高優先順序控制圓塵明位
PX1=1; //外部中斷1為高優先順序控制位
PT0=0; //定兄則時/ 計數器T0為低優先順序中斷
while(1)
{
DisplayTime();
if(Over)
{ //
buzzer1();//();/延時一會兒buzzer();延時一會兒buzzer();延時一會兒
}
}
}
void PxInt0(void) interrupt 0
{
if(Over==1)
{
second=time;
Over=0;
TR1=0; //定時器1開關關閉
Alam=1;
TH1=0x3C; //作寄存器
TL1=0xB0; //作計時器
}
else
{
second=second;
}
TR0=1; //--------------開啟計時器
}
void PxInt1(void) interrupt 2
{
TR0=0; //--------------關閉計時器
}
//*********************************中斷服務函數**************************************
void time0_int(void) interrupt 1
{
TL0=0xb0; //計時器
TH0=0x3c; //寄存器
TR0=1; //開啟計時器
count++;
if(count==20)
{
count=0;
second--;
if(second==0)
{
second=0;
Over=1;
TR0=0; //定時器橘告0關閉
TR1=1; //定時器1打開
}
}
}
//*********************************中斷服務函數**************************************
void time1_int(void) interrupt 3
{
TL1=0xb0; //計時器
TH1=0x3c; //寄存器
TR1=1; //定時器1打開
count1++;
if(count1==10)
{
count1=0;
Alam=~Alam;
buzzer1();//();調用響一聲函數
}
}
//*********************************響一聲函數**************************************
void buzzer1(void)
{
unsigned int b,c;
for(b=60;b>0;b--)
{ for(c=3;c>0;c--)
buzzer=!buzzer; //將蜂鳴器控制端取反
}
}
⑨ 單片機C語言中,設外中斷為邊沿觸發, 高級中斷 編寫中斷初始化main的函數
這是單片機c語言中斷函數的編程拆缺格式,(團敏)後面的只是告訴編譯系統該函數是塌御枝一個中斷函數,具體的執行還是按照c語言函數的執行方式去執行。