欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
給大家分享個51單片機串口發(fā)送漢字與字節(jié)程序(工作總結(jié))
[打印本頁]
作者:
baiyun1234
時間:
2019-9-25 17:41
標題:
給大家分享個51單片機串口發(fā)送漢字與字節(jié)程序(工作總結(jié))
最近使用STC89C58RD+這款CPU,做一個RX232 串口與上位機通訊程序。
功能:得到上位機指令控制一個I/0。急停一段時間向上位機send一個幫助指令(這個需要漢字,這個漢子老坑爹了,需要一個“KeilFDfix_b7(冠銘師兄版)“補丁)
內(nèi)部的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; //將定時器計時時間設(shè)定為10000微秒=10毫秒 計算后得數(shù) TH0=60;
TL0=(65535-50000)%256; // 計算后得數(shù) TL0=175
}
// 發(fā)送
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; //關(guān)閉所有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; //跳出本層循環(huán)
}
}
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;//發(fā)送請求標志位
printf("輸入你想要的漢字。\n "); //方法2
while(!TI);//判斷是否發(fā)送完成 發(fā)送完成出循環(huán)
TI = 0;
delayms(200);//延遲200ms
led_help=1;
i=0;
flag=0;
}
}
}
復(fù)制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1