51单片机串口输出

//***************************************

// HMC5883 51串口测试程序

// 使用单片机STC89C51

// 晶振:11.0592M

// 显示:PC串口

// 编译环境 Keil uVision2

// 参考宏晶网站24c04通信程序

// 时间:2011年3月1日

//****************************************

#include

#include //Keil library

#include //Keil library

#include

#define uchar unsigned char

#define uint unsigned int

//使用的端口,请按照以下接线

#define DataPort P0 //LCD1602数据端口

sbit SCL=P1^0; //IIC时钟引脚定义

sbit SDA=P1^1; //IIC数据引脚定义

#define SlaveAddress 0x3C //定义器件5883在IIC总线中的从地址

typedef unsigned char BYTE;

typedef unsigned short WORD;

BYTE BUF[8]; //接收数据缓存区

uchar ge,shi,bai,qian,wan; //显示变量

int dis_data; //变量

//************

//************

void delay(unsigned int k);

void Init_HMC5883(void); //初始化5883

void conversion(uint temp_data);

void Single_Write_HMC5883(uchar REG_Address,uchar REG_data); //单个写入数据

//uchar Single_Read_HMC5883(uchar REG_Address); //单个读取内部寄存器数据

void Multiple_Read_HMC5883(); //连续的读取内部寄存器数据

//以下是模拟iic使用函数-------------

void Delay5us();

void Delay5ms();

void HMC5883_Start();

void HMC5883_Stop();

void HMC5883_SendACK(bit ack);

bit HMC5883_RecvACK();

void HMC5883_SendByte(BYTE dat);

BYTE HMC5883_RecvByte();

void HMC5883_ReadPage();

void HMC5883_WritePage();

//-----------------------------------

//*********************************************

//串口初始化

//9600 bps @ 11.059 MHz

void init_uart()

{

TMOD=0x21;

TH1=0xfd;

TL1=0xfd;

SCON=0x50;

PS=1; //串口中断设为高优先级别

TR0=1; //启动定时器

TR1=1;

ET0=1; //打开定时器0中断

ES=1;

}

//*********串口数据发送******************

void SeriPushSend(uchar send_data)

{

SBUF=send_data;

while(!TI);TI=0;

}

//*********************************************************

void conversion(uint temp_data)

{

wan=temp_data/10000+0x30 ;

temp_data=temp_data%10000; //取余运算

qian=temp_data/1000+0x30 ;

temp_data=temp_data%1000; //取余运算

bai=temp_data/100+0x30 ;

temp_data=temp_data%100; //取余运算

shi=temp_data/10+0x30 ;

temp_data=temp_data%10; //取余运算

ge=temp_data+0x30;

}

/*******************************/

void delay(unsigned int k)

{

unsigned int i,j;

for(i=0;i

{

for(j=0;j

{;}}

}

/**************************************

延时5微秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,

请调整此延时函数

**************************************/

void Delay5us()

{

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

/**************************************

延时5毫秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

**************************************/

void Delay5ms()

{

WORD n = 560;

while (n--);

}

/**************************************

起始信号

**************************************/

void HMC5883_Start()

{

SDA = 1; //拉高数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 0; //产生下降沿

Delay5us(); //延时

SCL = 0; //拉低时钟线

}

/**************************************

停止信号

**************************************/

void HMC5883_Stop()

{

SDA = 0; //拉低数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 1; //产生上升沿

Delay5us(); //延时

}

/**************************************

发送应答信号

入口参数:ack (0:ACK 1:NAK)

**************************************/

void HMC5883_SendACK(bit ack)

{

SDA = ack; //写应答信号

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

/**************************************

接收应答信号

**************************************/

bit HMC5883_RecvACK()

{

SCL = 1; //拉高时钟线

Delay5us(); //延时

CY = SDA; //读应答信号

SCL = 0; //拉低时钟线

Delay5us(); //延时

return CY;

}

/**************************************

向IIC总线发送一个字节数据

**************************************/

void HMC5883_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i

{

dat

SDA = CY; //送数据口

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

HMC5883_RecvACK();

}

/**************************************

从IIC总线接收一个字节数据

**************************************/

BYTE HMC5883_RecvByte()

{

BYTE i;

BYTE dat = 0;

SDA = 1; //使能内部上拉,准备读取数据,

for (i=0; i

{

dat

SCL = 1; //拉高时钟线

Delay5us(); //延时

dat |= SDA; //读数据

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

return dat;

}

//***************************************************

void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)

{

HMC5883_Start(); //起始信号

HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号

HMC5883_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf

HMC5883_SendByte(REG_data); //内部寄存器数据,请参考中文pdf

HMC5883_Stop(); //发送停止信号

}

/*

//********单字节读取内部寄存器*************************

uchar Single_Read_HMC5883(uchar REG_Address)

{ uchar REG_data;

HMC5883_Start(); //起始信号

HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号

HMC5883_SendByte(REG_Address); //发送存储单元地址,从0开始

HMC5883_Start(); //起始信号

HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号

REG_data=HMC5883_RecvByte(); //读出寄存器数据

HMC5883_SendACK(1);

HMC5883_Stop(); //停止信号

return REG_data;

}

*/

//******************************************************

//

//连续读出HMC5883内部角度数据,地址范围0x3~0x5

//

//******************************************************

void Multiple_read_HMC5883(void)

{ uchar i;

HMC5883_Start(); //起始信号

HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号

HMC5883_SendByte(0x03); //发送存储单元地址,从0x3开始

HMC5883_Start(); //起始信号

HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号

for (i=0; i

{

BUF[i] = HMC5883_RecvByte(); //BUF[0]存储0x32地址中的数据

if (i == 6)

{

HMC5883_SendACK(1); //最后一个数据需要回NOACK

}

else

{

HMC5883_SendACK(0); //回应ACK

}

}

HMC5883_Stop(); //停止信号

Delay5ms();

}

//初始化HMC5883,根据需要请参考pdf进行修改****

void Init_HMC5883()

{

Single_Write_HMC5883(0x02,0x00); //

Single_Write_HMC5883(0x01,0xE0); //

}

//*********************************************************

//主程序********

//*********************************************************

void main()

{ // bit sign_bit;

unsigned int i;

int x,y,z;

double angle;

delay(100);

init_uart();

In

it_HMC5883();

while(1) //循环

{

Multiple_Read_HMC5883(); //连续读出数据,存储在BUF中

x = BUF[0]

y = BUF[4]

z = BUF[2]

angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees

conversion(angle); //计算数据和显示

SeriPushSend(bai);

SeriPushSend(shi);

SeriPushSend(ge);

SeriPushSend(0x0d);

SeriPushSend(0x0a);

for (i=0;i

}

}

//***************************************

// HMC5883 51串口测试程序

// 使用单片机STC89C51

// 晶振:11.0592M

// 显示:PC串口

// 编译环境 Keil uVision2

// 参考宏晶网站24c04通信程序

// 时间:2011年3月1日

//****************************************

#include

#include //Keil library

#include //Keil library

#include

#define uchar unsigned char

#define uint unsigned int

//使用的端口,请按照以下接线

#define DataPort P0 //LCD1602数据端口

sbit SCL=P1^0; //IIC时钟引脚定义

sbit SDA=P1^1; //IIC数据引脚定义

#define SlaveAddress 0x3C //定义器件5883在IIC总线中的从地址

typedef unsigned char BYTE;

typedef unsigned short WORD;

BYTE BUF[8]; //接收数据缓存区

uchar ge,shi,bai,qian,wan; //显示变量

int dis_data; //变量

//************

//************

void delay(unsigned int k);

void Init_HMC5883(void); //初始化5883

void conversion(uint temp_data);

void Single_Write_HMC5883(uchar REG_Address,uchar REG_data); //单个写入数据

//uchar Single_Read_HMC5883(uchar REG_Address); //单个读取内部寄存器数据

void Multiple_Read_HMC5883(); //连续的读取内部寄存器数据

//以下是模拟iic使用函数-------------

void Delay5us();

void Delay5ms();

void HMC5883_Start();

void HMC5883_Stop();

void HMC5883_SendACK(bit ack);

bit HMC5883_RecvACK();

void HMC5883_SendByte(BYTE dat);

BYTE HMC5883_RecvByte();

void HMC5883_ReadPage();

void HMC5883_WritePage();

//-----------------------------------

//*********************************************

//串口初始化

//9600 bps @ 11.059 MHz

void init_uart()

{

TMOD=0x21;

TH1=0xfd;

TL1=0xfd;

SCON=0x50;

PS=1; //串口中断设为高优先级别

TR0=1; //启动定时器

TR1=1;

ET0=1; //打开定时器0中断

ES=1;

}

//*********串口数据发送******************

void SeriPushSend(uchar send_data)

{

SBUF=send_data;

while(!TI);TI=0;

}

//*********************************************************

void conversion(uint temp_data)

{

wan=temp_data/10000+0x30 ;

temp_data=temp_data%10000; //取余运算

qian=temp_data/1000+0x30 ;

temp_data=temp_data%1000; //取余运算

bai=temp_data/100+0x30 ;

temp_data=temp_data%100; //取余运算

shi=temp_data/10+0x30 ;

temp_data=temp_data%10; //取余运算

ge=temp_data+0x30;

}

/*******************************/

void delay(unsigned int k)

{

unsigned int i,j;

for(i=0;i

{

for(j=0;j

{;}}

}

/**************************************

延时5微秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,

请调整此延时函数

**************************************/

void Delay5us()

{

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

/**************************************

延时5毫秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

**************************************/

void Delay5ms()

{

WORD n = 560;

while (n--);

}

/**************************************

起始信号

**************************************/

void HMC5883_Start()

{

SDA = 1; //拉高数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 0; //产生下降沿

Delay5us(); //延时

SCL = 0; //拉低时钟线

}

/**************************************

停止信号

**************************************/

void HMC5883_Stop()

{

SDA = 0; //拉低数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 1; //产生上升沿

Delay5us(); //延时

}

/**************************************

发送应答信号

入口参数:ack (0:ACK 1:NAK)

**************************************/

void HMC5883_SendACK(bit ack)

{

SDA = ack; //写应答信号

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

/**************************************

接收应答信号

**************************************/

bit HMC5883_RecvACK()

{

SCL = 1; //拉高时钟线

Delay5us(); //延时

CY = SDA; //读应答信号

SCL = 0; //拉低时钟线

Delay5us(); //延时

return CY;

}

/**************************************

向IIC总线发送一个字节数据

**************************************/

void HMC5883_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i

{

dat

SDA = CY; //送数据口

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

HMC5883_RecvACK();

}

/**************************************

从IIC总线接收一个字节数据

**************************************/

BYTE HMC5883_RecvByte()

{

BYTE i;

BYTE dat = 0;

SDA = 1; //使能内部上拉,准备读取数据,

for (i=0; i

{

dat

SCL = 1; //拉高时钟线

Delay5us(); //延时

dat |= SDA; //读数据

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

return dat;

}

//***************************************************

void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)

{

HMC5883_Start(); //起始信号

HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号

HMC5883_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf

HMC5883_SendByte(REG_data); //内部寄存器数据,请参考中文pdf

HMC5883_Stop(); //发送停止信号

}

/*

//********单字节读取内部寄存器*************************

uchar Single_Read_HMC5883(uchar REG_Address)

{ uchar REG_data;

HMC5883_Start(); //起始信号

HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号

HMC5883_SendByte(REG_Address); //发送存储单元地址,从0开始

HMC5883_Start(); //起始信号

HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号

REG_data=HMC5883_RecvByte(); //读出寄存器数据

HMC5883_SendACK(1);

HMC5883_Stop(); //停止信号

return REG_data;

}

*/

//******************************************************

//

//连续读出HMC5883内部角度数据,地址范围0x3~0x5

//

//******************************************************

void Multiple_read_HMC5883(void)

{ uchar i;

HMC5883_Start(); //起始信号

HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号

HMC5883_SendByte(0x03); //发送存储单元地址,从0x3开始

HMC5883_Start(); //起始信号

HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号

for (i=0; i

{

BUF[i] = HMC5883_RecvByte(); //BUF[0]存储0x32地址中的数据

if (i == 6)

{

HMC5883_SendACK(1); //最后一个数据需要回NOACK

}

else

{

HMC5883_SendACK(0); //回应ACK

}

}

HMC5883_Stop(); //停止信号

Delay5ms();

}

//初始化HMC5883,根据需要请参考pdf进行修改****

void Init_HMC5883()

{

Single_Write_HMC5883(0x02,0x00); //

Single_Write_HMC5883(0x01,0xE0); //

}

//*********************************************************

//主程序********

//*********************************************************

void main()

{ // bit sign_bit;

unsigned int i;

int x,y,z;

double angle;

delay(100);

init_uart();

In

it_HMC5883();

while(1) //循环

{

Multiple_Read_HMC5883(); //连续读出数据,存储在BUF中

x = BUF[0]

y = BUF[4]

z = BUF[2]

angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees

conversion(angle); //计算数据和显示

SeriPushSend(bai);

SeriPushSend(shi);

SeriPushSend(ge);

SeriPushSend(0x0d);

SeriPushSend(0x0a);

for (i=0;i

}

}


相关内容

  • C51单片机串口通信
  • /* #################################################### C51单片机串口通信控制与信号反馈 作者:nathen_zhang 博客:http://hi.baidu.com/nathen 将单片机与电脑串口相连,电脑发送数0-9到单片机,单片机相应 ...

  • 单片机考试题库
  • 1.十进制数170的十六进制表示数是(A) AAH; AFH; B0H; B1H 2.十进制数175的十六进制表示数是(B) AAH; AFH; ACH; ADH 3.十进制数180的十六进制表示数是(C) B6H; B7H; B4H; B9H 4.十进制数185的十六进制表示数是(D) BAH; ...

  • 舵机的工作原理
  • 基于AT89C2051单片机的多路舵机控制器设计 摘要 舵机是机器人.机电系统和航模的重要执行机构.舵机控制器为舵机提供必要的能源和控制信号.本文提出一种以外部中断计数为基础的PWM 波形实现方法.该方法具有简单方便,成本低,可实现多路独立PWM 输出的优点. 关键词 A T89C205l 舵机控制 ...

  • 单片机与上位机通信协议的制定
  • 单片机与上位机通信协议的制定 单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定! 上行协议,即由单片机向上位机发送数据. 下行协议,即由上位机向单片机发送数据. 而通信协议又要分固定长度和不定长度两种 本文所介绍的协议属于简单的固定字长的通信协议! 下行协议由四个字节构成 上表是简单的 ...

  • 定时器与波特率
  • 在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS-51串行口编程可约定四种工作方式.其中,方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率决定. 串行口的四种工作方式对应着三种波特率.由于输人的移位时钟的来源不同,所以,各种方式的 ...

  • 程控电流源设计毕业设计
  • 武汉纺织大学 毕业设计(论文)任务书 课题名称:程控直流电流源的设计 完成期限: 2016 年2月28日至 2016年5月20日 院系名称:机械工程与自动化 指导教师:薛勇 专业班级:自动化11201 指导教师职称:副教授 学生姓名: 周星星 院系毕业设计(论文)工作领导小组组长签字 一.课题训练内 ...

  • 手机蓝牙遥控小车设计
  • 南阳理工学院 本科生毕业设计(论文) 学院:电子与电气工程学院 专业:电气工程及其自动化 学生: 指导教师: 完成日期年月 南阳理工学院本科生毕业设计(论文) 手机蓝牙遥控小车设计 Design of Bluetooth Mobile Phone Remote Control of Smart Ca ...

  • 低通滤波器设计报告
  • 低通滤波器的设计 摘要 本系统以AT89C51单片机为核心器件制作的一款低通数字滤波器.第一部分我们采用MATLAB设计低通滤波器模型并进行初步仿真得到较为理想的效果.第二部分制作实物过程中分为三步,第一步用proteus仿真便于程序的前期编写:第二部用protell画出电路图,首先利用ADC080 ...

  • 嵌入式课程设计论文
  • 武汉工程大学 课程设计(论文) 题 目 单片机实验课程设计 姓 名 学 号 指导老师 指导教师职称 讲师 年级专业班级 13级信息02班 所在学院 2015年1月14日 目录 摘要 3 前言 4 第一章 IO输入/输出---半导体温度传感器DS18B20实验 5 1.1 系统总体方针图 5 1.2 ...

  • 无线收发模块
  • PTR2000 超小型.超低功耗.高速率19.2K无线收发数传MODEM 一.产品特性! 接收发射合一 ! 工作频率为国际通用的数传频段433MHz ! FSK调制,抗干扰能力强,特别适合工业控制场合! 采用DDS+PLL频率合成技术,频率稳定性极好.! 灵敏度高,达到-105dBm! 最大发射功率 ...