最近使用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;
- }
- }
-
-
- }
复制代码
|