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 + -
显示快捷键?