蓝桥杯单片机——电位器电压与光敏传感器电压同时采样显示

 用PCF8591采样电位器电压与光敏传感器电压并同时显示在数码管上(参考来源:小蜜蜂老师)

#include <reg52.h>
#include <iic.h>

unsigned char code smg_nodot[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code smg_dot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned int dat_rd1=0;
unsigned int dat_rb2=0;
void delaysmg(unsigned int t)
{
	while(t--);
}
void displaysmg_byte(unsigned char pos,unsigned char value)
{
	P2=0XE0;P0=0XFF;
	P2=0XC0;P0=0X01<<pos;
	P2=0XE0;P0=value;
}
void display_RD1_Rb2()
{
	 displaysmg_byte(0,smg_dot[dat_rd1/100]);
	 delaysmg(100);
	 displaysmg_byte(1,smg_nodot[(dat_rd1/10)%10]);
	 delaysmg(100);
	 displaysmg_byte(2,smg_nodot[dat_rd1%10]);
	 delaysmg(100);

	 displaysmg_byte(5,smg_dot[dat_rb2/100]);
	 delaysmg(100);
	 displaysmg_byte(6,smg_nodot[(dat_rb2/10)%10]);
	 delaysmg(100);
	 displaysmg_byte(7,smg_nodot[dat_rb2%10]);
	 delaysmg(100);
	 P2=0Xc0;P0=0XFF;
	 P2=0XE0;P0=0XFF;
}
unsigned char read_rd1_rb2(unsigned char AIN)
{
   unsigned char dat_u;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	if(AIN==1)
	{
	  	IIC_SendByte(0x01);
	}
	else if(AIN==3)
	{
		IIC_SendByte(0x03);
	}
	IIC_WaitAck();
	IIC_Stop();

	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	dat_u=IIC_RecByte();
	IIC_WaitAck();
	IIC_SendAck(1);
	IIC_Stop();
	return dat_u;
}
 void read_adc()
 {
	dat_rd1=read_rd1_rb2(1)*(5.0/255)*100;
	dat_rb2=read_rd1_rb2(3)*(5.0/255)*100;
 }
void main()
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	while(1)
	{
	  read_adc();
	  display_RD1_Rb2();
	}
}

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以使用以下代码对32单片机检测左边电位器电压并在串口上进行显示: ```c #include<reg52.h> #include<stdio.h> #include<string.h> #define BAUDRATE 9600 //波特率 #define FOSC 11059200L //晶振频率 sbit pot_left = P1^0; //左边电位器连接的引脚 void UART_Init() { TMOD |= 0x20; //设置为模式2 TH1 = TL1 = -(FOSC/12/BAUDRATE); //设置波特率 PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //设置为8位数据位,允许接收 ES = 1; //使能串口中断 EA = 1; //使能总中断 } void UART_SendByte(unsigned char byte) { SBUF = byte; //将数据写入发送缓冲区 while(!TI); //等待发送完成 TI = 0; //清除发送完成标志 } void UART_SendString(char *str) { while(*str) { UART_SendByte(*str++); } } void UART_Interrupt() interrupt 4 { if(RI) //如果是接收中断 { RI = 0; //清除接收标志 } if(TI) //如果是发送中断 { TI = 0; //清除发送标志 } } void main() { char buffer[20]; float voltage; UART_Init(); while(1) { voltage = pot_left / 255.0 * 5.0; //计算电压值 sprintf(buffer, "Left potentiometer voltage: %.2f V\r\n", voltage); //将电压值格式化为字符串 UART_SendString(buffer); //发送字符串到串口 delay(1000); //延时1秒 } } ``` 需要注意的是,该代码中使用的是模拟输入的电位器,如果您需要使用数字电位器,请根据具体情况进行修改。同时,由于32单片机没有内置浮点运算器,因此需要使用sprintf函数将浮点数格式化为字符串进行输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值