單片機 c語言例題_第1頁
單片機 c語言例題_第2頁
單片機 c語言例題_第3頁
單片機 c語言例題_第4頁
單片機 c語言例題_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、 1設有一組數(shù)據(jù)72,27,18,29,26,63,112,98,12,6,被定義在內(nèi)部數(shù)據(jù)存儲器中,用C51編程,將其拷貝到外部數(shù)據(jù)存儲器中,并分別找出最大數(shù)與最小數(shù)存入外部數(shù)據(jù)存儲器的max和min單元。 #include<reg51.h> #include<absacc.h> #define max XBYTE 0x1000 #define min XBYTE 0x1001 unsigned char tab=72,27,18,29,26,63,112,98,12,6; void main() unsigned int i,add=0x40; for(i=0;i&

2、lt;10;i+) XBYTEadd+i=tabi; max=XBYTEadd; min=XBYTEadd; for(i=0;i<10;i+) if(XBYTEadd+i>max) max=XBYTEadd+i; if(XBYTEadd+i<min) min=XBYTEadd+i; while(1); 2. 設有一組數(shù)據(jù)0x21,0x34,0x91,0x01,0x65,0x87,0x98,0x31,0x63,0x90,被定義在內(nèi)部數(shù)據(jù)存儲器中,用C51編程,將其拷貝到外部數(shù)據(jù)存儲器中,并求其累加和從P1口輸出。 #include<reg51.h> #include

3、<absacc.h> unsigned char tab=0x21,0x34,0x91,0x01,0x65,0x87,0x98,0x31,0x63,0x90; void main() unsigned int i,add0=0x40; unsigned char addx=0; for(i=0;i<10;i+) XBYTEadd0+i=tabi; addx+= tabi; P1=addx; while(1) ; 3設有一組數(shù)據(jù)0x6a,0x12,0x4d,0x51,0xc9,被定義在內(nèi)部數(shù)據(jù)存儲器中,用C51編程,分別將其轉(zhuǎn)換成ASCII并存儲到外部數(shù)據(jù)存儲器0050H開始的

4、單元中。 #include<reg51.h> #include<absacc.h> #define dy 0x50 unsigned char a=0x6a,0x12,0x4d,0x51,0xc9; void main() unsigned char i,j; for(j=0;j<5;j+) i=aj/16; if(i<10) XBYTEdy+2*j=0x30+i; else XBYTEdy+2*j=0x37+i; i=aj%16; if(i<10) XBYTEdy+2*j+1=0x30+i; else XBYTEdy+2*j+1=0x37+i; wh

5、ile(1); 4設有一組數(shù)據(jù)12,34,76,54,23,87,14,62,19,6,被定義在內(nèi)部數(shù)據(jù)存儲器中,用C51編程,先將其拷貝到內(nèi)部數(shù)據(jù)存儲器30H開始單元中,然后將其從小到大排序。 #include<reg51.h> #include<absacc.h> unsigned char tab=12,34,76,54,23,87,14,62,19,6; void main() unsigned int i,j,a; unsigned char *add0 ; add0=0x30; for(i=0;i<10;i+) *(add0+i)=tabi; for(

6、i=0;i<10;i+) for(j=i+1;j<10;j+) if(*(add0+i)>*(add0+j) a=*(add0+j); *(add0+j)=*(add0+i); *(add0+i)=a; while(1) ; 5: 外部中斷0引腳(P3.2)接一個開關,P1.0接一個發(fā)光二極管。開關閉合一次,發(fā)光二極管改變一次狀態(tài)。本例解決外部中斷如何應用。#include “reg51.h”#include “intrins.h” sbit p10=P10;void delay(void) int a=5000; while(a)_nop_();void int_srv(v

7、oid)interrupt 0 using 1 delay();if(INT0=0) P10= P10;while(INT0=0); void main() P10=0; IT0=1 EA=1; EX0=1;while(1); 6: 從P1.0輸出方波信號,周期為50ms。設單片機的focs=6MHz。本例解決定時器及其中斷的應用。#include “reg51.h”void main() TMOD=0x01; TH0=(6553612500)/256; TL0=(6553612500)%256; ET0=1; EA=1; TR0=1; while(1); void T0_srv(void)i

8、nterrupt 1 using 1 TH0=(6553612500)/256; TL0=(6553612500)%256; P10=P10;7設晶振頻率為6MHZ,要求在單片機的P2.7口上輸出周期為1秒的連續(xù)方波信號, 用定時器中斷方式定時,請用C語言編程實現(xiàn)該功能。 #include<reg51.h> sbit D1=P27; unsigned char Countor; void main(void) EA=1; ET0=1; TMOD=0X01; TH0=(65536-25000)/256; /定時50ms TL0=(65536-25000)%256; TR0=1; wh

9、ile(1); void Time0(void) interrupt 1 using 0 Countor+; if(Countor=10) D1=D1; Countor=0; TH0=(65536-25000)/256; TL0=(65536-25000)%256; 8:如圖所示,單片機擴展可編程接口芯片8155,8155PA口控制8只發(fā)光二極管,形成走馬燈,每位點亮的時間為0.5秒。單片機晶振為6 MHZ8155的端口地址如下:命令口地址(COM8155):FEF8HPA口地址(PA8155):FEF9HPB口地址(PB8155):FEFAHPC口地址(PC8155):FEFBH#inclu

10、de “reg51.h”#include “absacc.h”#define COM8155 XBYTE0xfef8#define PA8155 XBYTE0xfef9void delay(void) /*延時1ms*/ TMOD=0X01 TH0=(65536500)/256; TL0=(65536500)%256; TR0=1; while(TF0); TF0=0; TR0=0;main() unsigned int i; char disp_word=0x01; /*從第1位開始點亮*/ COM8155=0x01; /*初始化8155*/ do PA8155= disp_word;/*輸

11、出去點亮一位*/ for(i=0;i<500;i+) /*點亮0.5秒 */ delay(); disp_word= disp_word<<1; /*左移控制字,準備點亮下一位*/ if(disp_word=0)disp_word=0x01; whlie(1);9: 獨立鍵盤,用C語言實現(xiàn)。 如圖所示,P1.0P1.3分別接開關S1S4。S1按下時使外部20H單元內(nèi)容加1;S2按下時使外部20H單元內(nèi)容減1;S3按下時使外部20H單元內(nèi)容清零;S4按下時使外部20H單元內(nèi)容全1。用C51編程實現(xiàn)該功能,要求有10ms去抖動功能。系統(tǒng)晶振12 #include “reg51.h

12、”#include “absacc.h”void delay(void) /*延時1ms*/ TMOD=0X01 TH0=(655361000)/256; TL0=(655361000)%256; TR0=1; while(!TF0); TF0=0; TR0=0;main()char x,i; P1=0xff; loop: x=P1; x=x&0x0f; if(x=0f)goto loop; for(i=0;i<10;i+) /*延時10ms去抖動*/ delay(); x=P1; x=x&0x0f; if(x=0f)goto loop; switch(x) case 0

13、x0E:PBYTE0x20= PBYTE0x201;break;/*20單元加1*/ case 0x0D:PBYTE0x20= PBYTE0x201;break;/*20單元減1*/ case 0x0B:PBYTE0x20= 0x00;break;/*20單元清0*/ case 0x07:PBYTE0x20= 0xff; /*20單元置全1*/ goto loop; 10設晶振頻率為6MHZ,一個共陽數(shù)碼管的各段接P2口,公共端接VCC。希望在數(shù)碼管上顯示09計數(shù),一秒鐘數(shù)字加1,一秒時間用定時器0定時實現(xiàn),請用C語言編程實現(xiàn)該功能。共陽數(shù)碼管09的段碼表為:0xc0,0xf9,0xa4,0x

14、b0,0x99,0x92,0x82,0xf8,0x80,0x90。 unsigned char code Tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ; void main() unsigned char i=0; unsigned char Countor; TMOD=0x01; TH0=(65536-25000)/256; TL0=(65536-25000)%256; /定時50ms,1s=20*50ms TR0=1; Countor=0; while(1) Countor+; while(TF0=0); TF0=0; if(

15、Countor=20) P2=Tabi; i+; if(i>9) i=0; Countor=0; 11.動態(tài)共陰顯示,用C語言實現(xiàn)。單片機晶振為6MHZ #include “reg51.h”#include “intrins.h”char code dispdata =0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;char dis_dat4;void delay(void) /*延時1ms*/TH0=(65536500)/256;TL0=(65536500)%256;TR0=1;while(!TF0);TF0=0;TR0=0;void

16、 disp(char ch1) /*顯示函數(shù)*/ static char ch=0x01; P1=ch; /*送位碼 P2=dispdatadis_datch1; ch=ch<<1; if(ch=0x10)ch=0x01; main() char ch1; TMOD=0x01; while(1) for(ch1=0;ch1<4;ch1+) /*對四位LED掃描一遍*/ disp(ch1); delay(); delay(); delay(); 12設晶振頻率為12MHZ,用定時器T1中斷控制兩個LED以不同周期閃爍,用C語言編程實現(xiàn)該功能。 #include<reg51

17、.h> sbit D1=P20; /將D1位定義為P2.0引腳 sbit D2=P21; /將D2位定義為P2.1引腳 unsigned char Countor1; /設置全局變量,存儲定時器T1中斷次數(shù) unsigned char Countor2; /設置全局變量,存儲定時器T1中斷次數(shù) void main(void) EA=1; ET1=1 TMOD=0x10; TH1=(65536-50000)/256; /定時50ms TL1=(65536-50000)%256; TR1=1; Countor1=0; /從0開始累計中斷次數(shù) Countor2=0; /從0開始累計中斷次數(shù) w

18、hile(1); void Time1(void) interrupt 3 using 0 / Countor1+; /Countor1自加1 Countor2+; /Countor2自加1 if(Countor1=2) /若累計滿2次,即計時滿100ms D1=D1; /按位取反操作,將P2.0引腳輸出電平取反 . Countor1=0; if(Countor2=8) /若累計滿8次,即計時滿400ms D2=D2; /按位取反操作,將P2.1引腳輸出電平取反 Countor2=0; TH1=(65536-50000)/256; TL1=(65536-50000)%256; 13設LED指示

19、燈為低電平點亮, P1口輸出控制8只LED跑馬燈,用C語言編程實現(xiàn)。 #include<reg51.h> void delay(void) unsigned char i,j; for(i=0;i<250;i+) for(j=0;j<250;j+) ; void main(void) while(1) p1=0xfe; delay(); p1=0xfd; delay(); p1=0xfb; delay(); p1=0xf7; delay(); p1=0xef; delay(); p1=0xdf; delay(); p1=0xbf; delay(); p1=0x7f; d

20、elay(); 14.如圖所示,對8個通道輪流采集一次,采集的結(jié)果放在數(shù)組ad中。#include “reg51.h”#include “absacc.h”sbit ad_busy=P32;main()static char idata ad8;char i;char pdata *ad_chl;ad_chl=0x78;/*設置初始通道地址*/for(i=0;i<8;i+)*ad_chl=0; /*啟動A/D轉(zhuǎn)換*/i=i;/*等待EOC信號變低*/i=i;while(ad_busy=1);/*查詢*/adi=*ad_chl;/*存放結(jié)果*/ad_chl+ ; while(1);15:如

21、圖所示,要求DAC0832輸出鋸齒波電壓信號,信號周期自由,用C語言寫出相應程序。 #include “reg51.h”#include “absacc.h”#define DA0832 PBYTE0x7fvoid delay(void) unsigned char i,j; for(i=0;i<250;i+) for(j=0;j<250;j+) main()char i;do for(i=0;i<255;i+)DAC0832=i; delay(); while(1);16:編寫一個計數(shù)器程序,將T0作為計數(shù)器來使用,對外部信號計數(shù),將計數(shù)字顯示在數(shù)碼管上。 #include

22、 "reg51.h" #define uchar unsigned char #define uint unsigned int uchar code BitTab=0x7F,0xBF,0xDF,0xEF,0xF7,0xFB;/位驅(qū)動碼 uchar code DispTab=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF;/字形碼 uchar DispBuf6; /顯示緩沖區(qū) void Timer1() interrupt 3 uchar tmp; St

23、atic uchar Count; /計數(shù)器,顯示程序通過它得知現(xiàn)正顯示哪個數(shù)碼管 TH1=(65536-3000)/256; TL1=(65536-3000)%256; /重置初值 tmp=BitTabCount; /取位值 P2=P2|0xfc; /P2與11111100B相或 P2=P2&tmp; /P2與取出的位值相與 tmp=DispBufCount;/取出待顯示的數(shù) tmp=DispTabtmp; /取字形碼 P0=tmp; Count+; if(Count=6) Count=0; void main() uint tmp; P1=0xff; P0=0xff; TMOD=0

24、x15; /定時器0工作于計數(shù)方式1,定時器1工作于定時方式1 TH1=(65536-3000)/256; TL1=(65536-3000)%256; /定時時間為3000個周期 TR0=1; /計數(shù)器0開始運行 TR1=1; EA=1; ET1=1; for(;) tmp=TL0|(TH0<<8);/tmp=TH0*256+TL0取T0中的數(shù)值 DispBuf5=tmp%10; tmp/=10; DispBuf4=tmp%10; tmp/=10; DispBuf3=tmp%10; tmp/=10; DispBuf2=tmp%10; DispBuf1=tmp/10; DispBuf0=0; 17:矩陣鍵盤掃描。 p3.7p3.4是行線,用于輸出。P3.3P3.0是列線,用于輸入。 #include "at89x52.h" typedef unsigned char uchar; typedef unsigned int uint; void mDelay(uint j) uint i; for(;j>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論