關閉→
當前位置:知科普>綜合知識>51單片機c語言怎麼寫

51單片機c語言怎麼寫

知科普 人氣:7.77K
1.求大神在keil上幫寫51單片機C語言程序

//第一個實驗:

51單片機c語言怎麼寫

//假設8個LED陰極指向單片機,D11連接P0.1,D12連接P0.2 。 D18連接P0.7

//假設K1按鍵在P2.3引腳

#include<reg51.h>

#include<intrins.h>

sbit k1=P2^3;//假設K1按鍵在P2.3引腳

void main()

{

P0=0xfe;

while(1)

{

if(k1==0)

{

while(k1==0);

P0=_crol_(P0,1);

}

}

}

//第二個實驗:

//假設8個LED陰極指向單片機,D11連接P0.1,D12連接P0.2 。 D18連接P0.7

#include<reg51.h>

char led[]={0xfe,0xff,0xfd,0xff,0xfb,0xff,0xf7,0xff,0xef,0xff,0xdf,0xff,0xbf,0xff,0x7f,0xff};

void main()

{

char i=0;

char counter=0;

TMOD=0x01;//T0 工作方式1

TH0=(655356-50000)/256;//延時50ms

TL0=(655356-50000)%256;//延時50ms

TR0=1;//啟動T0

while(1)

{

if(TF0==1)//查詢

{

TH0=(655356-50000)/256;//重新延時50ms

TL0=(655356-50000)%256;//重新延時50ms

counter++;

if(counter==10)//延時0.5秒

{

counter=0;//重新開始新一輪0.5秒延時

i++;

if(i==16)

{

i=0;

}

P0=led[i];//點燈

}

}

}

}

2.51單片機用C語言編寫

#include<reg51.h>

sbit a = P1^2; //定義單片機對蜂鳴器的輸出端口

sbit key = P3^2; //定義單片機對按鍵的端口 S19

void delay_short() //短延時函數 大約100us 用於設置蜂鳴器的頻率

{

unsigned int i;

for(i=0;i<100;i++);

}

void delay_long() //長延時函數 大約20ms 用於按鍵的軟件消抖和2次聲響之間的間隔

{

unsigned int j;

for(j=0;j<20000;j++);

}

void work(unsigned time) //蜂鳴器使能函數,參數為需要發聲的時間 參數越大響的時間越長 不能超過65535

{

unsigned int m = time;

unsigned int n = 0;

while(m)

{

a = ~a;

delay_short();

m--;

}

for(n=0;n<30;n++) //大約延時 1S左右

{

delay_long();

}

}

void main()

{

while(1)

{

if(key == 0) //軟件消抖

{

delay_long();

if(key == 0)

{

work(2000);

work(2000);

work(2000);

work(500);

work(500);

work(500);

work(500);

work(500);

}

}

}

}

上面是實現要求的所有源程序,另外糾延時控制的是發聲的頻率,並不是發聲的時間長短,發聲的時間長短可以通過循環來實現,具體見源程序。另外單片機的I/O口的負載能力是不足以驅動蜂鳴器的,需要藉助放大芯片,我用的是ULN20003 下面附上我的硬件連接圖

圖片不是很清楚 估計是SOSO的問題 然後就是把IN和單片機的P1^2口連起來就可以

有上面問題可以聯繫我 363396124 加的時候請説明來意

3.51單片機的優先級怎麼用C語言怎麼寫

正常情況下,優先順序為:

外部中斷0

定時器0

外部中斷1

定時器1

串口

定時器2

IP中的位控制中斷優先級,分別為:

PX0:外部中斷0

PT0:定時器0

PX1:外部中斷1

PT1:定時器1

PS:串口

PT2:定時器2

當其為1時,該位對應的中斷將設為高優先級。

中斷響應是:同級中斷比如IP各位都為0 或都為1時,同時到達時優先按如上順序響應中斷,當一箇中斷在執行時,其他中斷只能排隊等候。

當其中一位為1比如PS=1時,那麼無論為0的任何中斷在執行中都將被打斷,優先響應高級中斷。

因此,要保證需要的中斷享有至高權限,將相應的控制位設為1就可以了,比如串口優先保證那麼初始化時加入:

PS=1;就OK。

4.求寫一個單片機(AT89C51)C語言程序

用C啊,我想想:

1、和硬件有點兒關係,這個你清楚麼?

2、假設LED連接到P1口吧。第一個燈接到P1.0。陰極接IO,陽極接5V。

#include <reg51.h>

bit SecFlag;

unsigned char mS;

void Display(unsigned char num,unsigned char sec)

{

num%=8;

P1=~(1<<num);

while(sec--!=0)

{

TR0=1;

while(SecFlag==0);SecFlag=0;

TR0=0;

}

}

main()

{

unsigned char i;

TMOD=1;IE=0x82;

while(1)

{

Display( (i++)%8,1);

}

}

void ISRT0(void) interrupt 1

{

TH0=(-50000)>>8;TL0=-50000;

mS++;

if(mS>20){mS=0;SecFlag=1;}//12MHz, 50mS定時中斷,1秒計時。

}

你很容易擴展出任意要求的閃爍流水燈啦。

Display(2,1);

Display(1,1);

Display(3,2);

Display(1,2);

……放到while裏面就好了。祝你玩得開心。

5.單片機c語言

//下面三行分別將uchar、uint、ulong定義為 unsigned char、unsigned int和unsigned long 方便使用

#define uchar unsigned char //定義一下方便使用

#define uint unsigned int

#define ulong unsigned long

#include //包括一個52標準內核的頭文件

sbit P10 = P1^0; //將P10定義單片機的P1.0口,控制的LED燈,

sbit K1= P3^2; //將K1定義為按鍵K1

uchar scale;//用於保存佔空比的輸出0的時間份額,總共10份

char code dx516[3] _at_ 0x003b;//這是為了仿真設置的

//模擬PWM輸出控制燈的10個亮度級別

void main(void) // 主程序

{

uint n;

//下面幾行是定時器的初始化,初始化的數據OxF3和0x98,數據是通過計算得到的,公式我忘了

RCAP2H =0xF3; //賦T2的預置值的高位,溢出1次是1/1200秒鐘

RCAP2L =0x98;//賦T2的預置值的低位

TR2=1; //啟動定時器

ET2=1; //打開定時器2中斷

EA=1; //打開總中斷

while(1) //程序循環

{ ;//主程序在這裏就不斷自循環,實際應用中,這裏是做主要工作

//for循環只是起個延時的作用

for(n=0;n

scale++;//就是説每次for循環延時結束後scale佔空比增加一次,直到scale==10

if(scale==10)scale=0;

}

}

//1/1200秒定時器2中斷 中斷程序獨立的,不管何時只要中斷的條件到了就調用它,本程序的條件是 定時器T2的定時到了

timer2() interrupt 5

{

static uchar tt; //tt用來保存當前時間在一秒中的比例位置

TF2=0;

tt++;

if(tt==10) //每1/120秒整開始輸出低電平

{

tt=0;

if(scale!=0) //這裏加這一句是為了消除滅燈狀態產生的鬼影

P10=0;

}

if(scale==tt) //按照當前佔空比切換輸出高電平

P10=1;

}

6.單片機C語言入門

1,首先要學習C語言基礎,就相當於80%會單片機了,因為現在所有8/16/32位(51系列,MSP430系列,ARM系列)都是使用C語言。

2,聽起來單片機比較陌生,不是因為不懂,而是不知道方法和流程。現簡單説説,僅供參考;

3,看一下單片機功能:包換內部FLASH、RAM、TIMER、INT、ADC、USB、ISP/IAR等。

4,編譯環境、編程軟件KEIL。

5,打開開發板的例子程序,在KEIL編譯,下載到板,看結果和説明是不是相符,達到這樣效果時,心裏肯定很激動,這時真正學會了單片機,成功了。

6,然後再學會看電路圖,電路圖其實很簡單,就是一根線從一個地方連接到另一個地方,寫代碼時,只記住單片機是哪一個管腳,然後對它寫代碼即可。

總結:實驗很重要,要多參與這樣的項目開發,方能進步。

7.51單片機 c語言看門狗程序怎麼寫

看門狗在51單片機電路里的作用是防止程序 “跑飛”、“死機”後,系統不動作,而採取復位的辦法“喚醒”系統。

89S51、89S52系列單片機自帶有看門狗功能,片內數據區A6H寄存器具有看門狗功能,使用很簡單:#include。sfr WDTRST = 0xA6;。

void main() { WDTRST=0x1E;;//初始化看門狗 WDTRST=0xE1;//初始化看門狗 for(;;) { WDTRST=0x1E;;//喂狗指令 WDTRST=0xE1;//喂狗指令 } } 可見,你只要在程序的大循環體內加一條喂狗指令就行。但這種看門狗功能有限,不是很可靠的,它依靠晶振工作,一旦晶振不起振,就無效了。

實踐中多采用外部看門狗的方法,可以選用的芯片很多:MAX708、MAX813 、X25045。..具體編程就要看芯片的參考資料了。

例如:X25045是SPI總線的看門狗芯片,復位端和單片機復位端連接,SPI數據輸入你可以選擇合適的IO接口。WREN 0x06 設置寫允許位 WRDI 0x04 復位寫允許位 RDSR 0x05 讀狀態寄存器 WRSR 0x01 寫狀態寄存器 READ 0x03/0x0b 讀操作時內部EEPROM頁地址 WRITE 0x02/0x0a 寫操作時內部EEPROM頁地址 #include sbit CS= P2^7; sbit SO= P2^6; sbit SCK= P2^5; sbit SI= P2^4; #define WREN 0x06 // #define WRDI 0x04 // #define RDSR 0x05 // #define WRSR 0x01 // #define READ0 0x03 // #define READ1 0x0b // #define WRITE0 0x02 // #define WRITE1 0x0a // #define uchar unsigned char uchar ReadByte() //read a byte from device { bit bData; uchar ucLoop; uchar ucData; for(ucLoop=0;ucLoop<8;ucLoop++) { SCK=1; SCK=0; bData=SO; ucData<<=1; if(bData) { ucData|=0x01; } } return ucData; } void WriteByte(uchar ucData)//write a byte to device { uchar ucLoop; for(ucLoop=0;ucLoop<8;ucLoop++) { if((ucData&0x80)==0) //the MSB send first {SI=0;} else {SI=1;} SCK=0; SCK=1; ucData<<=1; } } uchar ReadReg() //read register { uchar ucData; CS=0; WriteByte(RDSR); ucData=ReadByte(); CS=1; return ucData; } uchar WriteReg(uchar ucData) //write register { uchar ucTemp; ucTemp=ReadReg(); if((ucTemp&0x01)==1) //the device is busy return 0; CS=0; WriteByte(WREN);//when write the WREN, the cs must have a high level CS=1; CS=0; WriteByte(WRSR); WriteByte(ucData); CS=1; return 1; } void WriteEpm(uchar cData,uchar cAddress,bit bRegion) /* 寫入一個字節,cData為寫入的數,cAddress為寫入地址,bRegion為頁 */ { while((ReadReg()&0x01)==1); //the device is busy CS=0; WriteByte(WREN); //when write the wren , the cs must have a high level CS=1; CS=0; if(bRegion==0) { WriteByte(WRITE0);} //write the page addr else {WriteByte(WRITE1);} WriteByte(cAddress); WriteByte(cData); SCK=0; // CS=1; } uchar ReadEpm(uchar cAddress,bit bRegion) /* 讀入一個字節,cAddress為讀入地址,bRegion為頁 */ { uchar cData; while((ReadReg()&0x01)==1);//the device is busy CS=0; if(bRegion==0) {WriteByte(READ0); } else {WriteByte(READ1);} WriteByte(cAddress); cData=ReadByte(); CS=1; return cData; } main() { WriteReg(0x00);//set the watchdog time as 1.4s CS=1; CS=0; //reset the watchdog } 回覆: xuzhimin9514 所有的89S系列都帶狗,所有的80C系列都不帶狗。

所以89S51 89S52都帶狗,80C51、80C52都不帶狗。

8.51單片機C語言編程

代碼如下:

typedef union {

unsigned int myvalue;

struct{

unsigned myvalueL:8;

unsigned myvalueH:8;

}child;

}_mytype;

_mytype mytype;

void main()

{

mytype.myvalue = 0x1234;

}

仿真如下:

是你要的結果吧

TAG標籤:#單片機 #語言 #