📄 单片机与电脑通讯.c
字号:
//MCU: AT89S51
//晶振:11.0592M (一定要用这个晶振)
#include"AT89X51.H"
#include "absacc.h"
#include "stdio.h"
#include "stdlib.h"
unsigned char code numcode[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
};//数字0~9及"-"共阳数码管代码
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char dispbuff[8]={0,0,0,0,0,0,0,0};
unsigned char disp_bit_count;
unsigned char disp_count;
unsigned char send_allow=1;
unsigned int send_count; /*定时器计数变量*/
unsigned char zhi=0;
unsigned char r_char;
/********1ms延时子程序***********/
delay_nms(unsigned int n)
{
unsigned int i;
unsigned char j;
for(i=0;i<n;i++)
for(j=0;j<120;j++)
; //空操作
}
void main(void)
{
// 以下是设置中断和定时器
PT0=1;
ET0=1;
ES=1; //开串口接收中断
IT0=1;IT1=1;
TMOD=0X20;
// 定时器0为产生1ms的中断,定时器1为9600bit/s 的波特率发生器
TH0=-1000/256;
TL0=-1000%256;
TL1=0xfd; //波特率发生
TH1=0xfd;
SCON=0xd8;
PCON=0X00;//波特率不加倍
// 开定时器
TR1=1;
TR0=1;
TI=1;
EA=1;
while(1)
{
if(P2_0==0)
{
delay_nms(2);
if(P2_0==0)
{
//按键SW1按下,停止发送,再按一下继续发送
send_allow^=1;
while(P2_0==0);
}
}
}
}
// 定时器0的中断服务程序,向串口发送姿态数据。
void intsvr1(void) interrupt 1
{
// 重新装入定时器0的初值;
TH0=-1000/256;
TL0=-1000%256;
send_count++;
/*****数码管显示*********/
disp_count++;
if(disp_count==4)
{
disp_count=0;
P0=numcode[dispbuff[disp_bit_count]];
P1=dispbitcode[disp_bit_count];
disp_bit_count++;
if(disp_bit_count==8)
{
disp_bit_count=0;
}
}
if(disp_count==8)
{
disp_count=0;
}
/////////////////////////////////////////////////
//***每隔0.2秒发一个字符到电脑上
if (send_count==200) // 0.2秒判断
{
send_count=0;
if(send_allow==1)
{
putchar(zhi);// 发送字符
zhi++;
}
}
}
void receive(void) interrupt 4 using 1
{
RI=0; //清楚接收标志位
r_char=SBUF; //将接收缓冲区数据读出
dispbuff[2]=r_char/100;
dispbuff[1]=(r_char%100)/10;
dispbuff[0]=r_char%10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -