導航:首頁 > 操作系統 > 51單片機c語言編程往返程序

51單片機c語言編程往返程序

發布時間:2022-09-06 17:31:21

⑴ 51單片機,幫忙寫個c語言程序

//好像是這個頭文件 好久沒玩51了
#include <reg51.h>
//------------宏定義---------------//
#define uchar unsigned char
#define uint unsigned int
#define BUTTON1 1 //按鍵1
#define BUTTON2 2 //按鍵2
//-----------變數-----------//
uchar Counter = 0; //統計按鍵次數
/*-------管腳定義 --------//
記得是sbit P13 = P1^3;
忘了,你自己定義吧,我直接寫程序
*/
//-------------延時---------------//
void Delay(uchar x)
{
uchar i,j;
for(i = 0; i++; i < x)
for(j = 0; j++; j < 200)
}
//------------按鍵掃描------------//
uchar ButtonScan (void)
{
uchar ButtonNum = 0;
if(P13 == 0)
{
/*延時防止按鍵抖動,如果你的晶振是12M的話,
如果是其他的你只要讓延時在30ms就可以了*/
Delay(150);
if(P13 == 0)
while(!P13); /*等待按鍵松開*/
ButtonNum = BUTTON1;
}
if(P14 == 0)
{
Delay(150);
if(P14 == 0)
while(!P14); /*等待按鍵松開*/
ButtonNum = BUTTON2;
}
return ButtonNum;
}
//----------按鍵判斷-------------//
void ButtonJugde (void)
{
switch(ButtonScan())
{
case 1: //增加
if (Counter != 40)
Counter++;
break;
case 2: //減小
if (Counter != 0)
Counter--;
break;
default: break;
}
}
//---------LED點亮處理--------//
uchar LED (void)
{
/*我這里把你所說的「一號燈」理解為P2.0所對應的二極體,
「二號燈」理解為P2.1所對應的二極體。。。一次類推
根據你的實際電路情況調整*/
uchar LedEnable;
if((Counter > 0) && (Counter <= 5))
{
/*我理解你的二極體是接地的,然後高電平點亮
根據你的實際電路情況調整*/
LedEnable = 0x01;
}
if((Counter > 5) && (Counter <= 10))
{
LedEnable = 0x03;
}
if((Counter > 10) && (Counter <= 15))
{
LedEnable = 0x07;
}
if((Counter > 15) && (Counter <= 20))
{
LedEnable = 0x0f;
}
if((Counter > 20) && (Counter <= 25))
{
LedEnable = 0x01f;
}
if((Counter > 25) && (Counter <= 30))
{
LedEnable = 0x3f;
}
if((Counter > 30) && (Counter <= 35))
{
LedEnable = 0x7f;
}
if((Counter > 35) && (Counter <= 40))
{
LedEnable = 0xff;
}
return LedEnable;
}
//--------------主函數------------------//
void main(void)
{
while(1)
{
ButtonJugde (); //按鍵掃描
P2 = LED(); //點亮二極體
}
}
免責聲明:
以上程序為本人(chen bolin)所寫,但是未通過本人驗證。
任何人可以使用或修改本代碼,包括商業用途。本人不承擔任何責任。
具體請遵守GPL協議。

我沒有編譯,你自己編譯看看吧,別忘了把管腳定義補全了。應該可以實現的。如果有什麼不明白的可以到我的主頁留言。

⑵ 求51單片機C語言編程

不能直接定時400ms,可定時50ms,採用中斷方式,中斷8次就是400ms。先計算出定時初始值,X=65536-50000=3CB0H。程序如下
#include<reg51.h>
sbit led=P2^0; //LED燈在P2.0上,0點亮
unsigned char t1n;//對定時50ms中斷計數8次為400ms
void main()
{
TMOD=0x10;
TH1 =0x3C;//晶振頻率=12M,定時50ms
TL1 =0xB0;
EA =1;//開中斷
ET1 =1;
TR1 =1;
led =0;
while(1);
}
void T1_time() interrupt 3
{
TH1 =0x3C;
TL1 =0xB0;
t1n++;
if(t1n>=8)
{
t1n=0;
led=!led;//狀態翻轉
}
}

⑶ 51單片機C語言編程,簡易計算器,復位鍵如何編程會簡單些要求能隨時返回主程序開頭。。

提供個思路
void (*RecallBp)(void);
main()
{
保存堆棧指針
clear:
RecallBp=(void*) &clear;

恢復堆棧指針
初始化
........
}

需要返回時
調用 RecallBp();

⑷ 51單片機C語言編程

#include<AT89X51.H>
//設CPU是時鍾12MHz的8051系列
dataunsignedintms;
sbitKEY=P2^3;
voidSetupTimer0()
{
TMOD&=0XF0;//僅保留T1信息
TMOD|=0X02;//設置T0:定時功能,方式2,自動重載8位定時器/計數器
TH0=256-250;//定時每0.25ms中斷一次
TL0=256-250;
TR0=1;//開啟定時器
ET0=1;//定時器0中斷打開
}

voidTimer0_ISR()interrupt1//中斷服務程序
{
staticdataunsignedcharus250;
if(++us250>=4){++ms;us250=0;}
}


voidprocess1()
{
unsignedchari,d;
unsignedinttime,dlt;

//第一步8燈整體一直閃(閃10下)。
for(i=0;i<10;++i)
{
P1=0;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
P1=0xFF;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
}

//第二步整體滅5秒。
P1=0xff;
for(time=ms,dlt=0;dlt<5000;dlt=ms-time);

//第三步從右邊逐個點亮並循環4遍。
for(i=0;i<4;++i)
for(d=1;d;d<<=1)
for(P1=~d,time=ms,dlt=0;dlt<500;dlt=ms-time);


//第4步循環完畢後全部熄滅;
P1=0xff;
}

voidprocess2()
{
unsignedchari,d;
unsignedinttime,dlt;

//第一步8燈整體閃3次。
for(i=0;i<3;++i)
{
P1=0;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
P1=0xFF;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
}

//第二步從左邊逐個點亮並循環2遍。
for(i=0;i<2;++i)
for(d=0x80;d;d>>=1)
for(P1=~d,time=ms,dlt=0;dlt<500;dlt=ms-time);

//第三步循環完畢後8燈一直流水;
for(;KEY;)
for(d=1;d&&KEY;d<<=1)
for(P1=d,time=ms,dlt=0;dlt<500&&KEY;dlt=ms-time);
}

voidprocess3()
{
unsignedchari,j,d;
unsignedinttime,dlt;

//第一步8燈整體保持全滅,滅的時間為500ms,可以修改
P1=0XFF;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);

//第二步8燈從外到里依次點亮,重復兩遍。
for(i=0;i<2;++i)
for(d=0x1,j=0x80;d<=0x8;d<<=1,j>>=1)
for(P1=~(d|j),time=ms,dlt=0;dlt<500;dlt=ms-time);

//第三步8燈從里到外依次點亮,重復兩遍循環完畢後8燈保持在4亮4滅的狀態
for(i=0;i<2;++i)
for(d=0x8,j=0x10;d;d>>=1,j<<=1)
for(P1=~(d|j),time=ms,dlt=0;dlt<500&&KEY;dlt=ms-time);
P1=0xc3;
for(;KEY;);

}


voidprocess4()
{
unsignedchari,d;
unsignedinttime,dlt;

//第一步整體保持全滅。滅的時間為1000ms,可以修改
P1=0XFF;
for(time=ms,dlt=0;dlt<1000;dlt=ms-time);

//第二步從左到右流水兩遍。
for(i=0;i<2;++i)
for(d=1;d;d<<=1)
for(P1=d,time=ms,dlt=0;dlt<500;dlt=ms-time);

//第三步從右到左逐個點亮三遍。
for(i=0;i<3;++i)
for(d=0x1;d;d<<=1)
for(P1=~d,time=ms,dlt=0;dlt<500;dlt=ms-time);

//第4步其中一盞燈保持閃
for(;KEY;)
{
for(d=0x8;KEY;d^=0x8)
for(P1=~d,time=ms,dlt=0;dlt<500&&KEY;dlt=ms-time);
}
}

voidmain()
{
//dataunsignedcharp0;
ms=0;
SetupTimer0();
EA=1;//全局中斷打開
while(1)
{
process1();
process2();
process3();
process4();
}
}

⑸ 求51單片機C語言程序編程思路

#include<AT89X51.H>
//假定繼電器是安裝在P3.5,按鍵分別安裝在P3.6,P3.7,時鍾頻率12MHz
sbitsw1=P3^6;
sbitsw2=P3^7;
sbitrelay=P3^5;

voidSetupTimer0()
{
TMOD&=0XF0;//僅保留T1信息
TMOD|=0X02;//設置T0:定時功能,方式2,自動重載8位定時器/計數器
TH0=256-250;//定時每0.25ms中斷一次
TL0=256-250;
TR0=1;//開啟定時器
ET0=1;//定時器0中斷打開
}

dataunsignedcharus250;
dataunsignedintrelay_timer;

voidTimer0_ISR()interrupt1//定時中斷服務程序,為按鍵消抖服務
{
//如果一個動作過程剛剛開始,則設定繼電器延時3000ms,並打開繼電器
if(0==relay_timer&&0==sw1){relay_timer=3000;relay=1;}

if(++us250>=4)//250us中斷一次,每四次得到1ms
{
us250=0;
if(relay_timer==0)relay=0;//如繼電器延時為0,則關繼電器
else--relay_timer;//否則繼電器延時遞減
}

//如果當前正處於一個動作過程且有sw2按下,則修改繼電器延時為1000ms
if(relay_timer&&0==sw2)relay_timer=1000;
}

voidmain()
{
us250=0;
relay_timer=0;
relay=0;
SetupTimer0();
EA=1;//全局中斷打開
while(1);//所有的動作均在中斷函數內完成
}

⑹ 51單片機C語言程序

這個很簡單,可以利用單片機的定時器來完成


當有脈沖輸入的時候,啟動定時器,並對定時器的計數值進行清零


每一次脈沖輸入都清零計數值,當脈沖消失後,定時器的計數值達到指定時間則關閉


關閉的同時,調用其它函數,例如你的繼電器控制


需要說明的是,我使用的開發板和你的不見得一樣,所以埠的使用只能你自己修改了


但程序已經經過硬體測試成功,請放心使用,如果滿意記得採納哦


/***************************************************************************/

#include <reg51.h> //51單片機通用頭文件

sbit P24=P1^0; sbit P25=P1^1; sbit P26=P1^2; sbit P27=P1^3;//數碼管位選埠

char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼

sbit k=P3^7; sbit KK=P1^4;//定義按鍵和繼電器埠

int t,n,s,fe=0;

/***************************************************************************/

void YS(int hs){int hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}//延時函數

/***************************************************************************/

void XS(int xs)//數碼管顯示

{

char d1,d2,d3,d4;

d1=(xs/1)%10; d2=(xs/10)%10; d3=(xs/100)%10; d4=(xs/1000)%10;

P0=table[d1]; P27=0; YS(5); P27=1;

P0=table[d2]; P26=0; YS(5); P26=1;

P0=table[d3]; P25=0; YS(5); P25=1;

P0=table[d4]; P24=0; YS(5); P24=1;

}

/***************************************************************************/

void main(void)//主函數

{

TMOD=0x01; EA=1; ET0=1; KK=0;//定時器初始化

TH0=(65536-921)/256; TL0=(65536-921)%256;//定時器初值

while(1)

{

XS(t);//調用數碼管顯示函數

if(k==0)//如果按鍵被按下

{

YS(10);//延時去抖動

if(k==0)//如果是有效按鍵

{

TR0=1;//啟動定時器,開始計時

n=0;//每次按鍵都清空定時計數

t++;//按鍵值累加一次

KK=1;//繼電器打開

while(!k){XS(t);}//等待按鍵松開,並調用數碼管顯示,避免黑屏

}

}

if(fe==1)//如果沒按鍵輸入

{

fe=0;t=0;//清空按鍵計數值,並設置標識符

KK=0;//繼電器吸合

}

}

}

/***************************************************************************/

void int1() interrupt 1 //定時器中斷

{

TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;//n等於100時,則為1秒

if(n>1000){TR0=0;n=0;fe=1;}//如果達到指定時間,則關閉定時器,並設置標識符

}

/***************************************************************************/

⑺ 用C語言編程51單片機時候讓程序返回到指定位置用什麼語句

還是循環,需要循環幾次用的i++
或者這樣不就回去了嗎?
while(1)
{
P0 = 0xFE;
for(i = 0;i < 60000;i++);
P0 = 0xFB;
for(j = 0;j < 30000;j++);
P0 = 0xFD;
}

⑻ 很簡的51單片機C語言流水燈程序

1、51單片機C語言實現循環8個流水燈左移三次,後右移三次。
常式:
#include<reg51.h> //51單片機頭文件
#include <intrins.h> //包含有左右循環移位子函數的庫
#define uint unsigned int //宏定義
#define uchar unsigned char //宏定義
sbit beep=P2^3;
void delay(uint z) //延時函數,z的取值為這個函數的延時ms數,如delay(200);大約延時200ms.
{ //delay(500);大約延時500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函數
{
uchar a,i,j;
while(1) //大循環
{
a=0xfe; //賦初值
for(j=0;j<3;j++) for(i=0;i<8;i++) //左移三次
{
P1=a; //點亮小燈
beep=0; //開啟蜂鳴器
delay(50); //延時50毫秒
beep=1; //關閉蜂鳴器
delay(50); //再延時50毫秒
a=_crol_(a,1); //將a變數循環左移一位
}
a=0x7f;
for(j=0;j<3;j++) for(i=0;i<8;i++) //右移三次
{
P1=a; //點亮小燈
beep=0; //開啟蜂鳴器
delay(50); //延時50毫秒
beep=1; //關閉蜂鳴器
delay(50); //再延時50毫秒
a=_cror_(a,1); //將a變數循環右移一位
}
}
}
2、51單片機是對所有兼容Intel
8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8031單片機,後來隨著Flash
rom技術的發展,8031單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用於工業測控系統之中。很多公司都有51系列的兼容機型推出,今後很長的一段時間內將佔有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。

⑼ 求51單片機的c語言程序

#include<stc89.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x00};
uchar led[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x00,0xFF};
sbit adrd=P3^7;
sbit adwr=P3^6;
sbit la=P2^6;
sbit wela=P2^7;

uchar date1=0;
uchar date2=50;
uchar date3=100;
uchar date4=150;
uchar date5=200;
uchar date6=255;

uchar a,sz;

void init();
void delay(uint z);
uchar adchushihua();
void shumaguan(uint shu);
void processing();
void main()
{
init();

while(1)
{

sz=adchushihua();
for(a=10;a>0;a--)
{
shumaguan(sz);
processing();
}
}
}

void init()
{

P0=0x7f;

}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

uchar adchushihua()
{
uchar shu;
adwr=1;
_nop_();
adwr=0;
_nop_();
adwr=1;

P1=0xff;

adrd=1;
_nop_();
adrd=0;
_nop_();
shu=P1;
adrd=1;

return shu;
}
void shumaguan(uint shu)
{
uchar ,shi,ge;
=shu/100;
shi=shu%100/10;
ge=shu%10;

la=1;
P0=table[];
la=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delay(5);

la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0x7d;
wela=0;
delay(5);

la=1;
P0=table[ge];
la=0;
P0=0xff;
wela=1;
P0=0x7b;
wela=0;
delay(5);

}

void processing()
{
if((sz>=date1)&&(sz<=date2))
{
P1=0xfe;
}
else if((sz>=date2)&&(sz<=date3))
{
P1=0xfd;
}
else if((sz>=date3)&&(sz<=date4))
{
P1=0xfb;
}
else if((sz>=date4)&&(sz<=date5))
{
P1=0xf7;
}
else if((sz>=date5)&&(sz<date6))
{
P1=0xef;
}
else if(sz==date6)
{
P1=~P1;
delay(20);

}

}

這個是我剛剛寫的 根據你的需要 反正閑來無事 我寫的比較籠統 需要你自己根據 自己的實際情況來判斷確定 我只是利用AD簡單的處理 成數碼管顯示的數字 你要是 轉換成電壓 那就把裡面的變數 修改一下 我寫的那個控制LED燈亮就不要動了 只是修改一下他前面定義的數字就可以 最後那個是我自己加上去的有點趣味性 希望對你有幫助

閱讀全文

與51單片機c語言編程往返程序相關的資料

熱點內容
動畫遺傳演算法 瀏覽:52
php如何解析xml文件 瀏覽:702
如何改變appstore的語言 瀏覽:462
javahtmlxml 瀏覽:34
單片機啟動文件 瀏覽:811
橙app如何開啟聊天 瀏覽:899
訪問伺服器公網地址 瀏覽:666
pdf列印底色去掉 瀏覽:463
java快遞介面 瀏覽:397
哪個app可以教新爸爸 瀏覽:210
如何查看伺服器系統版本信息 瀏覽:524
成都市土地出讓金演算法 瀏覽:703
鋼筋加密標記 瀏覽:578
ps中擴展功能在文件夾的什麼位置 瀏覽:905
雙極壓縮機為什麼要先高壓 瀏覽:528
蘋果手機伺服器填什麼 瀏覽:832
android移動動畫效果 瀏覽:692
電子和伺服器是什麼意思 瀏覽:693
phpurl中文亂碼問題 瀏覽:894
程序員那麼可愛大結局陸漓產子 瀏覽:539