/*************************************************
*功能描述: CEPARK CAN开发板-串口通讯
*说明:波特率设置9600,检验位N,数据位8,停止位1.
* 数据16进制发送,16进制显示。
* 如发送AD,在数码管上显示AD,串口工具接收到数据AD
*版本:v2.00
*声明:程序来自网络,欢迎网友交流改进
* 活跃论坛,共同进步
*作者:协成电子 、hnrain
*时间:2010/09/14
*邮箱:hnrain1004@gmail.com ,HQL19982003@163.com ,qq:87675298
*网站:bbs.cepark.com ;写程序如果有问题,可以在这里讨论
*我们的口号:让不懂can的学习者,也能轻松玩转can
*推荐教材:
饶运涛,邹继军《现场总线 CAN 原理与应用技术》.北京:北京航空航天大学出版社 (这本书,看着不错)
周立功《增强型80c51单片机速成与实战》还有周立功写的一些can通信程序算法很不错,值得学习
本程序,融入了那么一点点点点点,他们的编程思想,哈哈....仅供学习用
****************************************************/
#include <reg52.h>
#include "config.h"
//数码管段码显示:0~f,不亮
uint8 code LED_Disp[] = {0xc0,0xde,0xa2,0x8a,0x9c,0x89,0x81,0xda,0x80,0x88,
0x90,0x85,0xe1,0x86,0xa1,0xb1,0xff};
sfr LedPort = 0x80; //段选段P0
sfr LedCtrl = 0xa0; //位选段P2
uint8 DisBuff[4]={0xc0,0xc0,0xc0,0xc0};
uint8 Txd_data; //接收缓冲
bit Recdat;
void mDelay(uint16 mtime)
{
for(; mtime > 0; mtime--)
{
uint8 j = 244;
while(--j);
}
}
void Hex2Bcd() //HEX转BCD程序
{
DisBuff[0]= LED_Disp[Txd_data%16];
DisBuff[1]= LED_Disp[Txd_data/16];
DisBuff[2]=0xff;
DisBuff[3]=0xff;
}
void LED_Disp_Seg7(uint8 j) //显示子程序
{
for(;j>0;j--)
{
LedCtrl = LedCtrl | 0xf0;
LedPort = DisBuff[0];
LedCtrl = LedCtrl & 0x7f;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
LedPort = DisBuff[1];
LedCtrl = LedCtrl & 0xbf;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
#if 0
LedPort = DisBuff[2];
LedCtrl = LedCtrl & 0xdf;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
LedPort = DisBuff[3];
LedCtrl = LedCtrl & 0xef;
mDelay(5);
LedCtrl = LedCtrl | 0xf0;
#endif
}
}
void InitCom() //初始化串口
{
SCON=0x50; //0101 0000B,工作方式1,8位UART,波特率可变,允许接收
TMOD=0x20; //T1工作于方式2
TCON=0x40; //定时器1开始计数
TH1=250; //T1计数初值
TL1=250;
PCON=0x80; //SMOD置1,双倍速率
RI=0;TI=0;
}
void ComINT() interrupt 4 //中断接收程序
{
if(RI) //判断是否接收完,接收完成后,由硬件置RI位
{
Txd_data=SBUF; //读入缓冲区
RI=0; //清标志
Recdat=1; //有数据,建立标志
}
}
void ComOut(uint8 dat) //向串口发送数据
{
SBUF=dat; //发送数据送缓冲
while(!TI); //等待发送完成
TI=0;
}
void main()
{
mDelay(250);
InitCom();
EA=1;
ES=1;
while(1){
if(Recdat)
{
Hex2Bcd();
ComOut(Txd_data);
Recdat=0;
}
LED_Disp_Seg7(10);
}
}
|