标题:
给大家分享个51单片机串口发送汉字与字节程序(工作总结)
[打印本页]
作者:
baiyun1234
时间:
2019-9-25 17:41
标题:
给大家分享个51单片机串口发送汉字与字节程序(工作总结)
最近使用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;
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1