📄 main.c
字号:
TACCTL2=0x00;
TACCR2=0x00;
TAR=0x0000;//clear timer counter计数器值清0
TACTL=TASSEL1+ID1+ID0+MC1+MC0+TACLR;
//定时器A 时钟源为SMCLK,8分频,增减计数模式,清TAR(计数器)
}
#pragma vector = TIMERA0_VECTOR //ccr0 中断服务
__interrupt void ta0_isr(void)
{
TACCR0=0x2EE; //初始值装载
if(++timea0>=1000)
{
timea0=0;
timea1++;
}
}
/**********ADC转换**********/
void adc_init(void)
{
ADC10CTL1=INCH_0+SHS_0+ADC10DIV_0+ADC10SSEL_0+CONSEQ_0;
//开通道0,AD启动信号来源ADC10SC,时钟源内部时钟并1分频,选单通道单次转换
ADC10CTL0=ADC10SHT_0+REF2_5V+REFON+SREF_0+ADC10ON+ADC10IE;
//采样周期为4xADC10CLKs,2.5V参考,内部参考电压开,选AVCC AVSS为参考电压,启动AD模块,AD中断使能
ADC10CTL0|=ENC; //AD转换使能
}
#pragma vector = ADC10_VECTOR //ADC10中断服务
__interrupt void adc_isr(void)
{adc_num=ADC10MEM;} //保存AD结果
/********DS18B20复位********/
unsigned char ds18b20_ack(void)
{
uchar ack=1;
ds18b20_dir|=ds18b20_port; //控制口为输出状态
ds18b20_out&=(~ds18b20_port); //输出低
delay_us(500); //延时500us
ds18b20_out|=ds18b20_port;
ds18b20_dir&=(~ds18b20_port); //控制口为输入状态
delay_us(80); //延时80us
ack=ds18b20_in&ds18b20_port; //读出DS18B20返回值
delay_us(250); //等待返回脉冲结束
return(ack);
}
/*******DS18B20读1字节******/
unsigned char ds18b20_read(void)
{
uchar i=0,byte=0;
for (i=0;i<8;i++)
{
ds18b20_dir|=ds18b20_port; //控制口为输出状态
ds18b20_out&=(~ds18b20_port); //输出低
delay_us(2); //至少保持1uS才能释放
ds18b20_out|=ds18b20_port;
ds18b20_dir&=(~ds18b20_port); //控制口为输入状态
delay_us(10); //输出低出现后15uS内数据有效
if((ds18b20_in&ds18b20_port)!=0) //读出值为1
{byte|=0X80;}
else
{byte&=0X7f;}
if(i<7)
{byte>>=1;} //读完1个BYTE
delay_us(50);
}
return(byte);
}
/*******DS18B20写1字节******/
void ds18b20_write(unsigned char cmd)
{
uchar i,j;
ds18b20_dir|=ds18b20_port; //控制口为输出状态
for(j=0;j<=7;j++)
{
i=cmd&0x01;
if(i==0x01) //写BIT"1"
{
ds18b20_out&=(~ds18b20_port);
delay_us(15);
ds18b20_out|=ds18b20_port;
delay_us(85);
}
else //写BIT"0"
{
ds18b20_out&=(~ds18b20_port);
delay_us(85);
ds18b20_out|=ds18b20_port;
delay_us(15);
}
cmd>>=1;
}
}
/*******单个DS18B20温度测量函数******/
float ds18b20_single_data(void)
{
uchar read_bytel=0,read_byteh=0;
int read_byte=0;
float buff;
ds18b20_ack();
if(ds18b20_ack()==0)
{
ds18b20_write(0xcc); //跳过ROM匹配
ds18b20_write(0x44); //开始转换命令
delay_us(1000);
ds18b20_ack(); //读温度前复位
ds18b20_write(0xcc); //跳过ROM匹配
ds18b20_write(0xbe); //开始读取命令
read_bytel=ds18b20_read(); //读出低BYTE
read_byteh=ds18b20_read(); //读出高BYTE
read_byte=(read_byteh<<8)|read_bytel; //数据组合
if(read_byte<0) //如果温度为负
{
read_byte=~read_byte+1;
buff=read_byte*-0.0625; //16进制转换为正确的十进制数据
}
else buff=read_byte*0.0625; //16进制转换为正确的十进制数据
}
else
{ds18b20_ack();}
return (buff);
}
/*******单个DS18B20 ROM读取函数******/
void ds18b20_single_rom(void)
{
uchar x=0;
ds18b20_ack();
if(ds18b20_ack()==0)
{
ds18b20_write(0x33); //ROM读取命令
for(x=0;x<8;x++)
{ds18b20_rom[x]=ds18b20_read();} //将读到的ROM值存入数组(低位器件代码40最先被读)
}
else
{ds18b20_ack();}
}
/*******多个DS18B20温度测量函数******/
void ds18b20_many_data(void)
{
uchar read_bytel=0,read_byteh=0,x=0;
int read_byte=0;
float buff;
ds18b20_ack();
if(ds18b20_ack()==0)
{
ds18b20_write(0xcc); //跳过ROM匹配
ds18b20_write(0x44); //开始转换命令
delay_us(1000);
ds18b20_ack(); //读温度前复位
ds18b20_write(0x55); //ROM匹配
for(x=0;x<8;x++)
{ds18b20_write(ds18b20_rom_store[0][x]);}//先传低位器件代码40
ds18b20_write(0xbe); //开始读取命令
read_bytel=ds18b20_read(); //读出低BYTE
read_byteh=ds18b20_read(); //读出高BYTE
read_byte=(read_byteh<<8)|read_bytel; //数据组合
if(read_byte<0) //如果温度为负
{
read_byte=~read_byte+1;
buff=read_byte*-0.0625; //16进制转换为正确的十进制数据
}
else buff=read_byte*0.0625; //16进制转换为正确的十进制数据
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x30);
lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
lcd_text_display("一号测量温度:");
lcd_float_display(buff);
lcd_text_display("℃");
ds18b20_ack(); //读温度前复位
ds18b20_write(0x55); //ROM匹配
for(x=0;x<8;x++)
{ds18b20_write(ds18b20_rom_store[1][x]);}//先传低位器件代码40
ds18b20_write(0xbe); //开始读取命令
read_bytel=ds18b20_read(); //读出低BYTE
read_byteh=ds18b20_read(); //读出高BYTE
read_byte=(read_byteh<<8)|read_bytel; //数据组合
if(read_byte<0) //如果温度为负
{
read_byte=~read_byte+1;
buff=read_byte*-0.0625; //16进制转换为正确的十进制数据
}
else buff=read_byte*0.0625; //16进制转换为正确的十进制数据
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x47);
lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
lcd_text_display("二号测量温度:");
lcd_float_display(buff);
lcd_text_display("℃");
}
else
{ds18b20_ack();}
}
/*******数码管显示函数******/
void led_display(void)
{
if(led_xs!=timea1)
{led_xs=timea1;led_a++;}
if(led_a>=10)
{led_b++;led_a=0;}
if(led_b>=6)
{led_c++;led_b=0;}
if(led_c>=10)
{led_d++;led_c=0;}
if(led_d>=6)
{led_d=0;}
lcd_data=led_code[led_d];
P3OUT&=0xf8;
P3OUT|=0x01;
delay_ms(1);
lcd_data=led_code[led_c];
P3OUT&=0xf8;
P3OUT|=0x02;
delay_ms(1);
lcd_data=led_code[10];
P3OUT&=0xf8;
P3OUT|=0x02;
delay_ms(1);
lcd_data=led_code[led_b];
P3OUT&=0xf8;
P3OUT|=0x03;
delay_ms(1);
lcd_data=led_code[led_a];
P3OUT&=0xf8;
P3OUT|=0x04;
delay_ms(1);
}
/*******按键扫描函数******/
void key_scan(void)
{
ADC10CTL0&=~ENC; //AD禁止
ADC10CTL1=INCH_2+SHS_0+ADC10DIV_0+ADC10SSEL_0+CONSEQ_0;//通道2
ADC10CTL0|=ENC; //AD使能
ADC10CTL0|=ADC10SC; //开始转换
delay_us(10);
if(adc_num<869) //有按键按下
{
delay_ms(1); //去抖动
ADC10CTL0|=ADC10SC; //再次转换
delay_us(10);
if(adc_num>807&&adc_num<869) //2.6v--2.8v
key_num=9;
else if(adc_num>714&&adc_num<776)//2.3v--2.5v
key_num=8;
else if(adc_num>621&&adc_num<683)//2.0v--2.2v
key_num=7;
else if(adc_num>528&&adc_num<590)//1.7v--1.9v
key_num=6;
else if(adc_num>434&&adc_num<496)//1.4v--1.6v
key_num=5;
else if(adc_num>341&&adc_num<403)//1.1v--1.3v
key_num=4;
else if(adc_num>248&&adc_num<310)//0.8v--1.0v
key_num=3;
else if(adc_num>155&&adc_num<217)//0.5v--0.7v
key_num=2;
else if(adc_num>62&&adc_num<124) //0.2v--0.4v
key_num=1;
else key_num=0;
while(adc_num<931) //3V
{
ADC10CTL0|=ADC10SC; //再次转换
delay_us(10);
}
}
//else key_num=0;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL1 =CALBC1_12MHZ; //设定DCO为12MHZ
DCOCTL =CALBC1_12MHZ;
port_init();
timea_init();
adc_init();
lcd_init();
lcd_clean();
delay_ms(1000);
lcd_clean();
_EINT();
while(key_num!=5)
{menu();delay_ms(100);}
lcd_clean();
while(1)
{
adc_num=0;adc_numx=0;
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x00);
lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
ADC10CTL0&=~ENC; //AD禁止
ADC10CTL1=INCH_0+SHS_0+ADC10DIV_0+ADC10SSEL_0+CONSEQ_0;//通道0
ADC10CTL0|=ENC; //AD使能
for(ytime=0;ytime<256;ytime++)
{
ADC10CTL0|=ADC10SC; //开始转换
delay_us(10);
adc_num=3.3*adc_num/1024;
adc_numx+=adc_num;
}
adc_num=adc_numx/256;
lcd_text_display("一号测量电压:");
lcd_float_display(adc_num);
lcd_text_display("v");
adc_num=0;adc_numx=0;
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x17);
lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
ADC10CTL0&=~ENC; //AD禁止
ADC10CTL1=INCH_1+SHS_0+ADC10DIV_0+ADC10SSEL_0+CONSEQ_0;//通道1
ADC10CTL0|=ENC; //AD使能
for(ytime=0;ytime<256;ytime++)
{
ADC10CTL0|=ADC10SC; //开始转换
delay_us(10);
adc_num=3.3*adc_num/1024;
adc_numx+=adc_num;
}
adc_num=adc_numx/256;
lcd_text_display("二号测量电压:");
lcd_float_display(adc_num);
lcd_text_display("v");
ds18b20_many_data();//2个ds18b20读取温度数据
/*
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x20);
lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
ds18b20_single_rom(); //采集单个DS18B20的ROM值
for(xtime=0;xtime<8;xtime++)
{
lcd_num_display(ds18b20_rom[7-xtime]);//显示单个DS18B20的ROM值
lcd_text_display(",");
}
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x60);
lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
lcd_float_display(ds18b20_single_data());//显示单个DS18B20的采集温度值
lcd_text_display("℃"); */
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x60);
lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
lcd_text_display("测试时间:");
lcd_num_display(timea1);
lcd_text_display("s");
for(xtime=0;xtime<100;xtime++) //LED显示函数
{led_display();}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -