最近使用STC89C58RD+這款CPU,做一個RX232 串口與上位機通訊程序。
功能:得到上位機指令控制一個I/0。急停一段時間向上位機send一個幫助指令(這個需要漢字,這個漢子老坑爹了,需要一個“KeilFDfix_b7(冠銘師兄版)“補丁)
內部的TR0沒有使用,代碼沒問題也可以使用。
單片機源程序如下:
- #include <stc89.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- //I/O
- sbit stop = P3^2;
- sbit led_ok = P2^0;
- sbit led_ng = P2^1;
- sbit led_help = P2^6;
- sbit a = P1^0;
- sbit b = P1^1;
- sbit c = P1^2;
- sbit d = P1^3;
- //bit
- uint h,k,l,t,f,i=0,g=0,num=0,s;
- bit flag;
- //delay_1ms
- void delayms(uint time)
- {
- uint x,y;
- for(x=0;x<time;x++)
- for(y=0;y<112;y++);
- }
- //delay_1s
- void delays(uint time_1s)
- {
- uint q,w;
- for(q=0;q<time_1s;q++)
- {
- delayms(1000);
- for(w=0;w<112;w++);
- }
-
- }
- //UART
- uchar rev_string[2];
- uchar code ok[] = {0xaa,0x00};
- uchar code ng[] = {0xaa,0x11};
- //UART Init
- void UARTinit()
- {
- SM0=0; //串行口工作方式1
- SM1=1;
- TMOD=0x20; //工作方式2
- TH1=0xfd; //9600波特率裝初值
- TL1=0xfd;
- TR1=1; //打開定時器1
- }
- // 中斷
- void init()
- {
- EA=1; //打開總中斷
- EX0=1; //打開中斷1
- // ES=1; //串口使能
- ET0=1; //定時器T0中斷允許
- TMOD=0x01; //使用定時器T0 (0000 0001)
- TH0=(65535-50000)/256; //將定時器計時時間設定為10000微秒=10毫秒 計算后得數 TH0=60;
- TL0=(65535-50000)%256; // 計算后得數 TL0=175
- }
- // 發送
- void send_ok()
- {
- REN=0;
- for(k=0;k<2;k++)
- {
- SBUF=ok[k];
- while(!TI);
- TI=0;
- }
-
- }
- void send_ng()
- {
- REN=0;
- for(l=0;l<2;l++)
- {
- SBUF=ng[l];
- while(!TI);
- TI=0;
- }
-
- }
- //received
- void recv()
- {
- REN=1;
- for(h=0;h<2;h++)
- {
- delayms(200); //輔助延時
- while(!RI);
- rev_string[h]=SBUF;
- RI=0;
- }
- REN=0;
- }
- //上電 確認程序
- void power_on()
- {
- delayms(200);
- P1=0xff; //關閉所有P1口
- for(t=0;t<4;t++)
- {
- delayms(500);
- P1=P1<<1;
- }
- delayms(500);
- P1=0xff;
- }
- //MAIN
- void main()
- {
- power_on();
- while(1)
- {
-
- switch (g)
- {
- case 0:
- {
- init();
- a=0;
- g++;
- }break;
- case 1:
- {
- UARTinit();
- b=0;
- g=22;
- delayms(200);
- }break;
- case 22:
- {
- recv();
- c=0;
- if((rev_string[0]==0xaa)&&(rev_string[1]==0x00))
- {
- delayms(300);
- led_ok=0;
- send_ok();
-
- delays(5);
- led_ok=1;
- g=22;
- }
- if((rev_string[0]==0xaa)&&(rev_string[1]==0x11))
- {
- delayms(300);
- led_ng=0;
- send_ng();
-
- delays(5);
- led_ng=1;
- g=22;
- }
- }break;
- }
- }
- }
- //T0中斷
- void T0_time() interrupt 1
- {
- TH0=(65535-10000)/256;
- TL0=(65535-10000)%256;
- num++;
- }
- //中斷
- void int0() interrupt 0
- {
- if(stop==0)
- {
- for(s=0;s<100;s++)
- {
- flag=1;
- while(flag)
- {
- delayms(200);
- i++;
- flag=0;
- }
- if(stop)
- {
- delayms(10);
- break; //跳出本層循環
- }
- }
- flag=0;
- while(!stop);
- if(i<=20)
- {
-
- P2=0xff;
- P1=0xff;
- REN=0;
- i=0;
- g=0;
- ISP_CONTR=0x20;
- }
- if(i>=20) //幫助模塊
- {
- led_help=0;
- TI = 1;//發送請求標志位
- printf("輸入你想要的漢字。\n "); //方法2
- while(!TI);//判斷是否發送完成 發送完成出循環
- TI = 0;
-
-
- delayms(200);//延遲200ms
- led_help=1;
- i=0;
- flag=0;
- }
- }
-
-
- }
復制代碼
|