九齐单片机软件开发--实时温度检测3950 100K 1% NTC

本文介绍了九齐系列单片机的资源获取、NYIDE编译器的使用方法,包括新建项目配置和仿真注意事项,并给出了一个实时温度检测的软件示例,涉及ADC配置和二分查找算法的应用。
摘要由CSDN通过智能技术生成

前言

九齐系列的单片机芯片相关的资料在官网上都能找到,芯片价格是比较实惠,但是在资源方面比较紧张,在芯片选型上要多做注意。

NYIDE

九齐自己的编译器,可以直接在九齐的官网上下载。编译环境、Q-Writer、相关文档也都可以在官网上自行下载,https://www.nyquest.com.tw/tw/support/download
在编译器上面的菜单栏里面可以切换简体中文,新建项目时可以先用NYIDE新建C或者汇编的官例去做参考。新建项目的IC母体配置根据实际需求进行配置。
特别要注意做仿真时要注意九齐在仿真器上和在实物板子上的区别(九齐的仿真器是直连没有保护措施,还要注意短路等问题),不然容易踩坑。

项目实例

这里用一个实时温度检测做一个软件示例(只贴出主要部分),使用的IC母体是062E。
【ADC部分】配置为12位的ADC

void ADC_Init(void) {
	//----- Initial ADC-----
	//ADMD = C_ADC_En | C_ADC_CH_En | C_ADC_PB0 | C_Quarter_VDD; // Enable ADC power, Disable global ADC input channel, Select PA0 pad as ADC input (SFR "ADMD")
	//ADVREFH = C_Vrefh_2V; // ADC reference high voltage is supplied by internal 3V  (Note: ADC clock freq. must be equal or less 500KHz)
	//----- ADC clock frequency select----------------------------
	ADR = C_Ckl_Div16; // ADC clock=Fcpu/1, Clear ADIF, disable ADC interrupt
    //----- ADC Sampling pulse width select-------------
	ADCR = C_Sample_8clk | C_12BIT; // Sample pulse width=8 adc clock, ADC select 12-bit conversion ( Note: ADC clock freq. must be equal or less 2MHz)
	PACON = C_PB0_AIN5 | C_PB1_AIN6; 
	// ADMDbits.GCHS = 1;							  // Enable global ADC channel	(SFR "ADMD")
	delay(50);									  // Delay 0.56*2ms(Instruction clock=4MHz/2T) waiting ADC stable
}
//	ch:   C_Quarter_VDD  C_VSS C_ADC_PB0
//  vref: C_Vrefh_VDD,  C_Vrefh_4V,C_Vrefh_3V,C_Vrefh_2V 参考电压
uint16_t Get_ADC_Value(u8 ch , u8 vref) {
	u8 R_VDD_DATA_HB, R__DATA_LB;	
	ADVREFH = vref;
	ADMD = 0x90 | ch;
	ADMDbits.START = 1;		
	while(ADMDbits.EOC==0);
	R_VDD_DATA_HB = ADD;
    R__DATA_LB = 0x0F & ADR;	 
    return (((uint16_t)R_VDD_DATA_HB)<<4 | R__DATA_LB);
}

【实时温度检测】 因为资源有限只取8位做比较,将大于8位的存在一个数组,小于8位的存在另一个数组中。使用查表法即可。

const uint8_t ntc_ad_h[] = {
	0x8C,0x89,0x86,0x83,0x80,0x7D,0x7B,0x78,0x75,0x72,0x70,0x6D,0x6B,0x68,0x65,0x63,0x61,0x5E,0x5C,0x59,0x57,0x55,0x53,0x50,0x4E,0x4C,0x4A,0x48,0x46,0x44,0x42,0x40,0x3F,0x3D,
	0x3B,0x3A,0x38,0x36,0x35,0x33,0x32,0x30,0x2F,0x2E,0x2C,0x2B,0x2A,0x29,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1D,0x1C,0x1B,0x1A,0x19,0x19,0x18,0x17,0x17,
	0x16,0x15,0x15,0x14,0x14,0x13,0x12,0x12,0x11,0x11,0x10,0x10,0x10
};
const uint8_t ntc_ad_l[] = {
	0xF9,0xF2,0xEB,0xE5,0xDF,0xD9,0xD3,0xCD,0xC8,0xC3,0xBE,0xB9,0xB4,0xAF,0xAA,0xA6,0xA2,0x9D,0x99,0x95,0x92,0x8E,0x8A,0x87,0x83,0x80,0x7D,0x7A,0x77,0x74,0x71,0x6E,0x6B,0x69,
	0x66,0x64,0x61,0x5F,0x5D,0x5A,0x58,0x56,0x54,0x52,0x50,0x4E,0x4C,0x4B,0x49,0x47,0x46,0x44,0x42,0x41,0x3F,0x3E,0x3D,0x3B,0x3A,0x39,0x37,0x36,0x35,0x34,0x33,0x31,0x30,
	0x2F,0x2E,0x2D,0x2C,0x2B,0x2A,0x2A,0x29,0x28,0x27,0x26,0x25,0x25,0x24,0x23,0x22,0x22,0x21,0x20,0x20,0x1F,0x1E,0x1E,0x1D,0x1D,0x1C,0x1B,0x1B,0x1A,0x1A,0x19,0x19,0x18,0x18,
	0x17,0x17,0x17,0x16,0x16,0x15,0x15,0x14,0x14,0x14,0x13,0x13,0x13,0x12,0x12,0x12,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0xF,0xF,0xF,0xE,0xE
};
/*
	参数:
	 - target 目标值
	 - left,right 二分查找左/右边界
	 - ntc_ad[] 查找数组
	 - alog 数组大小
*/
uint8_t binary_search(uint8_t target, uint8_t left, uint8_t right, uint8_t ntc_ad[], uint8_t alog) {
	uint8_t res;
	while (left < right) {
        res = left + ((right - left) >> 1);  // 计算中间索引
        if (ntc_ad[res] == target) {  // 目标值等于中间元素
            return res;
        } else if (ntc_ad[res] > target) {  // 目标值小于中间元素
            left = res + 1;  // 在右半区间继续查找
        } else {  // 目标值大于中间元素
            right = res - 1;  // 在左半区间继续查找
        }
    }

    // 目标值不在数组中,返回第一个大于目标值的元素索引
    if (left < alog && ntc_ad[left] > target) {
        return left;
    }

	return right;
}
void hot_scan(void) {
	uint16_t hot_adc_value = Get_ADC_Value(C_ADC_PB0, C_Vrefh_VDD);
	
	if (hot_adc_value  > 0xFF) {
		value = binary_search((uint8_t)(hot_adc_value >> 4), 0, 80, ntc_ad_h, 81) + 25;
	} else {
		value = binary_search((uint8_t)(hot_adc_value), 0, 128, ntc_ad_l, 129) + 105;
	}
	/*
			..................
			..................
	*/
}
  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值