导航:首页 > 操作系统 > pc与单片机通信c

pc与单片机通信c

发布时间:2022-09-02 19:14:17

单片机与PC通信C语言程序(将A/D转换后的信号送到PC)

只要会串口发送就可以了,但单片机的格式设置要与PC机一致,一般需上位机进行简单处理
51程序如下:
TMOD=0x21;//设置定时器1为工作方式2
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
IE = 0x0; // 禁止任何中断
TH1=0xfd;
TL1=0xfd;//16MHz时波特率9600,误差0/
void send(uchar a1) //串口发送程序,一次发1个数据
{
SBUF=a1;
while(!TI);
TI=0;
Delay_MS(5);
}
如果是8位二进制数则一次可发送出去 ,若超过8位则需两次或多次发送,上位机收到后要将其
组合

❷ 单片机与PC(怎样用C语言使两者连接)

int tty_init()
{
fd = open(COM2, O_RDWR );
if (fd <0)
{
perror(COM2);
exit(-1);
}

tcgetattr(fd,&oldtio); //保存当前设置
bzero(&newtio, sizeof(newtio));

newtio.c_cflag = BAUDRATE | /*CRTSCTS |*/ CS8 /*| CLOCAL | CREAD */;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;

newtio.c_cc[VINTR] = 0; /* Ctrl-c */
newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */
newtio.c_cc[VERASE] = 0; /* del */
newtio.c_cc[VKILL] = 0; /* @ */
newtio.c_cc[VEOF] = 4; /* Ctrl-d */
newtio.c_cc[VTIME] = 0; /* 不使用分割字符组的计时器 */
newtio.c_cc[VMIN] = 1; /* 在读取到 1 个字符前先停止 */
newtio.c_cc[VSWTC] = 0; /* '\0' */
newtio.c_cc[VSTART] = 0; /* Ctrl-q */
newtio.c_cc[VSTOP] = 0; /* Ctrl-s */
newtio.c_cc[VSUSP] = 0; /* Ctrl-z */
newtio.c_cc[VEOL] = 0; /* '\0' */
newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */
newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */
newtio.c_cc[VWERASE] = 0; /* Ctrl-w */
newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */
newtio.c_cc[VEOL2] = 0; /* '\0' */

tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio); //设置新参数

return 0;
}

一般的单片机我不太了解,但是跟ARM板的交叉编译环境初始化串口差不多,代码就在上面,看看对你有帮助没.

❸ c编程:PC发送单个字符给单片机,当单片机接收到PC机发送过来的单个数据后,转发给PC

这是最简单的单片机与PC机串口通信的程序。单片机收到单个字符无需判断,原字符发送出去即可。可以用proteus 仿真测试,用虚拟终端代替PC机,用电脑键盘输入字符,由虚拟终端发送给单片机,单片机收到按原字符返回,虚拟终端就会显示出接收的字符。仿真图如下

❹ 用89C52单片机与PC串口通信,谁能帮忙写代码要用C语言编写的

单片机定时发送字串给PC机

#include < reg52.h >
#include < intrins.h >
#include < stdio.h >

#define uchar unsigned char
#define uint unsigned int

/**********************************************************
* *
* 延时函数 *
* *
**********************************************************/
void delay(int ms)
{
uchar i;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

/**********************************************************
* *
* 主程序 *
* *
**********************************************************/
main()
{
SCON=0x50; //串口模式1,允许接收
TMOD=0x20; //定时器1为模式2,8-bit 自动装载方式
PCON=0x00; //波特率不倍增

TL1=0xfd;
TH1=0xfd; //波特率9600
TI=1; //TI 置1,以发送第一个字节
TR1=1; //启动定时器 T1

while(1)
{
printf (" 真诚与各位单片机高手切磋学习\n"); //向PC机发送数据
delay(500);
printf (" welcome to www.hebeihjl.com\n"); //向PC机发送数据
delay(500);
printf (" qq892793019\n"); //向PC机发送数据
delay(500);
printf (" \n"); //向PC端发送数据
delay(500);
}
}

/*********************************************************/

❺ 基于RS485总线的PC与多个单片机通信的C语言程序

这个问题很简单,用485通讯的话,思路如下
思路:
PC方面:可以用MSCOMM控件先发一个字符表示接收地址,后延迟1ms,(注意PC端在485通讯在字符发送过程中一定要加延迟,这是我多次测试的总结,如果是用调试助手的话,他内部代码已经加过延迟了,就不必考虑这个问题)再发控制指令,初学者建议直接用调试助手
单片机方面:首先对接收数据进行核对,如果不是本地地址,放弃,如果是本地地址,在检测命令是否正确,如果正确,做出处理后返回PC本地地址并发送命令
我举个例子教你怎么玩多站通讯,下面是我已经通过测试的一个程序
#include <reg51.h> //选用晶振11.0592MHz
#include <absacc.h>
#define DATA51 DBYTE[0x80] //80H存数据
#define AddressID 0x31 //本机地址1
sbit RS485E=P3^7; //定义485的使能脚// RS5485E=0为接收状态 RS5485E=1为发送状态
sbit MAX485_DIR=P3^7;
main()
{

//****************通讯设置
SCON = 0xF0; //REN=1允许串行接受状态,串口工作模式3,SM2=1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80; //波特率提高一倍
IP=0x10; //串口优先级高
// TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
TH1 = 0xf4; //fa // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (11.0592M)
TL1 = 0xf4;
TR1 = 1; //开启定时器1
EA = 1; // 开总中断
ES = 1; //开串口中断
RS485E=0; // RS5485E=0为接收状态 RS5485E=1为发送状态
while(1);
}

void counter4(void) interrupt 4 using 2 //串口中断
{
while(RI==0);
RI=0;
if(SBUF==AddressID)
{
while(RI==0);
RI=0;
if(SBUF==0x01) //发送指令
{
MAX485_DIR=1; //开发送
SBUF=AddressID;
while(TI==0);
TI=0;
SBUF=0x6f; //发送o
while(TI==0);
TI=0;
SBUF=0x6b; //发送k
MAX485_DIR=0; //开接收
}

if(SBUF==0x00) //接收
{
//这里怎么处理就看你自己要怎么做了,你没要求,我也不好怎么写,就自己写吧
}
}

}
程序调试通过,可以直接套用

❻ C语言---51单片机与PC串口通信程序

可以用个一维阵列来储存,然后判断是否为3.06

❼ 怎么利用单片机与pc进行实时通信

如果硬件没有问题的话,你的软件程序可以拆分为以下考虑 1、串口通信有问题吗?你先保证PC串口调试软件发一个数据,单片机能准确收到。 调试办法,单片机接收到后,体现在io管脚上或指示灯指示。如pc发送0x55,看看单片机是不是收到了; 2、单片机的lcd液晶显示 你用的是12864不知道控制器是什么信号的,KS0107,T6963C还是ST7920,对照液晶说明书,关键字设置,点亮液晶,比如在固定位置显示一个字符 如果上面两条都实现了, 把两段程序柔和到一起就ok了

❽ PC通过485与51单片机通讯去控制继电器,如何编单片机C语言程序

51对于继电器的控制,只用高低电平就可以了。关键是,你在你的程序里要有一个判断子程序,判断单片机从PC机(通过RS485)穿过来的是什么数据,从而对单片机的某位置位或者复位。比如:你可以用一个if语句,如果收到的数据时11111,在置位,如果收到的数据时00000,则复位,相应的继电器就会动作了。

❾ 求51单片机串口程序,单片机与PC互通讯,C语言

#include<AT89X51.H>
#include<string.h>
#include"com_0.h"

sbitled1=P1^0;
sbitled2=P1^6;
sbitled3=P2^5;
sbitled4=P2^0;
sbitsw1=P3^6;
sbitsw2=P3^7; //接到XTAL1不对

voidSetupTimer0()
{
TMOD&= 0XF0;//仅保留T1信息
TMOD|= 0X02;//设置T0: 定时功能,方式2,自动重载8位定时器/计数器
TH0 =256-250;//定时每0.25ms中断一次
TL0 =256-250;
TR0 =1; //开启定时器
ET0 =1; //定时器0中断打开
}

dataunsignedcharus250;
dataunsignedintms;
voidTimer0_ISR()interrupt 1//定时中断服务程序,为按键消抖服务
{
if(++us250<4)return;
us250=0;++ms;
}

dataunsignedintk1t,k2t;
bit k1s,k2s;
//按键扫描(含消抖),无键盘事件返回0
//按下sw1,返回1抬起, 返回2
//按下sw2,返回3抬起, 返回4
unsignedcharkey()
{
dataunsignedintt;
t = ms-k1t;
if(t>1000) k1t=ms-1000;
if(sw1==1&&k1s==0&& t>10)
{k1s=1; k1t=ms;return2;}
if(sw1==0&&k1s==1&& t>10)
{k1s=0; k1t=ms;return1;}
if(sw1==k1s)k1t=ms;

t = ms-k2t;
if(t>1000) k2t=ms-1000;
if(sw2==1&&k2s==0&& t>10)
{k2s=1; k2t=ms;return4;}
if(sw2==0&&k2s==1&& t>10)
{k2s=0; k2t=ms;return3;}
if(sw2==k2s)k2t=ms;

return0;
}

voidmain()
{
dataunsignedcharch;
datacharbuf[16];
dataunsignedcharbufp;
bit LED2; //用以记住当前led2的状态
us250=ms=bufp=0;
k1t=k2t=0;
sw1=sw2=1=k1s=k2s=1;
SetupTimer0();
Com0Init();
EA=1; //全局中断打开
Com0PutStr("Start... ");
while(1)
{
ch=key();
switch(ch)
{
case1:
led2=LED2;LED2^=1;
Com0PutStr(LED2?"LED2ON ":"LED2OFF ");
break;
case3:
led4=0; Com0PutStr("LED4ON ");
break;
case4:
led4=1; Com0PutStr("LED4OFF ");
break;
}

if(Com0Ready()==0) continue;

ch=Com0Getch();
if(ch==' '||ch==' ') ch=0;
//下面一行防止非法按键造成缓冲溢出
if(bufp>=15){memmove(buf, buf+1,15); bufp=14;}
buf[bufp++]=ch;
if(ch) continue;
if (strcmp("L10",buf)==0) {led1=0;Com0PutStr("LED1ON ");}
elseif (strcmp("L11",buf)==0) {led1=1;Com0PutStr("LED1OFF ");}
elseif (strcmp("L30",buf)==0) {led3=0;Com0PutStr("LED3ON ");}
elseif (strcmp("L31",buf)==0) {led3=1;Com0PutStr("LED3OFF ");}
else { Com0PutStr("Bad command. ");}
bufp=0;//命令处理完毕,则清除缓冲
}
}


❿ 单片机与PC怎么 通信

我就我所知道的给你说说。
单片机的逻辑0是0V,逻辑1是+5V;而PC用的是负逻辑,逻辑0在+9v~+15v之间,逻辑1在-9v~-15v之间。若用九针串口连接的话,先得电平转换,(转换芯片就是大家熟知的RS232,转3.3v
的话用RS3232).之后最重要做麻烦的就是要把时序和波特率设置好(说白了就是遵循相同的协议),这样单片机和PC之间就可以互联互通了,单片机中的串口通信讲的就是这方面的内容,这些资料网上很丰富,或者买个单片机开发板研究研究。

阅读全文

与pc与单片机通信c相关的资料

热点内容
程序员在广州上班 浏览:780
androidlinuxadt 浏览:510
广联达软件加密锁原装芯片 浏览:338
如何打开数据库服务器 浏览:310
kppm是什么app 浏览:538
python多个数组命名 浏览:191
a算法csdn 浏览:23
r720服务器什么年代 浏览:975
本地电脑怎么设置传奇服务器 浏览:1002
安卓10框架怎么制作 浏览:959
程序员退休工资待遇 浏览:609
湛江中文编程数控系统代理 浏览:419
openglandroid书 浏览:170
奇妙组件安卓版叫什么 浏览:729
微信授权什么app权重最高 浏览:11
php循环数组foreach 浏览:78
zip和app有什么区别 浏览:633
乖法快速算法 浏览:872
日本程序员一年工资 浏览:199
出国做程序员怎么样 浏览:736