ddd.c
来自「STC89C52单片机串口通信程下位机595驱动数码管显示」· C语言 代码 · 共 172 行
C
172 行
//串口发送单片机通信程序
//发送格式为:a 1 2 3 4 5 6 7 8
//程序功能:带起始位识别的RS232与单片机通信程序
#include <reg51.h>
#define COUNT 10 // 定义接收缓冲区大小
#define duanma P0
unsigned char buffer[COUNT]; //定义接收缓冲区
unsigned char point; //定义接收数据个数指示变量
void UART_init(); //串口初始化函数
void COM_send(void); //串口接收函数
unsigned char CLU_checkdata(void);//计算校验位函数
void dis();
void DIS_change();
sbit aa=P2^0;
sbit bb=P2^1;
sbit cc=P2^2;
sbit dd=P2^3;
sbit ee=P2^4;
sbit ff=P2^5;
sbit gg=P2^6;
sbit hh=P2^7;
unsigned char DIS_one=0,DIS_two=0,DIS_thr=0,DIS_for=0,DIS_fiv=0,DIS_six=0,DIS_sev=0,DIS_eig=0;
unsigned char data disp_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90,0xff};// 4, 5, 6, 7, 8, 9, off
//--------------------------------------------------------------------------------------------------
// 函数名称: 延时函数
// 函数功能: 动态显示延时
//--------------------------------------------------------------------------------------------------
void delayms(unsigned int f)
{
unsigned int i,j;
for(i=0;i<f;i++)
for(j=0;j<12;j++);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
// 串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{
//初始化串行口和波特率发生器
SCON =0x50; //选择串口工作方式,打开接收允许
TMOD =0x20; //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1; //启动定时器T1
ET1 =1;
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
}
//--------------------------------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始位’S’在内的十位数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
unsigned char RECEIVR_buffer;
if(RI) //处理接收中断
{
RI=0; //清除中断标志位
RECEIVR_buffer=SBUF; //接收串口数据
if(point==0) //如果还没有接收到起始位
{
if(RECEIVR_buffer==0x0a) //判断是否起始标志位
point++; //是准备接收下一位
else
point=0; //不是,继续等待起始位
}
else if(point>0&&point<10) //判断是否接收够十位数据
{
buffer[point++]=RECEIVR_buffer; //不够,把接收到的数据放入接收缓存区
}
else point=0; //缓冲区已满,清除缓存区内数据重新接收
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 显示缓冲区转换
// 函数功能: 转换显示缓存
//--------------------------------------------------------------------------------------------------
void DIS_change()
{
DIS_one=buffer[1];
DIS_two=buffer[2];
DIS_thr=buffer[3];
DIS_for=buffer[4];
DIS_fiv=buffer[5];
DIS_six=buffer[6];
DIS_sev=buffer[7];
DIS_eig=buffer[8];
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 显示函数
// 函数功能: 动态显示八位
//--------------------------------------------------------------------------------------------------
void dis(void)
{
{
aa=0;
duanma=disp_code[DIS_one];
delayms(2);
duanma=disp_code[10];
aa=1;
bb=0;
duanma=disp_code[DIS_two];
delayms(2);
duanma=disp_code[10];
bb=1;
cc=0;
duanma=disp_code[DIS_thr];
delayms(2);
duanma=disp_code[10];
cc=1;
dd=0;
duanma=disp_code[DIS_for];
delayms(2);
duanma=disp_code[10];
dd=1;
ee=0;
duanma=disp_code[DIS_fiv];
delayms(2);
duanma=disp_code[10];
ee=1;
ff=0;
duanma=disp_code[DIS_six];
delayms(2);
duanma=disp_code[10];
ff=1;
gg=0;
duanma=disp_code[DIS_sev];
delayms(2);
duanma=disp_code[10];
gg=1;
hh=0;
duanma=disp_code[DIS_eig];
delayms(2);
duanma=disp_code[10];
hh=1;
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度个子函数,完成通信过程
//--------------------------------------------------------------------------------------------------
void main(void)
{
UART_init(); //初始化串口
do
{
DIS_change();
dis();
}
while(1);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?