下载链接
链接:https://pan.baidu.com/s/1sWsX1IEf8HnlWvq1zNJYmA
提取码:004z
复制这段内容后打开百度网盘手机App,操作更方便哦
#include <iostm8s103f3.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define MASS_KEY1 0xAE
#define MASS_KEY2 0x56
#define EEP_BASE 0x4000
void delay_ms(uchar ms)
{
uchar i,j;
while(ms--)
{
for(i=4;i!=0;i--)
for(j=100;j!=0;j--);
}
}
void adc_init(void)
{
ADC_CR1_ADON = 1; //打开adc
ADC_CSR_CH = 0; //AIN0脚
ADC_CSR_EOCIE = 1; //打开ADC中断
ADC_CR1_SPSEL = 2; //4分频时钟
}
/*
uint adc_get(void)
{
uint dataH, dataL;
ulong value = 0;
uint voltage = 0; //电压单位为(mV)
ADC_CR1_ADON = 1; //使能adc
while(ADC_CSR_EOC==0);
dataH = ADC_DRH; //左对齐数据
dataL = ADC_DRL; //读取寄存器数据
ADC_CSR_EOC = 0;
value = dataH<<2|dataL;
voltage = (value*5000)>>10; //计算实际电压
return voltage;
}
//中位值滤波
uint Sort_detection(uchar channel)
{
uchar i,j,k;
uint tmp,adc_buf[5];
ADC_CSR_CH = channel;
asm("nop");
asm("nop");
asm("nop");
for(i=0;i<5;i++)
{
adc_buf[i] = adc_get();
delay_ms(1);
}
for(j=4;j>0;j--)
{
for(k=0;k<j;k++)
{
if(adc_buf[k]>adc_buf[k+1])
{
tmp = adc_buf[k+1];
adc_buf[k+1] = adc_buf[k];
adc_buf[k] = tmp;
}
}
}
return adc_buf[2];
}
*/
void uart1_init(void)
{
UART1_CR1=0x00;
UART1_CR2=0x00;
UART1_CR3=0x00;
UART1_BRR2 = 0x01;
UART1_BRR1 = 0x01; //115200波特率
}
void Exit_Init(void)
{
EXTI_CR1_PAIS = 2; //下降沿触发
}
void WDT_Init(void)
{
IWDG_KR = 0xCC; //启动看门狗
IWDG_KR = 0x55; //解除写保护
IWDG_PR = 0x06; //256分频,最高1.02秒
IWDG_RLR = 125; //500ms
IWDG_KR = 0xAA; //写保护
}
void WDT(void)
{
IWDG_KR = 0xAA; //喂狗指令WDT();
}
void EEP_Init(void)
{
FLASH_CR1 = 0x00;
FLASH_CR2 = 0x00;
FLASH_NCR2 = 0xff;
FLASH_DUKR = MASS_KEY1;
FLASH_DUKR = MASS_KEY2;
while(!FLASH_IAPSR_DUL); //等待写保护解锁
}
void eep_write(uint addr,uchar dat) //不同芯片,EEPROM容量不同
{
*((uchar*)(addr + EEP_BASE)) = dat;
while(!FLASH_IAPSR_EOP); //等待写完成
}
uchar eep_read(uint addr)
{
return *((uchar*)(EEP_BASE + addr));
}
void timer_Init(void)
{
TIM1_PSCRH = 0;
TIM1_PSCRL = 1; //(1+1)分频为1M
TIM1_ARRH = 0x3;
TIM1_ARRL = 0xE8; //每1000us中断一次
TIM1_IER = 0x01; //允许更新中断
TIM1_CR1 = 0x01; //计数器使能,开始计数
//TIM2/3/4/5/6须使用与芯片对应的头文件
TIM2_PSCR_PSC = 1; //2^1 分频为1M
TIM2_ARRH = 0x3;
TIM2_ARRL = 0xE8; //每1000us中断一次
TIM2_IER = 0x01; //允许更新中断
TIM2_CR1 = 0x01; //计数器使能,开始计数
}
void main(void)
{
asm("sim"); //关总中断
adc_init();
uart1_init();
Exit_Init();
EEP_Init();
timer_Init();
WDT_Init();
asm("rim"); //开总中断
while(1)
{
asm("nop");
}
}
#define TLI_vector 0x02
#define EXTI0_PA_vector 0x05
#define EXTI1_PB_vector 0x06
#define EXTI2_PC_vector 0x07
#define EXTI3_PD_vector 0x08
#define EXTI4_PE_vector 0x09
#pragma vector = EXTI0_PA_vector
__interrupt void EXTI0_PA(void)
{
//your code here
}
#pragma vector = 0x18
__interrupt void ADC_EOC(void)
{
//左对齐先读高位,右对齐先读低位
//add your code
ADC_CSR_EOC = 0;
}
#pragma vector = TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(void)
{
TIM1_SR1_UIF = 0;
//add your code here
}
#pragma vector = TIM2_OVR_UIF_vector
__interrupt void TIM2_OVR_UIF(void)
{
TIM2_SR1_UIF = 0;
//add your code here
}
以及电阻分压 电阻并联计算