|
串口中斷里不要放與串口功能無直接關(guān)系的語句,更不能含有較長時間的阻滯型延時,這會導(dǎo)致通信響應(yīng)緩慢甚至無效。程序要簡潔,給你屏蔽了所有不必要的語句,你試試。
- #include<reg51.h> //包含51單片機寄存器定義的頭文件
- unsigned char keyval; //儲存按鍵值
- //unsigned char keyval2; //儲存按鍵值
- #define uchar unsigned char
- #define uint unsigned int
- unsigned char code tabup[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- //code tabdown[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- uint x,y;
- //keyval2=0;
- /*************************************************
- 函數(shù)功能:流水燈延時
- **************************************************/
- void led_delay(unsigned int t)
- {
- unsigned int i,j;
- for(i=0;i<t;i++)
- for(j=0;j<120;j++);
- }
- /*************************************************
- 函數(shù)功能:軟件消抖延時
- **************************************************/
- /*
- void delay20ms(void)
- {
- unsigned char i,j;
- for(i=0;i<100;i++)
- for(j=0;j<60;j++);
- }*/
- /*************************************************
- 函數(shù)功能:正向流水點亮LED
- **************************************************/
- void forward(void)
- { //不能加while(1),會循環(huán)這一函數(shù),其他按鍵控制無效
- // for(x=0;x<8;x++)
- // {
- P1=tabup[x];
- // led_delay();
- // }
- }
- /*************************************************
- 函數(shù)功能:反向流水點亮LED
- **************************************************/
- void backward(void)
- { //不能加while(1),會循環(huán)這一函數(shù),其他按鍵控制無效
- // for(y=0;y<8;y++)
- // {
- // P1=tabdown[x];
- P1=tabup[7-(x%8)];
- // led_delay();
- // }
- }
- /*************************************************
- 函數(shù)功能:關(guān)閉所有LED
- **************************************************/
- void stop(void)
- {
- P1=0xff; //關(guān)閉8個LED
- }
- /*************************************************
- 函數(shù)功能:閃爍點亮LED
- **************************************************/
- void flash(void)
- {
- P1=0x00; //點亮8個LED
- // led_delay();
- }
- /*************************************************
- 函數(shù)功能:主函數(shù)
- **************************************************/
- void main(void) //主函數(shù)
- {
- SCON = 0x50; //設(shè)定串口工作方式
- PCON = 0x00; //波特率不倍增
- TMOD = 0x20; //定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率
- TL1 = 0xfd;
- TH1 = 0xfd; //波特率9600
- TR1 = 1;
- EA = 1;
- ES = 1; //允許串口中斷
- while(1)
- {
- switch(keyval)
- {
- case 1:forward();break;
- case 2:backward();break;
- case 3:stop();break;
- case 4:flash();break;
- // 這樣寫更簡潔
- // case 1:P1=tabup[x];break;//正向流水燈
- // case 2:P1=tabup[7-(x%8)];break;//反向流水燈
- // case 3:P1=0xff;break;//全熄
- // case 4:P1=0x00;break;//全亮
- }
- led_delay(500);//延時約0.5秒
- x=++x%8;//循環(huán)計數(shù)
- }
- }
- /*************************************************
- 函數(shù)功能:定時器T0的中斷服務(wù)子程序
- **************************************************/
- void serial() interrupt 4
- {
- // ES = 0; //關(guān)閉串行中斷
- RI = 0; //清除串行接受標(biāo)志位
- keyval = SBUF; //從串口緩沖區(qū)取得數(shù)據(jù)
- /* if(keyval==0);
- {
- keyval=keyval2;
- }
- keyval2=keyval;
- ES = 1;*/ //允許串口中斷
- }
復(fù)制代碼
|
|