導航:首頁 > 編程語言 > 單片機編程序大全

單片機編程序大全

發布時間:2022-05-22 21:38:11

① 用51單片機編寫個小程序

#include <reg52.h>
#include "delay.h"
#include "lcd1602.h"

sbit SCK = P2^0;//sbit定義單片機的特殊功能寄存器變數
sbit SDA = P2^1;
bit ack = 0;//bit定義變數

void iic_start()
{
SDA = 1;
SCK = 1;
delay_us(1);
SDA = 0;
delay_us(1);

SCK = 0;//鉗住匯流排,等待下次使用
}

void icc_stop()
{
SDA = 0;
SCK = 1;
delay_us(1);
SDA = 1;
delay_us(1);

SCK = 0;//鉗住匯流排,等待下次使用
}

void iic_send_byte(unsigned char byte)
{
unsigned char i;
for(i = 0;i<8;i++)
{
SDA = byte & 0x80;//非0為1
SCK = 1;
delay_us(1);
SCK = 0;
byte <<=1;//左移一位
}
SDA = 1;
SCK = 1;
delay_us(1);
if(0 == SDA)//有應答
ack = 0;
else //無應答
ack =1;

SCK = 0;//鉗住匯流排,等待下次使用
}

unsigned char iic_rcv_byte()
{
unsigned char i,temp;
SDA = 1;
for(i = 0;i < 8;i ++)
{
SCK = 0;
delay_us(1);
SCK = 1;
delay_us(1);
temp <<= 1;
if(SDA)
temp = temp+ 1;
}
SCK = 0;
return temp;
}

void iic_ack()
{
SDA = 0;
SCK = 1;
delay_us(1);

SCK = 0;
}
void iic_noack()
{
SDA = 1;
SCK = 1;
delay_us(1);

SCK = 0;
}

void AT_send_str(unsigned char deviceaddr,unsigned char romaddr,unsigned char *s,unsigned char num)
{
unsigned char i;
iic_start();

iic_send_byte(deviceaddr);
if(ack == 1)
return;
iic_send_byte(romaddr);
if(ack == 1)
return;
for(i = 0;i < num; i ++)
{
iic_send_byte(*s);
if(ack == 1)
return;
s++;
}
icc_stop();
}

void AT_rcv_str(unsigned char deviceaddr,unsigned char romaddr,unsigned char *s,unsigned char num )
{
unsigned char i;
//SDA = 1;
iic_start();

iic_send_byte(deviceaddr);
if(ack == 1)
return;
iic_send_byte(romaddr);
if(ack == 1)
return;
iic_start();
iic_send_byte(deviceaddr + 1);
if(ack == 1)
return;
for(i = 0;i < num - 1; i++)
{
*s = iic_rcv_byte();
iic_ack();//
s++;
}
*s = iic_rcv_byte();
iic_noack();
icc_stop();
}

void main()
{
unsigned char i;
unsigned char testbuf[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,16,17,18,19};
unsigned char rcvbuf[20];
lcd_init();
AT_send_str(0xae,0,testbuf,10);
delay_ms(200);
AT_rcv_str(0xae,0,rcvbuf,10);
for(i = 0;i < 10; i++)
{
display_lcd_char(i,0,rcvbuf[i]+0x30);
}
while(1);
}

② 51單片機程序編寫

/*這是用LCD顯示所測溫度的代碼,你參考一下,如果沒問題的話,其他的功能你再添加就好了,不難*/

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

#define Nack_number 10

//**************埠定義**************************************************

uchar flag; //LCD控制線介面

sbit RS=P1^0; //RS端

sbit RW=P1^1; //讀寫端

sbit LCDE=P2^5; //使能端

//mlx90614埠定義

sbit SCK=P2^1; //時鍾線

sbit SDA=P2^2; //數據線

//************數據定義****************************************************

bdata uchar flag1; //可位定址數據

sbit bit_out=flag1^7;

sbit bit_in=flag1^0;

uchar tempH,tempL,err;


//************************** LCD1602 ***********************************

//向LCD寫入命令或數據*****************************************************

#define LCD_COMMAND 0 //命令

#define LCD_DATA 1 // 數據

#define LCD_CLEAR_SCREEN 0x01 // 清屏

#define LCD_HOMING 0x02 // 游標返回原點

//設置顯示模式******* 0x08+ *********************************************

#define LCD_SHOW 0x04 //顯示開

#define LCD_HIDE 0x00 //顯示關

#define LCD_CURSOR 0x02 //顯示游標

#define LCD_NO_CURSOR 0x00 //無游標

#define LCD_FLASH 0x01 //游標閃動

#define LCD_NO_FLASH 0x00 //游標不閃動

//設置輸入模式********** 0x04+ ********************************************

#define LCD_AC_UP 0x02 //游標右移 AC+

#define LCD_AC_DOWN 0x00 //默認 游標左移 AC-

#define LCD_MOVE 0x01 //畫面可平移

#define LCD_NO_MOVE 0x00 //默認 畫面不移動


//************************** mlx90614 ***********************************

//command mode 命令模式

#define RamAccess 0x00 //對RAM操作

#define EepomAccess 0x20 //對EEPRAM操作

#define Mode 0x60 //進入命令模式

#define ExitMode 0x61 //退出命令模式

#define ReadFlag 0xf0 //讀標志

#define EnterSleep 0xff //進入睡眠模式

//ram address read only RAM地址(只讀)

#define AbmientTempAddr 0x03 //周圍溫度

#define IR1Addr 0x04

#define IR2Addr 0x05

#define LineAbmientTempAddr 0x06 //環境溫度

/*0x0000 0x4074 16500 0.01/單元

-40 125*/

#define LineObj1TempAddr 0x07 //目標溫度,紅外溫度

/*0x27ad-0x7fff 0x3559 22610 0.02/單元

-70.01-382.19 0.01 452.2*/

#define LineObj2TempAddr 0x08

//eepom address EEPROM地址

#define TObjMaxAddr 0x00 //測量范圍上限設定

#define TObjMinAddr 0x01 //測量范圍下限設定

#define PWMCtrlAddr 0x02 //PWM設定

#define TaRangeAddr 0x03 //環境溫度設定

#define KeAddr 0x04 //頻率修正系數

#define ConfigAddr 0x05 //配置寄存器

#define SMbusAddr 0x0e //器件地址設定

#define Reserverd1Addr 0x0f //保留

#define Reserverd2Addr 0x19 //保留

#define ID1Addr 0x1c //ID地址1

#define ID2Addr 0x1d //ID地址2

#define ID3Addr 0x1e //ID地址3

#define ID4Addr 0x1f //ID地址4


//************函數聲明*****************************************************

void start(); //MLX90614發起始位子程序

void stop(); //MLX90614發結束位子程序

uchar ReadByte(void); //MLX90614接收位元組子程序

void send_bit(void); //MLX90614發送位子程序

void SendByte(uchar number); //MLX90614接收位元組子程序

void read_bit(void); //MLX90614接收位子程序

void delay(uint N); //延時程序

uint readtemp(void); //讀溫度數據

void init1602(void); //LCD初始化子程序

void busy(void); //LCD判斷忙子程序

void cmd_wrt(uchar cmd); //LCD寫命令子程序

void dat_wrt(uchar dat); //LCD寫數據子程序

void display(uint Tem); //顯示子程序

void Print(uchar *str); //字元串顯示程序


//*************主函數*******************************************

void main()

{

uint Tem; //溫度變數

SCK=1;

SDA=1;

delay(4);

SCK=0;

delay(1000);

SCK=1;

init1602(); //初始化LCD

while(1)

{

Tem=readtemp(); //讀取溫度

cmd_wrt(0x01); //清屏

Print(" Temperature: "); //顯示字元串 Temperature: 且換行

display(Tem); //顯示溫度

Print(" ^C"); //顯示攝氏度

delay(10000); //延時再讀取溫度顯示

}

}

void Print(uchar *str) //字元串顯示程序

{

while(*str!='') //直到字元串結束

{

dat_wrt(*str); //轉成ASCII碼

str++; //指向下一個字元

}

}


//*********輸入轉換並顯示*********

void display(uint Tem)

{

uint T,a,b;

T=Tem*2;

if(T>=27315) //溫度為正

{

T=T-27315; //

a=T/100; //溫度整數

b=T-a*100; //溫度小數

if(a>=100) //溫度超過100度

{

dat_wrt(0x30+a/100); //顯示溫度百位

dat_wrt(0x30+a%100/10); //顯示溫度十位

dat_wrt(0x30+a%10); //顯示溫度個位

}

else if(a>=10) //溫度超過10度

{

dat_wrt(0x30+a%100/10); //顯示溫度十位

dat_wrt(0x30+a%10); //顯示溫度個位

}

else //溫度不超過10度

{

dat_wrt(0x30+a); //顯示溫度個位

}

dat_wrt(0x2e); //顯示小數點

if(b>=10) //溫度小數點後第1位數不等於0

{

dat_wrt(0x30+b/10); //顯示溫度小數點後第1位數

dat_wrt(0x30+b%10); //顯示溫度小數點後第2位數

}

else //溫度小數點後第1位數等於0

{

dat_wrt(0x30); //顯示溫度小數點後第1位數0

dat_wrt(0x30+b); //顯示溫度小數點後第2位數

}

}

else //溫度為負

{

T=27315-T;

a=T/100;

b=T-a*100;

dat_wrt(0x2d); //顯示負號

if(a>=10) //溫度低於負10度

{

dat_wrt(0x30+a/10); //顯示溫度十位

dat_wrt(0x30+a%10); //顯示溫度個位

}

else //溫度高於負10度

{

dat_wrt(0x30+a); //顯示溫度個位

}

dat_wrt(0x2e); //顯示小數點

if(b>=10) //溫度小數點後第1位數不等於0

{

dat_wrt(0x30+b/10); //顯示溫度小數點後第1位數

dat_wrt(0x30+b%10); //顯示溫度小數點後第2位數

}

else //溫度小數點後第1位數等於0

{

dat_wrt(0x30); //顯示溫度小數點後第1位數0

dat_wrt(0x30+b); //顯示溫度小數點後第2位數

}

}

}

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

void start(void) //停止條件是 SCK=1時,SDA由1到0

{

SDA=1;

delay(4);

SCK=1;

delay(4);

SDA=0;

delay(4);

SCK=0;

delay(4);

}

//------------------------------

void stop(void) //停止條件是 SCK=1時,SDA由0到1

{

SCK=0;

delay(4);

SDA=0;

delay(4);

SCK=1;

delay(4);

SDA=1;

}

//---------發送一個位元組---------

void SendByte(uchar number)

{

uchar i,n,dat;

n=Nack_number; //可以重發次數

Send_again:

dat=number;

for(i=0;i<8;i++) //8位依次發送

{

if(dat&0x80) //取最高位

{

bit_out=1; //發1

}

else

{

bit_out=0; //發0

}

send_bit(); //發送一個位

dat=dat<<1; //左移一位

}

read_bit(); //接收1位 應答信號

if(bit_in==1) //無應答時重發

{

stop();

if(n!=0)

{

n--; //可以重發Nack_number=10次

goto Repeat; //重發

}

else

{

goto exit; //退出

}

}

else

{

goto exit;

}

Repeat:

start(); //重新開始

goto Send_again; //重發

exit: ; //退出

}

//-----------發送一個位---------

void send_bit(void)

{

if(bit_out==1)

{

SDA=1; //發1

}

else

{

SDA=0; //發0

}

_nop_();

SCK=1; //上升沿

delay(4);delay(4);

SCK=0;

delay(4);delay(4);

}

//----------接收一個位元組--------

uchar ReadByte(void)

{

uchar i,dat;

dat=0; //初值為0

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

{

dat=dat<<1; //左移

read_bit(); //接收一位

if(bit_in==1)

{

dat=dat+1; //為1時對應位加1

}

}

SDA=0; //發送應答信號0

send_bit();

return dat; //帶回接收數據

}

//----------接收一個位----------

void read_bit(void)

{

SDA=1; //數據端先置1

bit_in=1;

SCK=1; //上升沿

delay(4);delay(4);

bit_in=SDA; //讀數據

_nop_();

SCK=0;

delay(4);delay(4);

}



//------------------------------

uint readtemp(void)

{

SCK=0;

start(); //開始條件

SendByte(0x00); //發送從地址00

SendByte(0x07); //發送命令

start(); //開始條件

SendByte(0x01); //讀從地址00

bit_out=0;

tempL=ReadByte(); //讀數據低位元組

bit_out=0;

tempH=ReadByte(); //讀數據高位元組

bit_out=1;

err=ReadByte(); //讀錯誤信息碼

stop(); //停止條件

return(tempH*256+tempL);

}

//******************LCD顯示子函數***********************

void init1602(void) //初始化LCD

{

cmd_wrt(0x01); //清屏

cmd_wrt(0x0c); //開顯示,不顯示游標,不閃爍

cmd_wrt(0x06); //完成一個字元碼傳送後,游標左移,顯示不發生移位

cmd_wrt(0x38); //16×2顯示,5×7點陣,8位數據介面

}

void busy(void) //LCD忙標志判斷

{

flag=0x80; //賦初值 高位為1 禁止

while(flag&0x80) //讀寫操作使能位禁止時等待 繼續檢測

{

P0=0xff;

RS=0; //指向地址計數器

RW=1; //讀

LCDE=1; //信號下降沿有效

flag=P0; //讀狀態位 高位為狀態

LCDE=0;

}

}

void cmd_wrt(uchar cmd) //寫命令子函數

{

LCDE=0;

busy(); //檢測 讀寫操作使能嗎

P0=cmd; //命令

RS=0; //指向命令計數器

RW=0; //寫

LCDE=1; //高電平有效

LCDE=0;

}

void dat_wrt(uchar dat) //寫數據子函數

{

busy(); //檢測 讀寫操作使能嗎

LCDE=0;

if(flag==16)

{

RS=0; //指向指令寄存器

RW=0; //寫

P0=0XC0; //指向第二行

LCDE=1; //高電平有效

LCDE=0;

}

RS=1; //指向數據寄存器

RW=0; //寫

P0=dat; //寫數據

LCDE=1; //高電平有效

LCDE=0;

}

//------------延時--------------

void delay(uint n)

{

uint j;

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

{

_nop_();

}

}


③ 51單片機匯編程

ORG 0

CALL KEY_1

CALL KEY_1

CALL KEY_1

CPL P1.0

SJMP 0000

KEY_1:

JB P3.2, $

CALL DL10MS

JB P3.2, KEY_1

JNB P3.2, $

RET

DL10MS:

...;軟體延時,自己編寫吧

RET

④ 編寫程序單片機

這個程序網上應該有的是吧

⑤ 51單片機程序編寫

最簡程序如下:

⑥ 單片機實驗 編寫程序

單片機實驗,其實這就是典型的流水燈電路,P1口接8個流水燈,每個燈點亮1秒。用定時器T1定時50ms,中斷20次就為1秒,可用_crol_()移位函數實現。模擬效果如下圖所示。

⑦ 單片機寫程序步驟

給單片機寫程序的步驟至少有以下幾點:

  1. 熟悉或了解目標單片機的性能、資源等等與編程有關的東西。

  2. 熟悉或熟練掌握一門編程語言。

  3. 准備、配置好一種編譯軟體。

  4. 准備、配置好目標單片機的燒錄裝置。

⑧ 單片機編寫程序

單片機編程就是簡單的嵌入式軟體開發過程,首先應該精通C語言(當然也有使用匯編語言的,不過主流還是使用C的),能夠熟練運用C語言實現相應的單片機要實現的功能。所謂的單片機開發,就必須對單片機有一定的了解。這就是為什麼嵌入式的工資高,入門難的原因,它必須要有一定的硬體基礎,還需配合很好的編碼能力。如果掌握了單片機硬體,同時也精通編程,那麼寫單片機程序也就是水到渠成的事了。

⑨ 單片機的程序怎麼寫

看你用什麼單片機啊,每種單片機都會對應有一個或多個編譯器的,比如8051單片機,用得最多的就是keil了,如果你用的是51單片機,-下載keil軟體安裝包-安裝軟體------打開軟體----------就可以編寫單片機的程序了。

⑩ 單片機編程程序

1、首先是打開keil軟體,打開後顯示的界面如下

2、如下第一張圖所示點擊project-》new project,點擊後將會出現如下第二張圖所示界面;在文件框中填寫你的工程名,名字可以是任意英文字元組成的(在此時你最好在你所希望存儲該工程的地方新建一文件夾,如第二張圖所示就是在桌面上建立了一個測試文件夾來存儲新建的工程)

3、輸入工程名後會出現如下圖所示的晶元選擇對話框,選擇你開發板上的型號即可(相信要看這張帖子的讀者一定是在學51單片機,此時只需選擇

Atmel-》AT89c52即可。如下第二張圖所示)

4、一路點擊確認後回到如下圖所示的主界面,並如下圖所示點擊新建程序輸入文本

5、點擊後出現如下第一張圖所示界面,並點擊保存按鈕

6、點擊保存按鈕後出現下第一張圖所示對話框,在箭頭所指的地方輸入源文件名稱加後綴名(如果你是用C語言編寫程序後綴名為*.c;如果你是用匯編語言編寫程序則後綴名為*.asm)並點擊確認保存。確認後界面如下第二張圖所示,注意箭頭所指地方的變化。

7、接下來的一步是將源文件加入到工程中,點擊選中source group並右擊將會出現如下圖所示界面。

8、再點擊Add files to.。。。。。。;如下第一張圖箭頭所示處。點擊後將會出現第二張圖所示的對話框,在該對話框中只要點擊選中第五歩保存的源文件並點擊Add即可(注意點擊選中源文件前後的變化,並且特別注意點擊Add後界面沒有任何變化,你只要關閉該對話框即可)

9、打開source group後將會出現如下圖箭頭所指處的變化

10、在右邊的源文件輸入框中寫入程序,並點擊如圖所示的編譯按鈕(可以看到該程序沒有錯誤,編譯成功)

11、但我們點擊進入工程的文件夾沒有看到後綴名為.hex文件,如下圖所示

12、所以我們需點擊target按鈕進行設置,如下第一張圖所示。點擊後出現第二張圖所示對話框

13、在對話框中點擊output選項如下圖1處顯示,並勾選create hex file如下圖2處顯示。勾選後關閉對話框並如第10步再編譯一次。可以看到文件夾中生成了.hex文件

閱讀全文

與單片機編程序大全相關的資料

熱點內容
二次元表格編程 瀏覽:20
plc編程器保停 瀏覽:963
如何降低伺服器的內存佔用率 瀏覽:868
阿里雲伺服器是個什麼意思 瀏覽:817
國內最好的數控編程培訓學校 瀏覽:13
222乘104列是演算法 瀏覽:159
程序員溝通正確姿勢 瀏覽:969
魔玩app怎麼視頻推廣 瀏覽:960
程序員抽獎送禮 瀏覽:458
北京java程序員薪資 瀏覽:658
如何創建網路平台或者app 瀏覽:355
python隨機數生成控制概率 瀏覽:235
壓縮機並聯運行 瀏覽:899
兩位單片機 瀏覽:63
四川音樂類投檔線的演算法 瀏覽:650
建行app如何改轉賬卡 瀏覽:26
android開發升級 瀏覽:299
要火社區app進不去怎麼辦 瀏覽:826
安卓手機上的自定義功能怎麼用 瀏覽:230
方舟伺服器怎麼購買進去資格 瀏覽:44