求一个基于51单片机的C语言程序,要求从串口接收一组数据,然后将其通过串口输出

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-06-25
求一个51单片机c语言程序,当串口输入一个数,然后单片机返回指定的数字

给个简单的。
main()
{
//初始化串口
SCON=0x50;
TMOD=0x20;
TH1=TL1=0xff;//视Fosc,给实际波特率发生器初值。
TR1=1;
while(1)
{
while(RI==0);RI=0;
switch(SBUF)
{
case 0x55:
SBUF=0x31;while(TI==0);TI=0;
SBUF=0x31;while(TI==0);TI=0;
SBUF=0x31;while(TI==0);TI=0;
SBUF=0x31;while(TI==0);TI=0;
SBUF=0x31;while(TI==0);TI=0;
break;
case 0x66:
SBUF=0x32;while(TI==0);TI=0;
SBUF=0x32;while(TI==0);TI=0;
SBUF=0x32;while(TI==0);TI=0;
SBUF=0x32;while(TI==0);TI=0;
SBUF=0x32;while(TI==0);TI=0;
break;
}
}
}
实际情况:
【1】串口的初始化,波特率和通信模式设置。
【2】更详尽的协议还包括:输入的数据格式、返回的数据格式。(这里,我只是把55当做了0x55处理,返回的内容是ASCII字符,六个数字1)
【3】当输入数据不止一个字节进行判断时,需要考虑串口接收的缓冲数组。同时对数组进行数据接收和判断。并考虑用中断处理接收过程。
【4】返回数据,考虑发送缓冲数组。用中断考虑发送过程。
如果你愿意的话,大家更喜欢阅读程序,修改或提出建议。以上只是个简单的例子。

#include
#define uchar unsigned char
#define uint unsigned int
uchar data table[10]; //暂存数组,可以将10改为你需要的数值
/***********************************************
串行口初始化波特率9600,定时器1,工作方式2 *************************************************/
void serial_init(void)
{
TMOD=0x20;//计时器1作为比特率发生器,方式2
TH1=0xfd;
TL1=0xfd; //装入初值
TR1=1;//计时中断允许
SM0=0;
SM1=1;//串行口工作于方式2
ES=1;//串行口中断允许
REN=1;//接收允许
EA=1;//总中断允许
}
/********************* **************************
串行口传送数据
传送显示数组各字符给计算机
*************************************************/
void send(uchar *dis)
{
while(*dis!='\0')
{
SBUF=*dis;
dis++;
while(!TI);
TI=0;//软件请发送中断
}
}

void main()
{
serial_init();//初始化
while(SBUF!=0x0d);//计算机键盘按下回车键,则开始将接收到的数据回传给计算机
send(table);
}
/***********************************************
串行中断服务函数
单片机接收数据,存入table数组
*************************************************/
void serial() interrupt 4
{
int i;
ES=0;//关串口中断
table[i++]=SBUF;//命令存到命令数组
RI=0; //软件清除接收中断

ES=1;//开串口中断
}
已经通过proteus仿真如下

#include <AT89X51.H>//单片机51头文件,存放着单片机的寄存器
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
sbit gewei=P2^2; //个位选通定义
sbit shiwei=P2^3; //十位选通定义
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,};// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
void Delay(unsigned int tc) //延时程序
{
while( tc != 0 )
{unsigned int i;
for(i=0; i<100; i++);
tc--;}
}
void LED() //LED显示接收到的数据
{
shiwei=0;
P0=~table[dat/16];
Delay(8);
shiwei=1;
gewei=0;
P0=~table[dat%16];
Delay(5);
gewei=1;
}
void Init_Com(void)//功能:串口初始化,波特率9600,方式1
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void main()//主程序功能:实现接收数据并把接收到的数据原样发送回去///////
{
Init_Com();//串口初始化
// P1=0xf0;
while(1)
{
if ( RI ) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat
RI=0; //RI清零。
SBUF = dat; //在原样把数据发送回去
}
LED(); //显示接收到的数据
}
}

代码转自:《51单片机C语言创新教程》温子祺等著。

/*实验名称:串口收发数据实验
*描 述:在使用单片机的串口接收数据实验当中,
使用串口调试助手发送什么数据,
单片机采用查询法将接收到的数据返发到PC
*作 者:温子祺
*修改日期:2010/5/4
*说 明:代码注释与讲解详见《51单片机C语言创新教程》温子祺等著,北京航空航天大学出版社
*/

#include "stc.h" //加载"stc.h"
/****************************************
*函数名称:UARTInit
*输 入:无
*输 出:无
*功 能:串口初始化
******************************************/
void UARTInit(void) //定义串口初始化函数
{
SCON =0x50; //8位数据位,允许接收
T2CON=0x34; //由定时器2作为波特率发生器
RCAP2L=0xD9; //波特率为9600的低8位
RCAP2H=0xFF; //波特率为9600的高8位
}
/****************************************
*函数名称:UARTSendByte
*输 入:byte 要发送的字节
*输 出:无
*功 能:串口发送单个字节
******************************************/
void UARTSendByte(unsigned char byte)//定义串口发送数据函数
{
SBUF=byte; //缓冲区装载要发送的字节
while(TI==0); //等待发送完毕,TI标志位会置1
TI=0; //清零发送完成标志位
}
/****************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主体
******************************************/
void main(void) //主函数
{
unsigned char recv; //声明变量recv
UARTInit(); //串口初始化
while(1) //进入死循环
{
if(RI) //检测接收完成标志位置1
{
RI=0; //清零接收完成标志位
recv=SBUF; //读取接收到的数据
UARTSendByte(recv); //返回接收到的数据
}
}
}

============================================================

坐等拿分!

串口收发数据,并通过P1口控制8个led显示数据
#include"reg52.h"
unsigned char flag,temp;
void Init()
{
SM0=0;
SM1=1;
REN=1;
PCON=0x00;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
}

void main()
{
Init();
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=temp;
while(!TI);
TI=0;
ES=1;
}
}
}

void serial()interrupt 4
{
if(RI==1)
{
P1=SBUF;
temp=SBUF;
RI=0;
flag=1;
}
}

  • 求一个基于51单片机的C语言程序,要求从串口接收一组数据,然后将其通过...
    答:sbit gewei=P2^2; //个位选通定义 sbit shiwei=P2^3; //十位选通定义 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,};// 0, 1...
  • 跪求一个51单片机控制ws2812灯带的程序,
    答:WS2812是一种自带驱动IC的LED灯珠,可以通过程序控制每个LED的颜色和亮度。以下是一个简单的程序,用于控制144个WS2812 LED灯珠。这个程序是用C语言编写的,用于STC89C52RC单片机。首先,我们需要知道WS2812数据传输协议的一些基本概念。WS2812 LED灯珠需要接收24位数据,每8位代表一个颜色(红色,绿色,蓝...
  • 求一个51单片机简单的中断C语言程序
    答:void delay(uint); //字程序声明 sbit D1=P1^0 ; //位定义 第一盏灯 sbit D2=P1^1 ; //第二盏,同上 sbit D3=P1^2 ; // 3 sbit D4=P1^3 ; // 4 sbit D5
  • 求基于51单片机的电子密码锁的C语言程序。急!!!
    答:if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=3; //可判断是S3键被按下 if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=4; //可判断是S4键被按下 P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)if(P14==0) ...
  • 基于51单片机的999倒计时C语言程序。
    答:要求是能进行9999秒倒计时 用C语言实现 / include<at89X51.h> define uchar unsigned char define uint unsigned int uchar num_qian,num_bai,num_shi,num_ge;//定义千位,百位,十位,个位。uint time;//要显示的时间0~9999 uint tcnt;//计时单元 //***// //以下是端口定义 //**...
  • 求一个c51的单片机c语言小程序,有酬谢。
    答:define TRUE 1//定义布尔量'1':真 define FALSE 0//定义布尔量'0':假 define uchar unsigned char//定义 无符号字符型数据 简称 define uint unsigned int//定义 无符号整型数据 简称 define th1 0xfa//6.51us at 11.0592MHz Fosc for 8bit auto reload mode uchar UART_DataR;//串口接收...
  • 51单片机求这个时钟的c语言程序
    答:以下是四位数码管可调时带秒闪烁的c51单片机电子钟程序(c语言)。/*** 本程序中,晶振为12MHz, ***/ /*** 时间控制采用定时中断控制方式。 ***/ /*** 模式和时间调整采用查询方式。 ***/ include<reg52.h> sbit P20=P2^0;//分个位控制端 sbit P21=P2^1;//分十位控制端 sbit P22=...
  • 求51单片机C语言编的密码锁程序
    答:define uchar unsigned char define BIN(a,b,c,d,e,f,g,h) ((a<<7)+(b<<6)+(c<<5)+(d<<4)+(e<<3)+(f<<2)+(g<<1)+(h<<0))//下面的code表示数组存放在ROM中,因为这个数组的值不需要改写 uchar code KeyCode[16]={15,14,12,8,30,28,24,16,60,56,48,32,120,...
  • 急求一个用51单片机编的可按键调时的数字时钟程序,数码管显示,C语言...
    答:if( leap_year()&& month<=2 ) //既是闰年且是1月和2月c=5;else c=6;week=(year+para_month[month]+date+num_leap+c)%7;//计算对应的星期return week;}//更新显示缓冲区void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s...
  • 51单片机流水灯用C语言编写的设计程序是什么?
    答:include<reg51.h> include<intrins.h> define uchar unsigned char void delay(void){ uchar i,j;for(i=0;i<150;i++)for(j=0;j<240;j++);} main(){ uchar led,i,j;while(1){ for(i=0;i<8;i++){ led=0xfe<<i;for(j=0;j<8-i;j++){ P0=led;led=_crol_(led,1);d...