




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
單片機應用技術項目式教程—基于Proteus和KeilCSINGLE-CHIP
COMPUTER
APPLICATION
TECHNOLOGY
城市路口交通燈的設計C語言知識回顧01C51基礎知識0203城市路口交通燈的設計04知識要點流水燈的設計
串行通信技術學會使用Proteus軟件繪制交通燈硬件電路圖01學會使用Keil軟件進行C51的軟件程序設計并調試信波特率的選擇與設計02掌握C51的基本編程方法和常用頭文件03掌握簡單流水燈的設計和編程方法04學習要求實現城市路口交通燈的設計05走近科學單片機控制的常用顯示器有很多種,如目前廣泛使用的液晶顯示器(LCD)、多段數碼管以及點陣顯示器,常用于電子游戲、電子鐘表、電視機等電子設備上。近年來,如OLED(OrganicLightEmittingDiode)顯示器和TFT-LCD(ThinFilmTransistor-LiquidCrystalDisplay)顯示器也已經問世OLED除了具備高分辨率、高亮度、高對比度及低功耗的優點,還具備可彎曲、耐低溫等特點,常用于高端手機及平板電腦顯示等場合。2.1C語言簡介2.1.1C語言的數據類型2.1.2C語言的分支結構與循環結構2.1.3C語言的數組2.1.4C語言的指針2.2C51的變量與常量2.2.1C51變量
2.2.2C51的常量2.2.3C51的頭文件2.2.4C-51的運算符2.3C51指針2.4C51函數2.4.1函數定義2.4.2函數的調用2.4.3不帶參數的函數寫法及調用2.4.4帶參數的函數寫法及調用2.4.5中斷函數2.5軟件程序設計舉例C語言簡介2.1.1C語言的數據類型C語言的數據類型包括:基本類型、構造類型、指針類型、空類型四大類結構1.基本類型:char,short,int,long,float,double這六個關鍵字代表C語言里的六種基本數據類型。但是由于CPU位數或者系統位數的不同,數據類型可能占內存的大小不同,因此在使用前需要使用sizeof()對各個類型大小進行測試。2.構造類型:結構體struct、共用體union、數組和枚舉類型A、定義結構體的一般格式為:struct結構名{類型變量名;類型變量名;}結構變量;例:有3個候選人,對候選人得票統計;每輸入一個人的名字,count++.#include<stdio.h>structperson{charname[20];intcount;}leader[3]={“li”,0,”zhang”,0,”fang”,0};main(){inti,j;
charleader_name[20];for(i=1;i<=10;i++){scanf(%s”,leader_name);for(j=0;j<3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}printf(“\n”);for(i=0;i<3;i++){printf(“%5s,%d\n”,leader[i].name,leader[i].count);}結構體應用舉例B、定義共用體的一般格式為:不同類型的變量共用一段存儲單元union共用體名{成員表列}變量表列;*結構體和共用體的區別:共用體占的存儲空間長度是最長成員長度,即共用體的地址跟它各成員公用同一個地址。不允許對共用體變量做初始化賦值,賦值只能在程序中進行。C、數組:整形數組、浮點型、字符型D、枚舉類型:enum
enumweekday{sun,mon,tue,wed,thu,fri,sat}enumweekdayworkday,week_end;兩個變量被定義成枚舉類型,那么他們的值只能是sun---sat之間一個workday=mon;week_end=sun;3.指針類型:*4、空類型5.1.2C語言的分支結構與循環結構分支結構if(表達式){語句1;}else{語句2;}switch/case語句switch(表達式){case常量表達式1:{語句1;}break;case常量表達式2:{語句2;}break;case常量表達式a:{語句a;}break;default{語句a+1;}switch(grade){case'A':/*注意,這里是冒號:并不是分號;*/printf("85-100\n");break;case'B':printf("70-84\n");break;case'C':printf("60-69\n");break;case'D':printf("<60\n");break;default:printf("error!\n");}應用舉例2.循環結構控制語句(1)while語句構成的循環 當while括號里的條件為真時就執行后面的語句while(條件表達式){語句;}
例:求n!,n<=100(作業)(2)for語句構成的循環在明確循環的次數下for語句是使用最靈活的循環控制語句,完全可以代替while語句for(表達式1;表達式2;表達式3){語句;}For(i=0;i<=5;i++){sum=sum+a[i];b[i]--;}數組是一組數據存儲位置,其中每個位置的名稱相同,存儲的數據類型相同。數組中的數據存儲位置被稱為數組元素。在使用數組時需要為其分配內存空間,例如:定義一個數組inta[num];需要在a數組放入num=5個整數,程序存儲內存就得分配5個int型大小的空間inta[5];在設計程序時要合理定義數組的大小以免造成浪費。數組一個非常常用的功能就是查表,比如記錄營業每個月份的開支,字形碼表,和程序一起固化在存儲器當中。2.1.3C語言的數組使用數組注意事項:數組元素從0開始編號,而不是從1開始,例如聲明一個數組inta[5];那么該數組的第一個元素為a[0]。數組與數組之間不能直接賦值例如:錯誤寫法inta[5]=b[5];如果數組之間要賦值,只能通過編程的方式進行賦值,正確寫法:for(i=0;i<num;i++){b[i]=a[i];}2.1.4C語言的指針指針是一個存儲計算機內存地址的變量。&運算符,獲取變量的地址.變量的指針:
變量的地址就是變量的指針。指向變量的指針變量:
存放變量地址的變量是指針變量,或者說指向另一個變量指針變量。
定義指針變量指針變量定義的一般形式:
類型名*標識符如:int*p;定義了一個指針變量p,它指向一個整型變量。系統處理:在定義一個指針變量p以后,系統為這個指針變量分配了一個存儲單元(4個字節),用它來存放地址。但此時該指針變量并未指向一個確定的變量,因為該指針變量中未輸入確定的地址。*要使一個整型的指針變量指向整型變量,必須將整型變量的地址賦給該指針變量。(1)指針變量前面的“*”,表示該變量的類型為指針型變量。
int*pointer_1,*pointer_2;
指針變量名是pointer_1、pointer_2,(2)在定義指針變量時必須指定基類型。(3)指向整型數據的指針變量表示為
int*,讀作,指向整型的指針或簡稱int指針(4)請牢記,指針變量中只能存放地址(指針),不將一個整型量(或任何其他非地址類型的數據)賦給一個指針變量。注意:指針類型作為形參時voidswap(int*a,int*b){intt=*a;*a=*b;*b=t;}思考:此次交換是存儲空間的內容交換還是數據交換函數:求兩數相除的返回值#include<stdio.h>intdivide(inta,intb,int*result);Void
main(){inta,b,result;scanf(“%d%d”,&a,&b);if(divide(a,b,&result))printf(“a/b=%d”,*result);elseprintf(“輸入有誤”);}intdivide(inta,intb,int*result){intret=1;//函數返回的狀態if(b==0)*result
=0;else{*result=a/b;}returnresult;}函數的返回值:求數組中元素的最大最小值#include<stdio.h>voidminmax(inta[],intlen,int*min,int*max);Void
main(){inta[]={1,2,3,4,5,6,88,140,255,423};intmin,max;minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);printf(“%d%d”,min,max);}注:sizeof(a)求出數組長度,單位字節;sizeof(a[0]求出一個元素占的字節數voidminmax(inta[],intlen,int*min,int*max){inti;*min=*max=a[0];for(i=1;i<len;i++){if(a[i]<*min){*min=a[i];}if(a[i]>*max){*max=a[i];}}}2.2C51的變量與常量1、變量的存儲種類要在程序中使用變量必須先用標識符作為變量名,并指出所用的數據類型和存儲模式,這樣編譯系統才能為變量分配相應的存儲空間。定義一個變量的格式如:[存儲種類]數據類型[存儲器類型]變量名;存儲種類和存儲器類型可以填寫也可以不填寫。c51變量的存儲種類一共有四種分別為:自動auto,靜態static,外部extern,寄存器register變量的存儲種類auto 自動變量(可以省略)動態存儲register寄存器變量動態存儲extern外部變量靜態存儲Static靜態變量靜態存儲auto自動變量:凡未加存儲類型說明的變量均為自動變量,自動變量可以省去auto。Register:為了提高運行速度,把局部變量值直接存儲在CPU的寄存器中不存儲在內存中(單片機中少有)register寄存器變量:各類變量都存放在存儲器里,當對一個變量頻繁讀寫時,必然要反復訪問存儲器,從而花費大量的存取時間。c提供了寄存器變量,這種變量存放在CPU的寄存器中,使用時不需要訪問內存,直接從寄存器中讀寫,可提高效率。#include<stdio.h>main(){ registerinti,s=0; for(i=1;i<200;i++){ s=s+i; printf("s=%d\n",s);}注意:只有局部自動變量和形式參數才可以定義為寄存器變量。寄存器變量靜態變量3.靜態變量有時希望函數中的局部變量的值在函數調用結束后不消失而保留原值,這時就應該指定局部變量為靜態局部變量,用關鍵字static進行聲明。打印1!到N!main(){intfactor();inti,n;printf("N=");scanf(“%d\n",&n);for(i=1;i<=n;i++)printf("%d!=%d\n",i,factor(i));}靜態變量舉例#include<stdio.h>
intsum(inta){autointc=0;staticintb=5;
c++;b++;
printf("a=%d,\tc=%d,\tb=%d\t",a,c,b);
return(a+b+c);}main(){inti;inta=2;for(i=0;i<5;i++)printf("sum(a)=%d\n",sum(a));
}運行結果a=2,c=1,b=6sum(a)=9a=2,c=1,b=7sum(a)=10a=2,c=1,b=8sum(a)=11a=2,c=1,b=9sum(a)=12a=2,c=1,b=10sum(a)=13外部型變量extern外部變量(即全局變量)是在函數的外部定義的,它的作用域為從變量定義處開始,到本程序文件的末尾。如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件末尾。如果在定義點之前的函數想引用該外部變量,則應該在引用之前用關鍵字extern對該變量進行“外部變量聲明”。表示該變量是一個已經定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量.用extern聲明外部變量,擴展程序文件中的作用域#include<stdio.h>
inti=5;//定義全局變量,并初始化
voidtest(void){printf("insubfunctioni=%d\n",i);}#include<stdio.h>
externi;//聲明引用全局變量i
intmain(void){printf("inmaini=%d\n",i);test();return0;}data:內部數據存儲器(00H-7FH)
bdata:內部數據存儲器(20H-2FH)idata:高128字節內部數據存儲器Pdata:外部RAM256字節單元Xdata:64K,由于裝入地址的位數不同,pdata區要比xdata區尋址要快。*其中:data:代表直接尋址的內部數據存儲器idata:代表間接尋址的內部數據存儲器。存儲器類型data區code區bdata區pdata區idata區建立C51存儲類型與存儲空間的對應關系【存儲種類】
數據類型
【存儲類型】
變量名(標準C)(標準C)*括號項——可以缺省(但需有缺省值)C51變量定義的四要素:(C51特有)(標準C+C51)【存儲種類】
數據類型
【存儲類型】
變量名數據的不同格式叫做數據類型標準C語言的數據類型C51擴充數據類型:bit、sfr或sfr16、sbitbit型關鍵詞bit用于定義一個位變量,語法規則:bit
bit_name
[=0或1];例如:bitdoor=0;//定義一個叫door的位變量且初值為0與標準C的變量定義相似:
inta=5;//定義一個初值為5的整形變量a//語法規則:intint_name[=常數];
sfr或sfr16型關鍵詞sfr或sfr16用于定義SFR字節地址變量,語法規則:
sfr
或
sfr16sfr_name=
字節地址常數;例如,sfrP0=0x80;//定義P0口地址80H
sfrPCON=0x87;//定義PCON地址87H
sfr16DPTR=0x82;//定義DPTR的低端地址82H注意:C語言中十六進制整數是數值前加0x或0X前綴sbit型CYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PD0^7
D7HD6HD5HD4HD3HD2HD1HD0HD0HPSWD0^6
D0^5
D0^4
D0^3
D0^2
D0^1
D0^0
兩種位地址表達形式:相對位地址、絕對位地址關鍵詞sbit用于定義SFR位地址變量,三種定義形式:1)將SFR的絕對位地址定義為位變量名
sbit
bit_name=
位地址常數;例如,sbitCY=0xD7;3)將SFR的相對位位置定義位變量名sbitbit_name=
sfr_name
^
位位置;例如,sbitCY=PSW^7;2)將SFR的相對位地址定義為位變量名
sbit
bit_name=
sfr字節地址
^
位位置;例如,sbitCY=0xD0^7;
使用sbit進行特殊功能位的定義:用一個已經聲明的特殊功能寄存器的地址作為sbit的基地址,“^”后數字范圍0~7,表示該寄存器的第幾位。sbit位名=特殊功能寄存器名^位置;例如:sfrPSW=0xD0;sbitCY=PSW^7;sbitAC=PSW^6;STC15.H數據結構定義舉例unsignedchardatasystem_status=0;
//定義system_status為無符號字符型自動變量,該變量位于data區中且初值為0。數據結構定義舉例位于片內RAM區無符號字符型自動型初值為零unsignedcharbdatastatus_byte;
unsignedintcodeunit_id[2]={0x1234,0x89ab};
staticcharm,n;
//定義status_byte為無符號字符型自動變量,該變量位于bdata區//定義unit_id[2]為無符號整型自動變量,該變量位于code區中,是長度為2的數組,且初值為0x1234和0x89ab。//定義m和n為2個位于data區中的有符號字符型靜態變量。
C-51的包含的頭文件通常有:STC15.hmath.hctype.hstdio.hstdlib.habsacc.h常用有:reg51.h(定義特殊功能寄存器和位寄存器);
math.h(定義常用數學運算);
#defineCBYTE((unsignedcharvolatilecode
*)0)#defineDBYTE((unsignedcharvolatiledata
*)0)#if!defined(__CX2__)#definePBYTE((unsignedcharvolatilepdata*)0)#endif#defineXBYTE((unsignedcharvolatilexdata*)0)
#defineCWORD((unsignedintvolatilecode
*)0)#defineDWORD((unsignedintvolatiledata
*)0)#if!defined(__CX2__)#definePWORD((unsignedintvolatilepdata*)0)#endif#defineXWORD((unsignedintvolatilexdata*)0)ABSACC.h_crol_
字符循環左移_cror_
字符循環右移
_irol_
整數循環左移
_iror_
整數循環右移
_lrol_長整數循環左移_lror_
長整數循環右移
Intrins.hC-51的運算符與C語言基本相同:+-*/
(加減乘除)>>=<<=
(大于大于等于小于小于等于)==!=
(測試等于測試不等于)&&||!
(邏輯與邏輯或邏輯非)>><<
(位右移位左移)&|(按位與按位或)^~(按位異或按位取反)與標準C語言基本相同:
if選擇語言
switch/case多分支選擇語言
while循環語言
do-while循環語言
for循環語言C51的基本語句
中斷服務程序函數名()interruptn
{}
㈨I/O口定義#include<absacc.h>#defineprotxbyte[0x1000]或用指針定義例1、清零程序(將2000H—20FFH的內容清零)
★C-51程序
#include<reg51.h>
//#defineucharunsignedcharmain(){inti;unsignedcharxdata*p=0x2000;
/*指針指向2000H單元*/for(i=0;i<256;i++){*p=0;p++;}/*清零2000H-20FFH單元*/}★例2:查找零的個數C-51程序#include<reg51.h>main(){unsignedcharxdata*p=0x2000;/*指針p指向2000H單元*/intn=0,i;for(i=0;i<16;i++){if(*p==0)n++;/*若該單元內容為零,則n+1*/p++;/*指針指向下一單元*/}p=0x2100;/*指針p指向2100H單元*/*p=n;/*把個數放在2100H單元中*/}例3:將外部存儲器的000BH和000CH單元的內容互換(C51)使用absacc.h頭文件進行絕對地址的訪問,也可以用指針編程。#include<absacc.h>Voidmain()unsignedcharc;While(1){
c=XBYTE[11];XBYTE[11]=XBYTE[12];XBYTE[12]=C}例4、將1字節的二進制數轉換成3個十進制數(BCD碼)并存入20H開始的單元中Voidmain(){unsignedchar*p=0x0020;Unsignedcharnumber=123;*p=number/100;P++;*p=(number%100)/10;P++;*p=(number%100)%10;}舉例:LED閃爍控制功能預處理命令---------函數說明------------全局變量定義------
主函數------------自定義函數---------局部變量定義---------
程序體
程序體------方法1:用if語句實現。#include“reg51.h”voidmain(){chara;while(1)
{a=P1;a=a&0x03;//屏蔽高6位if(a==0)P1=0xe3;elseif(a==1)P1=0xd3;elseif(a==2)P1=0xb3;elseP1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新解讀《CB-T 3887-1999小艇 舷內機槳軸端和槳轂》新解讀
- 新解讀《CB-T 3864-1999船用移動式濾油裝置》新解讀
- 新解讀《CB-T 23-1999船用放泄螺塞》新解讀
- 自然資源法規農村建房和房屋翻建需辦理相關手續二篇
- 3.2.3 呼吸作用(方案1)課件 人教版(2024)七年級下冊
- Brand KPIs for health insurance:Reliance in India-英文培訓課件2025.4
- Brand KPIs for neobanking Hey Banco in Mexico-英文培訓課件2025.4
- 呼叫中心培訓管理制度
- 培訓學校三防管理制度
- 物理中考二輪復習教案 8實驗專題1(力學)
- 美國船級社(ABS)材料與焊接規范
- 酒類考試題及答案大全
- 職高歷史考試題及答案
- 土地復墾整治合同協議
- GB/T 6516-2025電解鎳
- 共享菜園可行性研究報告
- 2025年全國低壓電工證(復審)考試筆試試題(300題)含答案
- 定制拆單合同協議
- 榆林市煤炭資源整合實施方案
- 前程無憂測評題庫
- 日語四六級的試題及答案
評論
0/150
提交評論