標(biāo)題:
51單片機數(shù)碼管顯示學(xué)號程序+Proteus仿真電路圖
[打印本頁]
作者:
trc
時間:
2019-4-8 15:41
標(biāo)題:
51單片機數(shù)碼管顯示學(xué)號程序+Proteus仿真電路圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(26.6 KB, 下載次數(shù): 53)
下載附件
2019-4-8 15:42 上傳
0.png
(10.03 KB, 下載次數(shù): 44)
下載附件
2019-4-8 15:42 上傳
單片機源程序如下:
#include <reg52.h>
sbit hang1=P2^0;
sbit hang2=P2^1;
sbit lie1=P2^2;
sbit lie2=P2^3;
sbit buzzer=P2^7; //蜂鳴器
//與ADC相關(guān)的位聲明
sbit ADC_START=P3^4; //轉(zhuǎn)換啟動信號,高脈沖啟動轉(zhuǎn)換
sbit ADC_EOC=P3^2; //轉(zhuǎn)換結(jié)束信號,高電平轉(zhuǎn)換結(jié)束
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(); //移動顯示學(xué)號函數(shù)
void keyscan(); //鍵盤掃描函數(shù)
void desplay_key_number();
void Get_ADC(void); //ADC轉(zhuǎn)換函數(shù)
unsigned char b=0,i,counter=4,Time=0,flag=0,INT;
float ADC_V; //AD轉(zhuǎn)換的電壓值
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轉(zhuǎn)換通道0
desplay(); //上電顯示學(xué)號
while(1)
{
if(INT) //INT=1表示進入外部中斷1,則可以進行鍵盤掃描
{
keyscan(); //掃描得到鍵值
TR0=0; //關(guān)閉定時器0,判斷此時按鍵按下的時間
INT=0;
EX1=1; //開外部中斷1
}
if(counter!=4)
{
if(flag) //到2.5秒執(zhí)行
{
switch (counter)
{
case 0: //DA功能鍵,即梯形波
TR1=1; //啟動定時器1產(chǎn)生波形
break;
case 1: //學(xué)號顯示鍵
desplay(); //顯示學(xué)號 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; //關(guān)閉定時器1,以免與定時器0沖突
Time=0; //不能在此將flag清零,放下按鍵也會產(chǎn)生抖動,
//此時進入中斷將flag清零就錯了,反應(yīng)不了真實情況
buzzer=0;
delay(1);
buzzer=1;
IE1=0; //軟件清零中斷標(biāo)志
EX1=0; //關(guān)外部中斷1,等待鍵盤掃描結(jié)束再重新打開
INT=1; //進入中斷標(biāo)志位
}
void timer_0() interrupt 1 //定時器0中斷服務(wù)函數(shù),用于判斷2.5秒鐘時間是否已到
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
Time++;
if(Time==50)
{
flag=1; //標(biāo)志位置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; //關(guān)閉定時器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轉(zhuǎn)換函數(shù)
{
unsigned char ADC;
ADC_START=0; ADC_START=1; ADC_START=0; //高脈沖啟動轉(zhuǎn)換
while(ADC_EOC==0); //等待轉(zhuǎn)換結(jié)束
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() //移動顯示學(xué)號函數(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);
}
復(fù)制代碼
所有資料51hei提供下載:
51單片機數(shù)碼管顯示學(xué)號.rar
(47.04 KB, 下載次數(shù): 34)
2019-4-8 15:40 上傳
點擊文件名下載附件
51單片機
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1