|
5黑幣
RT最近在做一個(gè)小制作,用單片機(jī)設(shè)計(jì)一個(gè)時(shí)鐘,我用外部中斷0做了一個(gè)模式切換的功能,每按一下中斷觸發(fā)鍵就可以使變量mod加一。其他兩個(gè)模式(時(shí)鐘調(diào)整,鬧鐘調(diào)整)都能正常的切換,但是最后一個(gè)利用串口連接手機(jī)校準(zhǔn)時(shí)間的模式無法正常切換,進(jìn)去就卡在那里切不出去,實(shí)在是不知道為什么了,麻煩大佬幫我看一眼,多謝!代碼寫的少,可能寫的很不好,如果有建議希望大佬多指教!
為了閱讀方便我刪去了前兩個(gè)模式的代碼,用定時(shí)器0來生成秒,send函數(shù)和receive函數(shù)利用了定時(shí)器1來生成波特率,串口校準(zhǔn)模式的設(shè)計(jì)思路是先發(fā)送一個(gè)“1”給手機(jī),再接收手機(jī)發(fā)送的“1”,確定連接建立后再接收手機(jī)發(fā)送的數(shù)據(jù)。因?yàn)槭謾C(jī)端的開發(fā)還沒做完,所以暫時(shí)測試只用來校準(zhǔn)hour
單片機(jī)源程序如下:
- #include<reg52.h>
- typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- typedef unsigned char u8;
- #define data8b P0
- sbit K1=P3^2; //外部中斷0
- sbit K2=P3^3; //外部中斷1
- sbit K3=P3^4;
- sbit K4=P3^5;
- sbit p=PSW^0;
- sbit RW=P2^1; //4腳,數(shù)據(jù)(1)or命令(0)
- sbit RS=P2^0; //5腳,讀(1)寫(0)
- sbit E=P2^2; //6腳,使能信號(hào)
- u8 code dat1[]={0X30,0X31,0X32,0X33,
- 0X34,0X35,0X36,0X37,
- 0X38,0X39};
- //LCD1602字符
-
- u8 min=0,hour=0; //時(shí)間初始化
- u16 i=0;
- u8 s=0;
- u8 mod=0; //mod初值
- bit signal=0; //發(fā)送
- u8 temp=0;
-
-
- void delay(u16 i) //延時(shí)函數(shù)
- {
- while(i--);
- }
- void open012() //打開中斷0,1,定時(shí)器中斷0
- {
- TMOD|=0X01; //選擇為定時(shí)器0模式,工作方式1
-
- ET0=1; //打開定時(shí)器0中斷允許
- EA=1; //打開總中斷
- TR0=1; //打開定時(shí)器
- EX0=1; //打開外部中斷0
- IT0=1; //邊沿觸發(fā)方式
- EX1=1; //打開外部中斷1
- IT1=1; //邊沿觸發(fā)
-
- }
- void wrm(u8 dat) //寫入命令
- {
- delay(1000);
- RS=0;
- RW=0;
- E=0;
- data8b=dat;
- E=1;
- delay(1000);
- E=0;
- }
- void wrd(u8 dat) //寫入數(shù)據(jù)
- {
- delay(1000);
- RS=1;
- RW=0;
- E=0;
- data8b=dat;
- E=1;
- delay(1000);
- E=0;
- }
- void init() //LCD初始化
- {
- wrm(0X38); //八位數(shù)據(jù),兩行顯示,5*7
- wrm(0X0c); //無光標(biāo),打開顯示
- wrm(0X06); //光標(biāo)右移,屏幕不移動(dòng)
- wrm(0X01); //清屏
- wrm(0X80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
- }
- void display()
- {
- wrd(dat1[hour/10]); //時(shí)十位
- wrd(dat1[hour%10]); //時(shí)個(gè)位
- wrd(0x3A); //:
- wrd(dat1[min/10]); //分十位
- wrd(dat1[min%10]); //分個(gè)位
- wrd(0x3A); //:
- wrd(dat1[(s/10)]); //秒十
- wrd(dat1[(s%10)]); //秒個(gè)
- }
- //秒個(gè)
- void chuli() //處理進(jìn)位
- {
- if(min==60)
- {
- hour++;
- min=0;
- }
- if(hour==24)
- {
-
- hour=0;
- }
-
- if(s==60)
- {
- min++;
- s=0;
- }
-
- }
- void send() //發(fā)送函數(shù),定時(shí)器T1為方式2,串口為方式3,波特率9600,采用偶校驗(yàn)
- {
- TMOD=0x20;
- SCON=0xc0;
- PCON=0x00;
- TH1=0xfd;
- TL1=0xfd;
- TB8=P;
- SBUF=1;
- while(TI==0);
- ;
- TI==0;
- }
- u8 receive() //接收函數(shù)
- {
- u8 dat;
- TMOD=0x20;
- SCON=0xd0;
- PCON=0x00;
- TH1=0xfd;
- TL1=0xfd;
- TR1=1;
- REN=1;
-
- while(RI==0);
- ;
- RI==0;
- ACC=SBUF;
- if(RB8==P)
- {
- dat=ACC;
- return dat;
- }
- }
- void dis_string(u8 *pp, u16 n) //顯示字符串的函數(shù)
- {
- int i;
- for (i=0;i<n;i++)
- wrd(pp[i]);
- }
- u8 p1[]="connecting";
- u8 p2[]="OK!";
- u8 p3[]="over";
- void main()
- {
- IP=1;
- open012();
- init();
- chuli();
- display();
-
-
-
-
- while(1)
- {
- while(mod==0)
- {
- EX1=1; //打開外部中斷1
- chuli();
- wrm(0x80);
- display();
- }
-
-
-
-
- while(mod==1)
- {
- init();
- EX1=0;
- TR0=0;
- TR1=1;
- dis_string(p1,10); //輸出字符connecting
- wrm(0x80+0x40); //換行
- send();
- delay(1000);
- signal=receive();
- while(1)
- {
- if(signal=1)
- {
- dis_string(p2,3); //如果標(biāo)志位=1,則連接成功,輸出ok;如果標(biāo)志位為0,則繼續(xù)接收
- break;
- }
-
- else if(signal=0)
- {
- signal=receive();
- }
- }
- send();
- temp=receive(); //將接受數(shù)據(jù)裝入temp中并賦給hour;
- hour=temp;
- init();
- if(temp!=0)
- {
- dis_string(p3,4); //輸出over
- delay(1000);
- }
-
-
- TR1=0;
-
- }
- }
- }
-
-
-
-
-
- void time0() interrupt 1
- {
- TH0=0XFC; //給定時(shí)器賦初值,定時(shí)1ms
- TL0=0X18;
- i++;
- if(i==1000) //ms轉(zhuǎn)化為s
- {
- i=0;
- s++;
-
- }
- }
- void key1() interrupt 0 //外部中斷0,切換模式
- {
- EX0=0;
- delay(1000);
- if(K1==0)
- {
-
- mod++;
- while(!K1);
- }
- if(mod>1)
- {
- mod=0;
- }
- EX0=1;
- }
復(fù)制代碼 |
|