日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机期末复习代码

發(fā)布時間:2024/7/23 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机期末复习代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、左右來回循環(huán)的流水燈的電路連接見圖4-6,顯示規(guī)律如圖4-7。實(shí)現(xiàn)本任務(wù)要求,可以有多種軟件實(shí)現(xiàn)方法。下面列出了3種,具體如下

  • 數(shù)組的字節(jié)操作實(shí)現(xiàn)

#include <reg51.h>

???????? #define uchar unsigned char??????????? ? ?????????????

???????? uchar tab[16 ]={ 0xfe , 0xfd , 0xfb , 0xf7 , 0xef , 0xdf , 0xbf , 0x7f ,0xbf ,0xdf , 0xef , 0xf7 , 0xfb , 0xfd, 0xfe,0xff};/*前8個數(shù)據(jù)為左移點(diǎn)亮數(shù)據(jù),后8個為右移點(diǎn)亮數(shù)據(jù)*/

void? delay(uchar k)

{??????? uchar i,j;

???????? for(i = 0; i < k; i++);

???????? for(j = 0; j < 110; j++);

}

void? main(? )???????????????????????????????????????????? /*主函數(shù)*/

{??????? uchar i;

???????? while (1)

???????? {??????? for(i = 0; i < 15; i++);

?????????????????? {??????? P1=tab[i];

??????????????????????????? delay( );}}}

  • 移位運(yùn)算符實(shí)現(xiàn)

???????? #include <reg51.h>

???????? #define uchar unsigned char??????????? ? ??????????????????????

void? delay(uchar k)

{??????? uchar i,j;

???????? for(i = 0; i < k; i++);

???????? for(j = 0; j < 110; j++);

}

???????? void? main(? )???????????????????????????????????????????? ??? /*主函數(shù)*/

{??????? uchar i,temp;

?????????????????? while (1)

???????? {??????? temp=0x01;?????????????? ?????? /*左移初值賦給temp*/

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

{P1=~temp;?????????????????????????? /* temp取反后送P1口*/

???????? delay(? );

???????? temp=temp<<1; }????????????? /* temp 中數(shù)據(jù)左移一位,最右位用0填*/

???????? temp=0x80; ??????????? ??????????????/*賦右移初值給temp*/

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

{??????? P1=~temp;??????????????????????? /* temp取反后送P1口 */

???????? delay(? );

???????? temp=temp>>1; ????????????? /* temp 中數(shù)據(jù)右移一位*/

}

???????? }

?????????????????? }

  • 用移位函數(shù)實(shí)現(xiàn)

#include <reg51.h>

#include <intrins.h>?????????????????? /*包含左、右移位函數(shù)的頭文件*/

#define uchar unsigned char??????????? ? ??????????????????????

void? delay(uchar k)

{??????? uchar i,j;

???????? for(i = 0; i < k; i++);

???????? for(j = 0; j < 110; j++);

}

void? main(? )????????????????????????? /*主函數(shù)*/

{??????? uchar i,temp;

???????? while (1)

???????? {??????? temp=0xfe;????? ?????? /*初值為0x11111110*/

for(i=0; i< 7; i++);????

???????? {??????? P1=temp;????????? /* temp 值送入P1口*/

?????????????????? delay(? ); ??????????????? /*延時*/

?????????????????? temp=_crol_( temp,1) ;?? /*執(zhí)行左移函數(shù),temp 中的數(shù)據(jù)循環(huán)

?????????????????????????????????????????????????????? 左移1位*/

??????????????????????????? }

???????? for(i=0; i<7; i++);?????

???????? {??????? P1=temp;????????? /* temp 值送入P1口*/

?????????????????? delay(? ); ??????????????? /*延時*/

?????????????????? temp=_cror_( temp,1) ;? /*執(zhí)行右移函數(shù),temp中的數(shù)據(jù)循環(huán)右

??????????????????????????????????????????????????? 移1位*/

?????????????????? }

???????? }

}

2、開關(guān)量檢測指示器2,AT89S51單片機(jī)P1.0P1.1引腳接有兩只開關(guān)S0S1,兩只引腳上的高低電平共有4種組合,這4種組合分別點(diǎn)亮P2.0P2.3引腳控制的4LEDLED0LED3 (高電平點(diǎn)亮),編程實(shí)現(xiàn)此功能

#include <reg51.h>????????? ???????????? /* 包含頭文件reg51.h */

void? main(? )??????????????????????????????????? /* 主函數(shù)main( )* /

{??????? char? state;

While(1)

???????? {??????? P1=0xff;????????????????????? /* P1口為輸入* /

?????????????????? state=P1;????????? ?? /* 讀入P1口的狀態(tài),送入a* /

?????????????????? state=state&0x03;??????????? ?? /* 屏蔽P1口的高6位* /

?????????????????? switch ( state ) * 判斷P1口的低2位的狀態(tài)* /

{case 0: P2=0x01; break; /* P1.1、P1.0=00,點(diǎn)亮P2.0腳LED */

case 1: P2=0x02; break;? /* P1.1、P1.0=01,點(diǎn)亮P2.1腳LED */

case 2: P2=0x04; break;? /* P1.1、P1.0=10,點(diǎn)亮P2.2腳LED */

case 3: P2=0x08; ???????????? /* P1.1、P1.0=11,點(diǎn)亮P2.3腳LED */

}}

3、時鐘:8Led 動態(tài)顯示,共陽,無校準(zhǔn)電子表

P0.0~7輸出段碼數(shù)據(jù),P1.07輸出位選信號*/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar dis_buff[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};//顯示緩存區(qū)時高位低位、分高位低位、秒高位低位

uchar code position[8]={0x01,0x02,0x04,0x08,0x10,0x20};//位選信號

uchar code table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//共陽碼

uchar int_time;??????????????????????????????????? //*定義中斷次數(shù)變量*/

uchar second;?????????????????????????????????????? /*秒計(jì)數(shù)變量*/

uchar minute;?????????????????????????????????????? /*分計(jì)數(shù)變量*/

uchar hour;??????????????????????????????????????????? /*小時計(jì)數(shù)變量*/

void delay(uint t)

{uchar i,j;

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

for(j=0;j<120;j++);}

void time_to_disbuff(uchar s, uchar m,uchar h )

{ //修改時分秒顯示緩沖區(qū)數(shù)據(jù)

? ???? dis_buff[0]=h/10;???? //保存時到顯示緩存區(qū)

???????? dis_buff[1]=h%10;

? ???? dis_buff[3]=m/10; //保存分到顯示緩存區(qū)

???????? dis_buff[4]=m%10;

???????? dis_buff[6]=s/10;? //保存秒到顯示緩存區(qū)

???????? dis_buff[7]=s%10;

}

void display(void)

{?? uchar i;

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

???????? ?{

???????? ? ???? if (i==2|i==5)

?????????????????? {

?????????????????? ?P0=table[10]//seg,時和分后顯示點(diǎn)

?????????????????? ?P1=position[i];??????? ? //pos

?????????????????? }

?????????????????? else

?????????????????? {

?????????????????? P0=table[dis_buff[i]];??????? //seg

?????????????????? P1=position[i]; ? //pos

???????? ??????? }

?????????????????? delay(2);//2ms

?????????????????? P1=0x00;//注意!!!

???????? ?}?????

}????????????????

void main()

{

???????? P0=0x00;

???????? P1=0x00;

???????? TMOD=0x01;????????????????????????????????????????????????? /*T0方式1*/

??????? EA=1;??????????? ???????????????????????????????????????????? /* 開總中斷 */

??????? ET0=1; ?????????????????????????????????????????????????????????? /* 開T0中斷 */

??????? TH0=(65536-50000)/256=0x3c;????????????????????????? /*置T0初值*/

??????? TL0=(65536-50000)%256=0xb0;

??????? TR0=1;

??????? int_time=0;???????????????????????????????????????????????????? /*中斷次數(shù)時分秒清0*/

??????? second=0;

??????? minute=0;

??????? hour=0;

???????? while(1)

???????? {

?????????????????? time_to_disbuff(second ,minute, hour);

?????????????????? display();

???????? }

}

void? T0_interserve(void)? interrupt 1? using 1 ??????? /*T0中斷服務(wù)程序*/

{??????? TH0=(65536-50000)/256=0x3c;????????????????????????? /*置T0初值*/

??????? TL0=(65536-50000)%256=0xb0;

int_time++;???????????????????????????????????????????????????? /*中斷次數(shù)1*/

??????? if(int_time==20) ??????????????????????????????? /*中斷次數(shù)滿20*/

???????????????? { int_time=0; ???????????????????????????? /*中斷次數(shù)清0*/

?????????????????????????? second++;???????????????????????????????????? /*秒加1*/

???????????????? }

???????????????? if(second==60)????????????????????????????????????? /*滿60s*/

???????????????? { second=0; ???????????????????????????????????????? /*秒計(jì)數(shù)器清0*/

?????????????????????????? minute ++;?????????????????????????????????? /*分計(jì)數(shù)器加 1*/

???????????????? }

???????????????? if(minute==60)????????????????????????????????????? /*滿60分?*/

???????????????? { ????? minute=0;???????????????????????????????????? /*分計(jì)數(shù)器清0*/

?????????????????????????? hour ++;??????????????????????????????????????? /*時計(jì)數(shù)器加1*/

???????????????? }

???????????????? if(hour==24)

???????????????? { ????? hour=0;???????????????????????????????????????? /*時計(jì)數(shù)器滿24,清0*/

???????????????? }

}

4、將外部RAM8000H開始的10個字節(jié)的內(nèi)容送入內(nèi)部RAM50H開始的10個字節(jié)中。

#include<reg51.h>

data unsigned char nram50[10] _at_ 0x50;

xdata unsigned char nram8000[10] _at_ 0x8000;

?void main() {

?unsigned char i;

?for(i=0;i<10;i++)

??? {

????? nram8000[i]=i;

???????? ? nram50[i]=nram8000[i];

??? }

???????? ????? while(1);

?}

5、將內(nèi)部RAM30H~39H的10個字節(jié)的內(nèi)容移至35H開始的連續(xù)10個字節(jié)中。

#include<reg51.h>

data unsigned char nram30[10] _at_ 0x30;

?void main() {

?unsigned char i;

?for(i=0;i<10;i++)

??? {

????? nram30[i]=i;

??? }

???????? for(i=10;i>0;i--)

???????? {

???????? ? nram30[i+4]=nram30[i-1];

???????? }

???????? ????? while(1);

?}

7、流水燈(定時:中斷、查詢)

  • 無開關(guān)控制

/********流水燈:定時控制,1s循環(huán)左移,循環(huán)右移,采用中斷和查詢兩種方式************/

/********2018/6/23***********/

/********JZ************/

#include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

uint i;

void main()

{

? TMOD=0x01;//定時器的方式控制字,定時/計(jì)數(shù)器工作于方式1,0000_0001

? TH0=0xd8;

? TL0=0xf0;??? //定時10ms,系統(tǒng)周期為12MHZ,1us,2^16-10ms/1us=65536-10000=55536=d8f0H

? EA=1;??????? //允許總中斷

? ET0=1;?????? //允許定時器T0中斷

? TR0=1;????? //啟動定時器T0????????

? P0=0xfe;??? //初始化燈的狀態(tài),為第一盞燈亮,其他燈不亮

? while(1);

? }

void time0_int(void) interrupt 1? //定時器0引發(fā)的中斷函數(shù)

{

? TH0=0xd8;

? TL0=0xf0;??????? //定時/計(jì)數(shù)器每次都需要重載初值

? i++;

???????? if(i==100)?? //循環(huán)100次,及達(dá)到了1s

?????????????????? {i=0;P0= _crol_(P0,1); } }//1s之后P0左移1位,循環(huán)點(diǎn)亮,間隔時間為1s

/*//P0=0x7f; P0= _cror_(P0,1);//燈初始化為第7盞燈亮,循環(huán)右移,從下往上

//P0=0xfe; P0= _crol_(P0,1);//燈初始化為第0盞燈亮,循環(huán)左移,從上往下

for(;;) //查詢方式定時,放在主函數(shù)里面

? {

? if(TF0)??? //判斷溢出標(biāo)志位是否為1,為1則計(jì)數(shù)到

? {i++;

TH0=0xd8;TL0=0xf0; TF0=0;???? //將溢出標(biāo)志位軟件清0

? if(i==100)? //循環(huán)100次,及達(dá)到了1s

? {

? P0= _crol_(P0,1);

??i=0;

? } }}*/

  • 有開關(guān)控制

/****流水燈:定時控制,兩個定時器,當(dāng)按下K1時,采用T0定時,當(dāng)按下K2時,采用T1定時************/

/********2018/6/24***********/

/********JZ************/

#include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

uint i;

sbit P1_0=P1^0;??

sbit P1_1=P1^1;?? //定義并口P1的第0、1位

void main()

{TMOD=0x11;? //定時器0、1均采用方式1工作

TH0=0x3c;

TL0=0xb0;

TR0=0;//初始化后并不啟動定時器T0,待命初值為100ms

TH1=0x9e;?

TL1=0x58;

TR1=0;//初始化后并不啟動定時器T1,待命初值為50ms

i=0;

P0=0xff;? //上電時, 8個發(fā)光二極管全亮

while(1)

{if(P1_0==0)? //當(dāng)P1.0有效時,及開關(guān)K1按下

{?? EA=1;???

??? TR1=0;//關(guān)閉定時器1

??? TR0=1;?? ET0=1;//允許中斷0,打開定時器0

P0=0x7f; }// 給燈賦初值,第8個燈亮

if(P1_1==0)? //當(dāng)P1.1有效時,及開關(guān)K2按下

{?? EA=1;??

??? TR0=0;? //關(guān)閉定時器0

??? TR1=1;? ET1=1;? //允許中斷1,打開定時器1

??? P0=0xfe; }}}??? // 給燈賦初值,第1個燈亮

void time0_int(void) interrupt 1?? //定時器0中斷服務(wù)程序1

{ TH0=0x3c;?? TL0=0xb0;?? //每次定時都需要重新賦初值

i++;?????? //計(jì)數(shù)加1

if(i==20)

{ i=0; P0= _cror_(P0,1);}}??????????????? //循環(huán)右移(向上)1位,點(diǎn)亮下一個燈共定時2s

void time1_int(void) interrupt 3

{ TH1=0x9e;TL1=0x58; //每次定時都需要重新賦初值

i++;

if(i==20)

{i=0;

P0= _crol_(P0,1);}} //循環(huán)左移(向下)1位,點(diǎn)亮下一個燈共定時1

8、獨(dú)立式鍵盤

/********獨(dú)立式鍵盤************/

/********2018/6/23***********/

/********JZ************/

#include<reg51.h>

#define uchar unsigned char

sbit K0=P1^0;??????????????? //定義位變量

sbit K1=P1^1;

sbit K2=P1^2;

sbit K3=P1^3;

sbit D0=P2^0;

sbit D1=P2^1;

sbit D2=P2^2;

sbit D3=P2^3;

/************延時函數(shù)************/

void? delay(uchar k)???????

{

uchar i,j;

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

for (j=0;j<110;j++);//11.0592M晶振,大約延時1ms

}

void main()

{

if (K0==0)

{

???????? delay(10);//延時10ms延時去抖

???????? if(K0==0) {D0=0;D3=1;} //下一個燈亮,上一個燈滅

}

if (K1==0)

{

???????? delay(10);

???????? if(K1==0) {D1=0;D0=1;}??

}

if (K2==0)

{

???????? delay(10);

???????? if(K2==0) {D2=0;D1=1;}

}

if (K3==0)

{

???????? delay(10);

???????? if(K3==0) {D3=0;D2=1;}

}}

9、LED

  • 無8255

/********LED燈顯示,無8255,P0口輸出段選碼,P2口輸出位選碼***********/

/********2018/6/23***********/

/********JZ************/

/*共陰極,逐位輪流點(diǎn)亮各個LED,每一位保持3ms,在15~20ms之內(nèi)再一次點(diǎn)亮,重復(fù)不止*/

#include<reg52.h>

#define uchar unsigned char

uchar?? buf[8]={0,1,2,3,4,5,6,7};//定義顯示緩沖區(qū),buf[]數(shù)組里面的數(shù)表示段碼送的數(shù),可以更改,顯示其他的數(shù)

uchar?? LED[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //字符為0~F

uchar?? scan [8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位選碼表

void??? delay(uchar k)???????

{

uchar i,j;

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

for (j=0;j<110;j++);//11.0592M晶振,大約延時1ms

}

void disp()

{

uchar i;

for(i=0;i<8;i++)?? //8位顯示,共陰極

{

???????? P2=scan[i];????????? //位碼送P2口

? P0=LED[buf[i]];????? //段碼送P0口

? delay(3);??????????? //延時3ms

}?

}

void? main(void)

{

while(1)

{

disp();???????????? //設(shè)顯示函數(shù)

}

}

  • 有8255

/********LED燈顯示,有8255,P0口輸出段選碼,P2口輸出位選碼A口、B口C口和控制口的地址分別為7F00H、7F01H、7F02H和7F03H(高8位地址線未用的取1,低8位地址線未用的取0)************/

/********2018/6/23***********/

/********JZ************/

#include? <reg51.h>

#include? <absacc.h>??????? //定義絕對地址訪問

#define? uchar unsigned? char

#define? uint unsigned? int

void? delay(uchar k);?????????? //聲明延時函數(shù)

void? display(void);??????? //聲明顯示函數(shù)

uchar disbuffer[8]={0,1,2,3,4,5,6,7};? //定義顯示緩沖區(qū)

uchar codevalue[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //字符為0~F

uchar chocode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位選碼表

void? main(void)

{

XBYTE[0x7f03]=0x80;?????? //8255A初始化

while(1)

{

display();?????????????????? //設(shè)顯示函數(shù)

}

}

void? delay(uchar k)???????

{

uchar i,j;

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

for (j=0;j<110;j++);//11.0592M晶振,大約延時1ms

}

/***********顯示函數(shù)***********/

void? display(void)?????? //定義顯示函數(shù)

{

uchar i,p,temp;

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

{

temp=chocode[i];??????????? //取當(dāng)前的位選碼

XBYTE[0x7f01]=temp;??????? //送出位選碼

p=disbuffer[i];???????????? //取當(dāng)前顯示的字符

temp=codevalue[p];???????? //查得顯示字符的字段碼

XBYTE[0x7f00]=temp;??????? //送出字段碼

delay(2);?????????????????? //延時1ms

}}

10、定時器:產(chǎn)生方波

/********產(chǎn)生周期為500us的方波************/

/********2018/6/23***********/

/********JZ************/

#include<reg51.h>

sbit P1_0=P1^0;

void main()

{

TMOD=0x02;

TH0=0x06;//定時250us,2^8-250us/1us=6

TL0=0x06;

EA=1;

ET0=1;

TR0=1;

while(1);

}

void time0_int(void) interrupt 1

{

P1_0=!P1_0;

}

/*查詢方式

#include<reg51.h>

sbit P1_0=P1^0;

void main()

{

TMOD=0x02;//定時器工作于方式2

TH0=0x06;//定時250us,2^8-250us/1us=6

TL0=0x06;

EA=1;

ET0=1;

TR0=1;

for(; ;)

{

???????? if(TF0)

???????? {

???????? TF0=0;P1_0=!P1_0;}

}

}*/

11、中斷

/********外部中斷0:在單片機(jī)外中斷0引腳接一個單脈沖源作為外部輸入信號,通過發(fā)光二極管顯示中斷次數(shù)************/

/********2018/6/24***********/

/********JZ************/

#include<reg52.h>?

#include<intrins.h>???

#define uint unsigned int?

#define uchar unsigned char

uchar b=0;?

void? delay(uchar k)???????

{

uchar i,j;

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

for (j=0;j<110;j++);//11.0592M晶振,大約延時1ms

}

void main()//主函數(shù)

{

???? P0=0xff; //初始化燈,初始狀態(tài)為全滅

???? INT0==1;//打開外部中斷0

???? EA=1;?? //開總中斷

???? EX0=1;?? //允許中斷0

???????? ?IT0=1;? //設(shè)置外部中斷0邊沿觸發(fā)

???????? ?while(1);

?}

void srv_INT0() interrupt 0??? //中斷服務(wù)程序

{

?? b=b+1;??

?? P0=0xff-b;? //proteus仿真中低電平燈亮,則P0不能直接等于計(jì)數(shù)的b,需要用0xff-b,才能使燈亮滅

?? delay();

?}

總結(jié)

以上是生活随笔為你收集整理的单片机期末复习代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。