![]() |
發(fā)布時間: 2017-3-3 15:35
正文摘要:如題。一個可預置5位計數(shù)器的程序。電路跟源程序如下。 #include <AT89X51.H>#define uchar unsigned char #define uint unsigned int uchar code SEG7[10]={0x03,0x9f,0x25,0x0d,0x99, ... |
想吃小紅帽的狼 發(fā)表于 2017-3-3 18:31 感謝!原程序是6M的晶振 |
只要把15單片機IO口配置成普通IO,然后下載的時候,將晶振頻率選擇12MHz就可以 |
wosiyabo 發(fā)表于 2017-3-3 16:59 感謝,晚上試下。 |
我把IO腳配置了一下,你再試試 #include "reg51.h" //#include "intrins.h" #define uchar unsigned char #define uint unsigned int sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 uchar code SEG7[10]={0x03,0x9f,0x25,0x0d,0x99, 0x49,0x41,0x1f,0x01,0x09}; uchar data cnt[5];//在data區(qū)定義5位長度的數(shù)組,用來存放計數(shù)值 uchar data pre_cnt[5];//在data區(qū)定義5位長度的數(shù)組,用來存放預置值 sbit P3_7=P3^7; sbit P3_6=P3^6; sbit P3_5=P3^5; //sbit P3_4=P3^4; sbit P3_3=P3^3; sbit P3_2=P3^2; sbit P3_1=P3^1; sbit P3_0=P3^0; sbit drv=P3^4;//定義輸出驅(qū)動端 bit set_flag;//定義工作標志 bit out_flag;//定義輸出標志 bit keydown_flag;//鍵按下標志 /****************************/ void delay(uint k) { uint i,j; for(i=0;i<k;i++){ for(j=0;j<5;j++) {;}} } /**********************************************/ void scan_key(void) //掃描S1~S5鍵子程序開始 {uchar i,m=0x08; //定義兩個字符型局部變量,并賦值0x01給m P3_6=0;P3_7=1; //禁止發(fā)送給顯示器,消隱有效 for(i=0;i<5;i++) //循環(huán)5次 { SBUF=255-m;while(!TI);TI=0; //依次發(fā)送數(shù)據(jù)使IC2的輸出從右至左的列線為0 if(!P3_5)pre_cnt[i]++; //若檢測到P3.5為0,說明某列線送出0時與連接 //該列線的按鍵被按下,數(shù)組中對應的存放單元加1 m<<=1; //m的取值使從右向左的下一條列線為0 } //掃描S1~S5鍵子程序結(jié)束 //------------------------ for(i=0;i<5;i++) //循環(huán)5次 {if(pre_cnt[i]>9)pre_cnt[i]=0;} //對數(shù)組中的5個單元進行調(diào)整,其范圍為0~9 } /************************************/ void dis_cnter(void) //顯示計數(shù)器值子程序開始 {uchar i; //定義字符型局部變量i P3_7=1;P3_6=1; //消隱有效,允許顯示 for(i=0;i<5;i++) //循環(huán)5次 {SBUF=SEG7[cnt[i]];while(!TI);TI=0;} //根據(jù)8個單元的計數(shù)值查表發(fā)送顯示 P3_7=0; //關(guān)閉消隱,正常顯示 } //顯示計數(shù)器值子程序結(jié)束 /**********************************************/ void dis_pre_cnter(void) {uchar i; P3_7=1;P3_6=1; SBUF=SEG7[pre_cnt[0]]&0xfe;while(!TI);TI=0; //---------------------------------------- for(i=1;i<5;i++) {SBUF=SEG7[pre_cnt[i]];while(!TI);TI=0;} P3_7=0; } /****************************************/ void cnter(void) //計數(shù)轉(zhuǎn)換子程序開始 {uchar i; //定義字符型局部變量i for(i=0;i<4;i++) //循環(huán)5次 {if(cnt[i]>9){cnt[i]=0;cnt[i+1]++;}} //若計數(shù)器某位值大于9,則該位回0, //------------------------------------ //而高位被進位加1 if(cnt[4]>9){for(i=0;i<5;i++)cnt[i]=0;}// 若計數(shù)器最高位值大于9,則計數(shù)器全清0 } //計數(shù)轉(zhuǎn)換子程序結(jié)束 /***************************************************/ void pt_cnt(void) //輸出控制子程序開始 { if((cnt[0]==pre_cnt[0])&&(cnt[1]==pre_cnt[1])&&(cnt[2]==pre_cnt[2])&&(cnt[3]==pre_cnt[3])&&(cnt[4]==pre_cnt[4])) //若計數(shù)值等于預置值 out_flag=1; //drv=1; //輸出標志置1 else out_flag=0; //否則輸出標志置0 //========================== if(out_flag)drv=0; //若輸出標志為1,輸出端(P3.4)置0,驅(qū)動光耦U2 else drv=1; //若輸出標志為1,輸出端(P3.4)置0,驅(qū)動光耦U2 //否則輸出端(P3.4)置1 } //輸出控制子程序結(jié)束 /********************************************/ void main(void) //主程序開始 { P0M0 = P0M1 = 0x00;//IO腳配置,按普通51輸入輸出方式 P1M0 = P1M1 = 0x00; P2M0 = P2M1 = 0x00; P3M0 = P3M1 = 0x00; IE=0x84; //開放CPU中斷,開放外中斷1的中斷 IT1=1; //置外中斷1為邊沿觸發(fā) while(1) //無限循環(huán) {P3_6=0;P3_7=1; //禁止發(fā)送給顯示器,消隱有效 SBUF=0x00;while(!TI);TI=0; //向IC2發(fā)送0x00,使IC2輸出為全0 if((P3&0x24)!=0x24)keydown_flag=1; //檢測P3.2、P3.5是否為高電平。 //若不為高電平,說明有鍵按下,鍵被按下標志置1 else keydown_flag=0; //否則,鍵被按下標志置0 //-------------------------- SBUF=0xfe;while(!TI);TI=0; //向IC2發(fā)送0xfe if(!P3_2)set_flag=!set_flag; //若P3.2為0,說明S9鍵按下,標志set_flag取反 //============================================= if(!set_flag){cnter();dis_cnter(); pt_cnt();delay(100);} //若標志set_flag為0,調(diào)用計數(shù)、顯示計數(shù)、輸出控制的子程序 else {scan_key();dis_pre_cnter();delay(10);}//否則標志set_flag為1,調(diào)用掃描S1~S8鍵、顯示預置值的子程序 //============================================= if(keydown_flag)delay(300); //因有鍵按下,調(diào)用延時300mS子程序, } //以免調(diào)整鍵值的速度過快 } //主程序結(jié)束 /************************************************/ void extern_int1(void) interrupt 2 using 1 { cnt[0]++; } |
參與人數(shù) 1 | 黑幣 +15 | 收起 理由 |
---|---|---|
![]() | + 15 | 很給力! |
Powered by 單片機教程網(wǎng)