头像-219699

电子WWW

  • 河南省郑州市
  • 单片机 嵌入式 FPGA/CPLD EDA/PCB RF/无线 LED/显示
  • 消费电子 医疗电子 其它

个人成就

获得 11 次赞

帮助过5人

士兰微SC32F5832ADC怎么配置

不知道有没有人用过这款芯片,如果有人用过的话,请问一下ADC怎么配置

stm32定时器计算的问题?

Tout=((arr+1)*(psc+1))/Tclk,重装值arr需要+1吗?我看有些教程里面没有+1,加不加1,除了定时时间上有点误差,其他的还有什么区别吗?

HMC5883L磁传感器数据不会变化

把程序下载到板子上后,通过lcd1602显示,数据只显示045.0,一直不会变化,是什么原因? //@@*************************************** // HMC5883 IIC测试程序 // 使用单片机STC89C51 // 晶振:11.0592M // 显示:LCD1602 // 编译环境 Keil uVision2 // 参考宏晶网站24c04通信程序 // 时间:2011年3月1日 //@@**************************************** #include <REG51.H> #include <math.h> //Keil library #include <stdio.h> //Keil library #include <INTRINS.H> #define uchar unsigned char #define uint unsigned int //使用的端口,请按照以下接线 #define DataPort P0 //LCD1602数据端口 sbit SCL=P2^0; //IIC时钟引脚定义 sbit SDA=P2^1; //IIC数据引脚定义 sbit LCM_RS=P2^6; //LCD1602命令端口 sbit LCM_RW=P2^5; //LCD1602命令端口 sbit LCM_EN=P2^7; //LCD1602命令端口 #define SlaveAddress 0x3C //定义器件在IIC总线中的从地址 typedef unsigned char BYTE; typedef unsigned short WORD; BYTE BUF[8]; //接收数据缓存区 uchar geshibaiqianwan; //显示变量 int dis_data; //变量 void delay(unsigned int k); void InitLcd(); void Init_HMC5883(void); //初始化5883 void WriteDataLCM(uchar dataW); void WriteCommandLCM(uchar CMDuchar Attribc); void DisplayOneChar(uchar Xuchar Yuchar DData); void conversion(uint temp_data); void Single_Write_HMC5883(uchar REG_Addressuchar 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(); //----------------------------------- //@@********************************************************* 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 ij; for(i=0;i<k;i++) { for(j=0;j<121;j++) {;}} } /@@*******************************/ void WaitForEnable(void) { DataPort=0xff; LCM_RS=0;LCM_RW=1;_nop_(); LCM_EN=1;_nop_();_nop_(); while(DataPort&0x80); LCM_EN=0; } /@@*******************************/ void WriteCommandLCM(uchar CMDuchar Attribc) { if(Attribc)WaitForEnable(); LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } /@@*******************************/ void WriteDataLCM(uchar dataW) { WaitForEnable(); LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } /@@***********************************/ void InitLcd() { WriteCommandLCM(0x381); WriteCommandLCM(0x081); WriteCommandLCM(0x011); WriteCommandLCM(0x061); WriteCommandLCM(0x0c1); } /@@***********************************/ void DisplayOneChar(uchar Xuchar Yuchar DData) { Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; WriteCommandLCM(X0); WriteDataLCM(DData); } /@@************************************** 延时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_(); _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<8; i++) //8位计数器 { dat <<= 1; //移出数据的最高位 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<8; i++) //8位计数器 { dat <<= 1; SCL = 1; //拉高时钟线 Delay5us(); //延时 dat |= SDA; //读数据 SCL = 0; //拉低时钟线 Delay5us(); //延时 } return dat; } //@@*************************************************** void Single_Write_HMC5883(uchar REG_Addressuchar 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<6; i++) //连续读取6个地址数据,存储中BUF { BUF[i] = HMC5883_RecvByte(); //BUF[0]存储数据 if (i == 5) { HMC5883_SendACK(1); //最后一个数据需要回NOACK } else { HMC5883_SendACK(0); //回应ACK } } HMC5883_Stop(); //停止信号 Delay5ms(); } //初始化HMC5883,根据需要请参考pdf进行修改**** void Init_HMC5883() { Single_Write_HMC5883(0x020x00); // } //@@********************************************************* //主程序******** //@@********************************************************* void main() { // bit sign_bit; unsigned int i; int xyz; double angle; delay(500); InitLcd(); Init_HMC5883(); while(1) //循环 { Multiple_Read_HMC5883(); //连续读出数据,存储在BUF中 //---------显示X轴 x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register angle= atan2((double)y(double)x) * (180 / 3.14159265) + 180; // angle in degrees angle*=10; conversion(angle); //计算数据和显示 DisplayOneChar(20'A'); DisplayOneChar(30':'); DisplayOneChar(40qian); DisplayOneChar(50bai); DisplayOneChar(60shi); DisplayOneChar(70'.'); DisplayOneChar(80ge); for (i=0;i<10000;i++); //延时 } }

multisim用哪个工具可以给输入端一个持续的高低电平变化

用哪个工具可以给输入端一个持续的高低电平变化

multisim的使用

multisim怎么在线上标数字

PNP三极管导通后为什么集电极的电压与发射极的电压相接近

基极电压小于发射极电压的时候三极管导通,导通后为什么集电极的电压与发射极的电压相接近,而不是略大于基极电压?

Altium Designer19相关设置

Altium Designer19怎么关闭封装显示?

DS3231时钟模块精度问题

用STM32驱动DS3231做了一时钟,理论上DS3231不是应该有温度补偿吗?然后一年下来误差不会超过2分钟,但是我才让时钟工作了不到一天,就和手机时间对比了一下,差了2分钟多,难道温度补偿是通过编写程序实现的?