1023_组个最小数 (20)

本文介绍了一个使用C语言编写的程序,该程序读取一组整数并进行特定处理。程序首先接收10个整数输入到数组中,然后找出第一个非零元素的位置并输出其索引,接着输出所有元素对应的重复数值。
#include<stdio.h>
int main()
{
	int a[10];
	int i,j,k;
	while(~scanf("%d",&a[0]))
	{
		for(i=1;i<10;i++) scanf("%d",&a[i]);
		for(k=1;k<10;k++)
			if(a[k]!=0)
			{
				printf("%d",k);
				a[k]--;
				break;
			}
		for(i=0;i<10;i++)
			for(j=0;j<a[i];j++)
				printf("%d",i);
		printf("\n");
	}
	return 0;
}

#include <STC15.h> #include <intrins.h> typedef unsigned char uchar; typedef unsigned int uint; // 引脚定义 - 完全按照您的图片 sbit LCD_RS = P1^0; // RS → P1.0 ? sbit LCD_E = P1^1; // E → P1.1 ?(重要修正!) // RW引脚接地,代码中不需要控制RW #define LCD_DATA P0 // D0-D7 → P0.0-P0.7 ? sbit DS18B20_DQ = P1^3; // DS18B20 DQ → P1.3 ? sbit HIH_OUT = P1^4; // HIH-5030 OUT → P1.4 ? sbit LED = P1^5; // LED → P1.5(推测) // 函数声明 void DelayMs(uint ms); void LCD_WriteCmd(uchar cmd); void LCD_WriteData(uchar dat); void LCD_Init(); void LCD_ShowStr(uchar x, uchar y, uchar *str); float DS18B20_ReadTemp(); float HIH_ReadHumidity(); /************************ 延时函数 ************************/ void DelayMs(uint ms) { uint i, j; for(i=0; i<ms; i++) for(j=0; j<114; j++); } /************************ LCD1602驱动 ************************/ void LCD_WriteCmd(uchar cmd) { LCD_RS = 0; // 命令模式 LCD_E = 0; LCD_DATA = cmd; LCD_E = 1; // 上升沿锁存命令 LCD_E = 0; DelayMs(2); // 等待命令执行 } void LCD_WriteData(uchar dat) { LCD_RS = 1; // 数据模式 LCD_E = 0; LCD_DATA = dat; LCD_E = 1; // 上升沿锁存数据 LCD_E = 0; DelayMs(2); // 等待数据写入 } void LCD_Init() { DelayMs(20); // LCD上电延时 // 初始化序列 LCD_WriteCmd(0x38); // 8位,2行,5x8 DelayMs(5); LCD_WriteCmd(0x0c); // 显示开,光标关 DelayMs(5); LCD_WriteCmd(0x06); // 光标右移 DelayMs(5); LCD_WriteCmd(0x01); // 清屏 DelayMs(5); } void LCD_ShowStr(uchar x, uchar y, uchar *str) { uchar addr; if(y == 0) addr = 0x80 + x; // 第一行 else addr = 0xC0 + x; // 第二行 LCD_WriteCmd(addr); while(*str != '\0') { LCD_WriteData(*str); str++; } } /************************ DS18B20温度传感器 ************************/ float DS18B20_ReadTemp() { uchar i, temp_low, temp_high; int temp_val; float temperature; // 复位脉冲 DS18B20_DQ = 0; for(i=240; i>0; i--); // 延时约480us DS18B20_DQ = 1; for(i=30; i>0; i--); // 等待响应 // 跳过ROM DS18B20_DQ = 0; for(i=8; i>0; i--) { // 写入0xCC _nop_(); _nop_(); DS18B20_DQ = 0; DelayMs(1); DS18B20_DQ = 1; DelayMs(1); } // 启动转换 for(i=8; i>0; i--) { // 写入0x44 _nop_(); _nop_(); DS18B20_DQ = 0; DelayMs(1); DS18B20_DQ = 1; DelayMs(1); } DelayMs(750); // 等待转换 // 重新初始化 DS18B20_DQ = 0; for(i=240; i>0; i--); DS18B20_DQ = 1; for(i=30; i>0; i--); // 读取温度 DS18B20_DQ = 0; for(i=8; i>0; i--) { // 写0xCC _nop_(); _nop_(); DS18B20_DQ = 0; DelayMs(1); DS18B20_DQ = 1; DelayMs(1); } for(i=8; i>0; i--) { // 写0xBE _nop_(); _nop_(); DS18B20_DQ = 0; DelayMs(1); DS18B20_DQ = 1; DelayMs(1); } // 读取低字节 temp_low = 0; for(i=8; i>0; i--) { DS18B20_DQ = 0; _nop_(); _nop_(); temp_low >>= 1; if(DS18B20_DQ) temp_low |= 0x80; DelayMs(1); } // 读取高字节 temp_high = 0; for(i=8; i>0; i--) { DS18B20_DQ = 0; _nop_(); _nop_(); temp_high >>= 1; if(DS18B20_DQ) temp_high |= 0x80; DelayMs(1); } temp_val = (temp_high << 8) | temp_low; temperature = temp_val * 0.0625; // 12位精度转换 return temperature; } /************************ HIH-5030湿度传感器 ************************/ float HIH_ReadHumidity() { uint adc_value = 0; float voltage, humidity; // 简化ADC读取(P1.4对应ADC通道4) P1M1 = 0x10; // 设置P1.4为高阻输入 P1M0 = 0x00; // 启动ADC转换 ADC_CONTR = 0x84; // 选择通道4 DelayMs(1); ADC_CONTR |= 0x08; // 启动转换 // 等待转换完成 while(!(ADC_CONTR & 0x10)); // 读取结果 adc_value = ADC_RES; adc_value = (adc_value << 2) | (ADC_RESL & 0x03); // 转换为电压 voltage = (adc_value * 5.0) / 1023.0; // 转换为湿度 if(voltage < 0.8) voltage = 0.8; if(voltage > 3.9) voltage = 3.9; humidity = ((voltage - 0.8) / 3.1) * 100.0; if(humidity < 0) humidity = 0; if(humidity > 100) humidity = 100; return humidity; } /************************ 主函数 ************************/ void main() { float temp, hum; uchar temp_str[10], hum_str[10]; uchar temp_int, hum_int; uchar temp_frac, hum_frac; // 初始化IO P0M0 = 0x00; P0M1 = 0x00; // P0为准双向 P1M0 = 0x00; P1M1 = 0x10; // P1.4高阻输入 // 初始化ADC ADC_CONTR = 0x80; // 打开ADC电源 DelayMs(1); // 初始化LCD LCD_Init(); // 显示固定文本 LCD_ShowStr(0, 0, "Temperature:"); LCD_ShowStr(0, 1, "Humidity: "); LCD_ShowStr(12, 0, "C"); LCD_ShowStr(10, 1, "%"); // LED指示灯 LED = 0; // 熄灭LED while(1) { // LED闪烁表示程序运行 LED = ~LED; // 读取温度 temp = DS18B20_ReadTemp(); temp_int = (uchar)temp; // 整数部分 temp_frac = (uchar)((temp - temp_int) * 10); // 小数部分 // 显示温度 if(temp >= 0 && temp < 100) { temp_str[0] = temp_int / 10 + '0'; temp_str[1] = temp_int % 10 + '0'; temp_str[2] = '.'; temp_str[3] = temp_frac + '0'; temp_str[4] = '\0'; } else { temp_str[0] = 'E'; // 错误 temp_str[1] = 'r'; temp_str[2] = 'r'; temp_str[3] = '\0'; } LCD_ShowStr(12, 0, temp_str); // 读取湿度 hum = HIH_ReadHumidity(); hum_int = (uchar)hum; // 整数部分 hum_frac = (uchar)((hum - hum_int) * 10); // 小数部分 // 显示湿度 if(hum >= 0 && hum <= 100) { hum_str[0] = hum_int / 10 + '0'; hum_str[1] = hum_int % 10 + '0'; hum_str[2] = '.'; hum_str[3] = hum_frac + '0'; hum_str[4] = '\0'; } else { hum_str[0] = 'E'; // 错误 hum_str[1] = 'r'; hum_str[2] = 'r'; hum_str[3] = '\0'; } LCD_ShowStr(9, 1, hum_str); DelayMs(2000); // 2秒更新一次 } }这个代码有错误,引脚方面还好,但是LCD屏没有显示东西虽然亮着,而且LED灯一直闪烁,要求实现效果:温度跟随DS18B20变化: DS18B20会返回实际温度(52.0℃在您的图片中) 代码会将温度转换为数字显示在LCD上 湿度跟随HIH-5030变化: HIH-5030的模拟电压会转换为湿度值(44.0%在您的图片中) ADC读取P1.4的电压,计算为湿度百分比 LCD实时更新: 每2秒更新一次显示 温度显示格式:XX.X°C 湿度显示格式:XX.X%
最新发布
12-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值