51微控制器之數碼管動態迴圈左移顯示手機號
阿新 • • 發佈:2019-02-19
課設題目:數碼管手機號要求:四位一體共陰數碼管迴圈左移顯示手機號,顯示完成蜂鳴器響一次,重複迴圈一:共陰極數碼管16進位制編碼1~f如下:uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};二:proteus中各元件符號表示:CRYSTAL晶振;電解電容:CAP-即可搜到;電阻:res;7SEG-MPX4-CC 四個共陰二極體顯示器 1234 是陰公共端;排阻:respack三:總體電路圖 實物圖:(前三位的手機號,太懶,不想上傳太多圖片了)四 程式碼實現
#include<reg52.h> #define uchar unsigned char; #define uint unsigned int; sbit beep=P1^2; sbit P2_0 = P2^0;//位選資料的十位,即左邊第一位數碼管 sbit P2_1 = P2^1;//位選資料的個位,即第二位數碼管 sbit P2_2 = P2^2;//位選資料的十位,即第三位數碼管 sbit P2_3 = P2^3;//位選資料的個位,即最後一位數碼管 unsigned char tcount,a=0,kk=0; unsigned char table1[]={0x00,0x00,0x00,};//加上你想要顯示的手機號對應十六進位制 /* 延時1ms的延時函式 */ void delay_ms(unsigned int n) { unsigned int i=0,j=0; for(i=0;i<n;i++) for(j=0;j<123;j++); } /* 數碼管顯示函式 */ void SMG_display() { P0=table1[kk];//第1個數碼管顯示的數字 P2_0 = 0; delay_ms(2); P2_0 = 1; P0=table1[kk+1];//第2個數碼管顯示的數字 P2_1 = 0; delay_ms(2); P2_1 = 1; P0=table1[kk+2];//第3個數碼管顯示的數字 P2_2 = 0; delay_ms(2); P2_2 = 1; P0=table1[kk+3];//第4個數碼管顯示的數字 P2_3 = 0; delay_ms(2); P2_3 = 1; } /* 定時器初始化 */ void Timer0Init() { TMOD=0x01; //定時器0中斷方式1 TH0=(65536-5000)/256; //設初值5000us=5ms TL0=(65536-5000)%256; EA=1; //開啟總中斷開關 ET0=1; //T0中斷允許 TR0=1; //T0中斷開始(啟動T0) } /* 定時器中斷 */ void timer0() interrupt 1 using 0 { TH0=(65536-5000)/256; //無自動重灌載功能,需要再次設初值 TL0=(65536-5000)%256; tcount++; //中斷迴圈次數,每次進入中斷tcount數值加1 SMG_display(); if(tcount==200) //200*5000us=1s { tcount=0; kk++; if(kk>10) { kk=0; beep=0; delay_ms(50); beep=1; } } } /* 主函式 */ void main() { Timer0Init(); while(1); }