單片機C語言編程相對于匯編語言來講入門比較容易,不需要對硬件理解那么深刻,有C語言基礎的人學習起來更有優勢。單片機C語言編程入門只需要學會編寫簡單的輸入、輸出控制即可,入門后再根據需要逐步深入學習。
一、電路圖
說明:仿真軟件后臺已默認是單片機最小系統,本圖沒再添加電源、復位電路和時鐘電路。P0口連接發光二極管,并且連接了上拉電阻和5V電源,P3口連接獨立式按鍵。
二、單片機C語言入門常用指令
1、#include(包含命令)
#include <reg51.h> //將指定的定義和聲明文件加入程序中。
2、#define(宏定義命令)
#define D P0 //定義D為端口P0。
3、sbit(位定義)
sbit D1=P0^0; //定義D1為引腳P0.0。
3、if(條件判斷指令)
if (條件1)
程序a;
else(條件2)
程序b; //條件1滿足,執行程序a;條件2滿足,執行程序b;
4、for(循環指令)
for(int i=0;i<8;i++)
{ } //i為整型變量,小于8時一直循環大括號內容。
5、while(循環指令)
while (表達式)
{
語句;
} //表達式成立,執行大括號里內容。
三、入門任務講解:
1、單片機控制流水燈D1-D8(輸出練習)
(1)分析:根據上圖所示,P0口連接發光二極管正極,所以P0口要輸出高電平才能使發光二極管導通。大部分電路P0連接發光二極管負極,只要輸出低電平就可以導通,并且減少了上拉電阻。
(2)程序及注釋
#include//引用52單片機頭文件 sbit D1=P0^0; sbit D2=P0^1; sbit D3=P0^2; sbit D4=P0^3; sbit D5=P0^4; sbit D6=P0^5; sbit D7=P0^6; sbit D8=P0^7; /*位定義做流水燈,入門容易;也可端口定義,#define D P0*/ delay() //延時函數 { unsigned char i,j; //定義無符號字符型,也可用int定義為整型變量 for(i=0;i<2;i++) //外層循環,這里不加分號。 for(j=0;j<112;j++); //內層循環,加分號,表示后面不執行任何指令 } main() //主函數 { D1=0; D2=0; D3=0; D4=0; D5=0; D6=0; D7=0; D8=0; /*初始燈處于熄滅狀態。也可for循環for(int i=1;i<9;i++) {Di=0;}*/ while(1) //1表示條件永遠成立,這里使用while形成死循環。{ D1=1; //點亮第1盞燈 delay(); //點亮的時間 D1=0; //熄滅第1盞燈 delay(); //熄滅的時間 D2=1; //點亮第2盞燈 delay(); //點亮的時間 D2=0; //熄滅第2盞燈 delay(); //熄滅的時間 D3=1; //點亮第3盞燈 delay(); //點亮的時間 D3=0; //熄滅第3盞燈 delay(); //熄滅的時間 D4=1; //點亮第4盞燈 delay(); //點亮的時間 D4=0; //熄滅第4盞燈 delay(); //熄滅的時間 D5=1; //點亮第5盞燈 delay(); //點亮的時間 D5=0; //熄滅第5盞燈 delay(); //熄滅的時間 D6=1; //點亮第6盞燈 delay(); //點亮的時間 D6=0; //熄滅第6盞燈 delay(); //熄滅的時間 D7=1; //點亮第7盞燈 delay(); //點亮的時間 D7=0; //熄滅第7盞燈 delay(); //熄滅的時間 D8=1; //點亮第8盞燈 delay(); //點亮的時間 D8=0; //熄滅第8盞燈 delay(); //熄滅的時間 } } /*也可以使用for循環,參考初始定義部分注釋,流水就是等依次點亮,熄滅的過程 */
2、按鍵K1時D1-D8開始流水(輸入輸出練習)
(1)分析:通常按鍵一端接引腳,另一端接地。按鍵接通時,輸入單片機引腳的電平為低電平0。判斷是否按下,使用if指令進行判斷。按鍵按下時,會有抖動,使用延時消除抖動。
(2)程序及注釋:
#include//引用52單片機頭文件 sbit D1=P0^0; sbit D2=P0^1; sbit D3=P0^2; sbit D4=P0^3; sbit D5=P0^4; sbit D6=P0^5; sbit D7=P0^6; sbit D8=P0^7; //位定義,也可以整個端口定義,#define D P0 sbit K1=P3^0; //定義K1連接引腳P3.0。 delay() //延時函數 { unsigned char i,j; //定義無符號字符型 for(i=0;i<2;i++) //外層循環,這里不加分號 for(j=0;j<112;j++); //內循環加分號,表示后面不執行任何指令 } main() //主函數 { D1=0; D2=0; D3=0; D4=0; D5=0; D6=0; D7=0; D8=0; //也可以for循環for(int i=1;i<9;i++) {Di=0;} while(1) //使用while形成死循環,即燈一直流水。 { if(K1==0) //按鍵按下時引腳接地,即等于0。 { delay(); //延時一下,防抖動 if(K1==0) //再斷按鍵是否按下,按下則流水,否則退出。 { D1=1; //點亮第1盞燈 delay(); //點亮的時間 D1=0; //熄滅第1盞燈 delay(); //熄滅的時間 D2=1; //點亮第2盞燈 delay(); //點亮的時間 D2=0; //熄滅第2盞燈 delay(); //熄滅的時間 D3=1; //點亮第3盞燈 delay(); //點亮的時間 D3=0; //熄滅第3盞燈 delay(); //熄滅的時間 D4=1; //點亮第4盞燈 delay(); //點亮的時間 D4=0; //熄滅第4盞燈 delay(); //熄滅的時間 D5=1; //點亮第5盞燈 delay(); //點亮的時間 D5=0; //熄滅第5盞燈 delay(); //熄滅的時間 D6=1; //點亮第6盞燈 delay(); //點亮的時間 D6=0; //熄滅第6盞燈 delay(); //熄滅的時間 D7=1; //點亮第7盞燈 delay(); //點亮的時間 D7=0; //熄滅第7盞燈 delay(); //熄滅的時間 D8=1; //點亮第8盞燈 delay(); //點亮的時間 D8=0; //熄滅第8盞燈 delay(); //熄滅的時間 } } } } /*也可以使用for循環,參考初始定義部分注釋,流水就是等依次點亮,熄滅的過程 */