51中断实验与流水灯protues仿真
生活随笔
收集整理的這篇文章主要介紹了
51中断实验与流水灯protues仿真
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
51單片機實驗及protues仿真
實驗內容:
設計一個單片機實驗,完成對外部事件進行計數,當來2個脈沖時,通過中斷用數碼管顯示相應信息或執行一個任務,當來6個脈沖時,又顯示另外的信息或執行另一個任務,計數具備清零,發現中斷時,有相應信息提示。
設計任意流水燈電路,實現兩種以上方式的流水燈效果,通過按鍵切換或者自動切換。
一、實驗一
1.protues仿真
2.程序
#include <reg51.h>typedef unsigned int u16; //對數據類型進行聲明定義 typedef unsigned char u8;sbit led1=P3^0; sbit led2=P1^0;sbit k0=P3^2; //定義按鍵K3#define smg P2u8 tab[]= //段碼表 {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,這是共陰極數碼管0-9的段碼int count0,count1;//定時器0溢出中斷程序 void timer0() interrupt 1 //定時器0中斷標志位為1 {//重新裝載定時器0計數初值TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(count0==20) //T0*10=1s LED1閃爍{led1=~led1;count0=0;}count0++; }//定時器1溢出中斷程序 void timer1() interrupt 3 //定時器1中斷標志位為3 {//重新裝載定時器1計數初值TH1=(65536-25000)/256;TL1=(65536-25000)%256;count1++;if(count1==40) //T1*10=0.5s LED2閃爍 20為2秒{led2=~led2;//count1=0;}if(count1==120*3) //為6秒{smg = tab[6];//count1 = 0;}}int main() {EA=1; //全局中斷使能ET0=1; //定時器0溢出中斷使能ET1=1; //定時器1溢出中斷使能TR0=1; //定時器0使能TR1=1; //定時器1使能TMOD=0x11; //00010001B,定時器0、1使用工作方式1,16位定時器//裝載定時器0計數初值TH0=(65536-50000)/256; //內置時鐘頻率為6MHz,定時器0計數50000次,計數初值為15536轉為16進制TL0=(65536-50000)%256; //機械周期為2us,T0=(65536-計數初值)*2us=0.1s//裝載定時器1計數初值TH1=(65536-25000)/256; //內置時鐘頻率為6MHz,定時器0計數25000次,計數初值為40536轉為16進制TL1=(65536-25000)%256; //機械周期為2us,T1=(65536-計數初值)*2us=0.05sled1=0; //控制P3.0led2=0; //控制P1.0while(1){}}二、實驗二
1.protues仿真
2.程序
#include<reg51.h> #include<intrins.h>#define led P2typedef unsigned int u16; //對數據類型進行聲明定義 typedef unsigned char u8;//延遲函數 void delay(){u16 a, b;for(a = 0; a < 400; a++)for(b = 0; b < 400; b++); }// LED點亮方式:依次點亮(一次一個,循環三次) void yici(){char i, j;for(j = 0; j < 1; j++){led = 0xfe;for(i = 0; i < 7; i++){led = _cror_(led, 1);delay();}led = 0x7f;for(i = 0; i < 7; i++){led = _crol_(led, 1);delay();}} }// 從兩邊到中間 char toMiddle[] = {0x7e, 0xbd, 0xdb, 0xe7, 0xdb, 0xbd, 0x7e};//LED燈點亮方式 void bianToMiddle(){char i, j;for(j = 0; j < 1; j++){//循環三遍for(i = 0; i < 7; i++){//LED點亮方式:從兩邊到中間led = toMiddle[i];delay();}} }//由上向下依次點亮LED燈 char toBottom[] = {0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00}; void topToBottom(){char i, j;for(j = 0; j < 1; j++){led = 0xff;for(i = 0; i < 8; i++){led = led << 1;delay();}for(i = 6; i >= 0; i--){led = toBottom[i];delay();}} }void main(){while(1){yici(); //LED燈依次亮bianToMiddle();//LED燈從兩邊向中間逐次點亮led = 0xff; //關閉LED燈topToBottom();//由上向下依次點亮LED燈} }總結
大佬可以支持一下:
總結
以上是生活随笔為你收集整理的51中断实验与流水灯protues仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Map value类型不同的写法
- 下一篇: 终于找到你!如何将前端console.l