//9600波特率
#include <reg51.h>
void InitUART(void)//串口初始化
{
TMOD = 0x20;//定时器方式2 8位自动重装
SCON = 0x50;//定时器1为串口提供时钟
TH1 = 0xFD;//初值9600bps
TL1 = TH1;
PCON = 0x00;//波特率不加倍(如果为0x80代表波特率加倍)
EA = 1;//打开总中断
ES = 1;//打开串口中断
TR1 = 1;//定时器1开始计数
}
void SendOneByte(unsigned char c)//发送字节
{
SBUF = c; //赋值给SBUF启动发送
while(!TI); //等待发送完成
TI = 0; //清零发送完成标志位
}
void SendString(unsigned char *p)//发送字符串
{
while(*p) //如果p的内容不等于0
{
SendOneByte(*p++); //从串口发送一字节数据,并且p的地址自增1
}
}
void main(void)//主函数
{
InitUART();//初始化串口
while(1); //死循环(等待串口中断)
}
void UARTInterrupt(void) interrupt 4//串口中断
{
unsigned char temp;//定义临时变量
static unsigned char cont; //定义静态变量(用于保存状态)
if(RI) //串口收到数据
{
RI = 0;//清零接收标志位
temp=SBUF;//获取收到的数据
if(!cont)//如果cont为0 (表示第一次接收数据)
{
if(temp<4)//收到的数据小于4(单片机只有P0-P3所以大于3的不做处理)
{
cont=1;//首先cont赋1
cont=cont<<temp;//进行移位 收到的数据=0代表cont=0x01;收到的数据=1代表cont=0x03;避开0表示收到第一次数据
}
else//如果大于4
{
SendString("选择端口错误!只能为P0-P3\r\n");//向电脑反馈信息 大于4提示选择端口错误
}
}
else//cont不为0代表已经收到第一次数据
{
switch(cont)//选择输出口
{
case 0x01://如果是0x01,P0口输出第二次数据
P0=temp;break;
case 0x02://如果是0x02,P1口输出第二次数据
P1=temp;break;
case 0x04://如果是0x04,P2口输出第二次数据
P2=temp;break;
case 0x08://如果是0x08,P3口输出第二次数据
P3=temp;break;
}
cont=0;//清零cont 准备下一次接收数据
}
}
else//如果不是接收到数据(发送数据完成中断)
TI = 0;//清零发送标志位
}
顺便帮你写个控制软件吧。
求一个C51单片机用串口发送代码的程序简单例子,比如发送代码是06 01前面是ID后面是控制码。请大神指点。~
#includemain(){TMOD=0x20TH1=0xfd;TL1=0xfd;TR1=1;SBUF=0x06;while(TI==0);TI=0;SBUF=0x01;while(TI==0);TI=0;while(1);}
这个简单,不管用什么通信协议,都可以完成,再说了,你所谓采集信息,那些玩意也是用PLC完成的,单片机根本不考虑,你这里,单片机只完成一个简单的数据双向传递功能,没什么难度。
#19263935031#
求一80C51单片机的C程序 - ******
#魏李# #include unsigned char flag,num,keyn;sbit KEY=P3^0;sbit LED1=P3^4;sbit LED2=P3^5void delay(unsigned int a){ unsigned int i,j; for(i=0;i<125;...
#19263935031#
求一个简单的51单片机c语言程序设计~ - ******
#魏李# 机的外部结构 :1.DIP40 双列直插;2.P0 ,P1 ,P2 ,P3 四个8 位准双向 I/O 引脚;(作为 I/O 输入时,要先输出高电平)3.电源 VCC ( PIN40 )和地线 GND ( PIN20 );4.高电平复位 RESET ( PIN9 );(10uF 电容接 VCC 与 RESET ,即可实现上电复位...
#19263935031#
一道51单片机的C语言程序,关于串口通讯的,很简单...... - ******
#魏李# #include<reg52.h> //增强型52寄存器的定义 #define uchar unsigned char //用uchar代替unsigned char #define uint unsigned int //用uint代替unsigned int unsigned char flag,a,i; //定义变量flag,a,i uchar code table[]="I receive,thanks"; //定义一个...
#19263935031#
急求简单51单片机控制电路C语言程序 ******
#魏李# 【2011-3-8已更新,有结果吱一下】 砖头如下: #inlcude <reg51.h> sbit OUT=P2^0; sbit Key=P3^3; #define DELAYCONST 50000// #define DELAYCONST2 20//简单的定时参数设定. void Delay(char j) { unsigned int k,l; for(j=0;j<60;j++) ...
#19263935031#
求51单片机C语言编的简易密码锁程序 - ******
#魏李# 首先得说明我这个可是自己原创手打的,但是没去仿真了,程序可能有错误,你自己修改下吧 #include<reg52.h> typedef unsigned char uchar; typedef unsigned int uint;sbit key1=P0^0; sbit key2=P0^1; sbit key3=P0^2; sbit key4=P0^3;sbit wela=...
#19263935031#
用c语言编写阶梯波(51单片机的),求这个程序,各位高手帮帮忙!谢谢! - ******
#魏李# #你的wave接到哪个io上就可以了 int i,wave = 0,timeout = 1000; for(;;){ wave = wave == 0? 1:0; for(i = 0; i; }
#19263935031#
急求51单片机计数器的C程序!!! - ******
#魏李# #include "reg51.h" unsigned char time; void main() { EX0=1; //开外部中断 IT0=1;//设置边沿触发 EA=1; //开放全局中断 while(1) { P0=~time; // 通过P0口的LED显示出计数值(二进制形式) } } void INT_0() interrupt 0 { while(INT0==0); time++;//每按下一次计数加1.}
#19263935031#
求一份51单片机控制直流电动机的c或者汇编的程序,最好能配有原理图,感激不尽 - ******
#魏李# //直流电机正反转#include<reg52.h> sbit Key_UP=P3^2; //正转按键 对应实验板上的K1 sbit Key_DOWN=P3^3;//反转按键 对应实验板上的K2 sbit Key_STOP=P3^4;//停止键 对应实验板上的K3 sbit ZZ=P1^0;//控制端 sbit FZ=P1^1;//控制端...
#19263935031#
求解 51单片机C语言程序 - ******
#魏李# void int1() interrupt 0 //这里是0,因为你好像用的是外部中断0,而不是定时器中断0 { KEY1=1; P0 = table1[10];Delay(10); }
#19263935031#
求一份51单片机1602时钟的c程序.最好不用到ds1302.从通电计时就可以了,不用显示时时时间 - ******
#魏李# #include #define uint unsigned int#define uchar unsigned char#define lcd1602 P2sbit rs=P3^0;sbit rw=...