1. 程式人生 > >51微控制器之數碼管動態迴圈左移顯示手機號

51微控制器之數碼管動態迴圈左移顯示手機號

課設題目數碼管手機號要求:四位一體共陰數碼管迴圈左移顯示手機號,顯示完成蜂鳴器響一次,重複迴圈一:共陰極數碼管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);
}