仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include <reg52.h>
- sbit hang1=P2^0;
- sbit hang2=P2^1;
- sbit lie1=P2^2;
- sbit lie2=P2^3;
- sbit buzzer=P2^7; //蜂鳴器
- //與ADC相關的位聲明
- sbit ADC_START=P3^4; //轉換啟動信號,高脈沖啟動轉換
- sbit ADC_EOC=P3^2; //轉換結束信號,高電平轉換結束
- sbit ADC_A=P3^5;
- sbit ADC_B=P3^6;
- sbit ADC_C=P3^7;
- unsigned char code table[]={0x03,0x9f,0x25,0x0d,
- 0x99,0x49,0x41,0x1f,
- 0x01,0x09,0x11,0xc1,
- 0xe5,0x85,0x21,0x71,0xff};
- void sendstr(unsigned char); //串口發(fā)送數(shù)字顯示
- void delay(unsigned char ); //延時函數(shù)
- void desplay(); //移動顯示學號函數(shù)
- void keyscan(); //鍵盤掃描函數(shù)
- void desplay_key_number();
- void Get_ADC(void); //ADC轉換函數(shù)
- unsigned char b=0,i,counter=4,Time=0,flag=0,INT;
- float ADC_V; //AD轉換的電壓值
- int main()
- {
- /*主程序初始化部分*/
- EA=1; //開總中斷
- SCON=0x00; //串口初始化 ,工作方式0
- EX1=1; //開外部中斷1
- IT1=1; //外部中斷1電平觸發(fā)
- ET0=1; //開啟定時器0中斷
- ET1=1; //開啟定時器1中斷
- TMOD=0X11; //定時器0工作方式1,定時器1工作方式1
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=(65536-500)/256;
- TL1=(65536-500)%256;
- hang1=hang2=0;
- ADC_A=ADC_B=ADC_C=0; //選擇ADC轉換通道0
-
- desplay(); //上電顯示學號
- while(1)
- {
-
- if(INT) //INT=1表示進入外部中斷1,則可以進行鍵盤掃描
- {
- keyscan(); //掃描得到鍵值
- TR0=0; //關閉定時器0,判斷此時按鍵按下的時間
- INT=0;
- EX1=1; //開外部中斷1
- }
- if(counter!=4)
- {
-
- if(flag) //到2.5秒執(zhí)行
- {
- switch (counter)
- {
- case 0: //DA功能鍵,即梯形波
- TR1=1; //啟動定時器1產生波形
- break;
- case 1: //學號顯示鍵
-
- desplay(); //顯示學號 delay(100);
- break;
- case 2:
-
-
- break;
- case 3: //AD功能鍵
- for(i=0;i<8;i++)
- {
- sendstr(16); //將所有數(shù)碼管清滅
- }
- Get_ADC();
- SBUF=table[(int)(ADC_V)]&0xfe; //與小數(shù)點一同顯示
- while(!TI);
- TI=0;
- sendstr((int)(ADC_V*10)%10);
- sendstr((int)(ADC_V*100)%100%10);
- break;
- default:
- break;
- }
- flag=0; //在此將flag清零,而不在中斷中清零
- }
- else //未到2.5秒執(zhí)行
- {
-
- desplay_key_number();
-
- }
- counter=4;
- }
- }
-
- }
- void INT_1() interrupt 2 //外部中斷1函數(shù)
- {
- TR0=1; //啟動定時器0
- TR1=0; //關閉定時器1,以免與定時器0沖突
- Time=0; //不能在此將flag清零,放下按鍵也會產生抖動,
- //此時進入中斷將flag清零就錯了,反應不了真實情況
- buzzer=0;
- delay(1);
- buzzer=1;
-
- IE1=0; //軟件清零中斷標志
- EX1=0; //關外部中斷1,等待鍵盤掃描結束再重新打開
- INT=1; //進入中斷標志位
- }
- void timer_0() interrupt 1 //定時器0中斷服務函數(shù),用于判斷2.5秒鐘時間是否已到
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- Time++;
- if(Time==50)
- {
- flag=1; //標志位置1
- /*蜂鳴器叫兩聲提示時間到*/
- buzzer=0;
- delay(1);
- buzzer=1;
- delay(1);
- buzzer=0;
- delay(1);
- buzzer=1;
- }
- }
- void timer_1() interrupt 3 //矩形波發(fā)生中斷函數(shù)
- {
- TH1=(65536-500)/256;
- TL1=(65536-500)%256;
- TR0=0; //關閉定時器0,以免沖突
- switch(b)
- {
- case 0:
- P0=0x00;
- for(i=0;i<51;i++)
- {
- P0+=5;
- ;;;;;;;;;;;;;;;;;;; //多個分號,用于延時
- }
- b++;
- break;
- case 1:
- b++;
- break;
- case 2:
- for(i=0;i<51;i++)
- {
- P0-=5;
- ;;;;;;;;;;;;;;;;;;; //多個分號,用于延時
- }
- b++;
- break;
- case 3:
- b=0;
- break;
- default:
- break;
- }
-
- }
- void sendstr(unsigned char i) //串口發(fā)送數(shù)字顯示
- {
- SBUF=table[i];
- while(!TI);
- TI=0;
- }
- void keyscan() //鍵盤掃描函數(shù)
- {
- //掃描第一行
- hang1=0;
- hang2=1;
- if(lie1==0)
- { delay(1); //消抖動
- while(!lie1);
- counter=0;
- }
- if(lie2==0)
- { delay(1); //消抖動
- while(!lie2);
- counter=1;
- }
- //掃描第二行
- hang1=1;
- hang2=0;
- if(lie1==0)
- { delay(1); //消抖動
- while(!lie1);
- counter=2;
- }
- if(lie2==0)
- { delay(1); //消抖動
- while(!lie2);
- counter=3;
- }
- hang1=hang2=0; //出程序拉低按鍵行號
- }
- void desplay_key_number() //顯示按鍵值號函數(shù)
- {
- unsigned char num;
- for(num=0;num<8;num++)
- {
- sendstr(counter);
- }
- }
- void Get_ADC() //ADC轉換函數(shù)
- {
- unsigned char ADC;
- ADC_START=0; ADC_START=1; ADC_START=0; //高脈沖啟動轉換
- while(ADC_EOC==0); //等待轉換結束
- ADC=P1;
- ADC_V=(float)(ADC)/255*5;
- }
- void delay(unsigned char h) //延時函數(shù)
- {
- unsigned char j;
- for(j=0;j<100;j++)
- {
- while(h--);
- }
- }
- void desplay() //移動顯示學號函數(shù)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- sendstr(16);
- }
- i=250;
- sendstr(0);
- delay(i);
- sendstr(1);
- delay(i);
- sendstr(1);
- delay(i);
- sendstr(1);
- delay(i);
- sendstr(0);
- delay(i);
- sendstr(1);
- delay(i);
- sendstr(5);
- delay(i);
- sendstr(0);
- delay(i);
- }
復制代碼
所有資料51hei提供下載:
51單片機數(shù)碼管顯示學號.rar
(47.04 KB, 下載次數(shù): 34)
2019-4-8 15:40 上傳
點擊文件名下載附件
51單片機
|