任务:简易温度计的设计与制作
简易温度计的设计与制作
任务要求:1602显示温度
1. 仿真图
proteus
2. 程序原代码
#include "iom16v.h" //ICC AVR环境下的ATmega16库函数 定义了所有的寄存器及其位的标号 #include "macros.h"
#define ATmega16_AD_Enable ADCSRA|=(1
#define ATmega16_AD_Disable ADCSRA&=(~(1
#define ATmega16_AD_Start ADCSRA|=(1
#define ATmega16_AD_Stop ADCSRA&=(~(1
#define ATmega16_AD_Auto ADCSRA|=(1
#define ATmega16_AD_Single ADCSRA&=(~(1
#define ATmega16_ADIE_Enable ADCSRA|=(1
#define ATmega16_ADIE_Disable ADCSRA&=(~(1
#define LCM_RS_1 PORTB|=(1
#define LCM_RS_0 PORTB&=(~(1
#define LCM_RW_1 PORTB|=(1
#define LCM_RW_0 PORTB&=(~(1
#define LCM_E_1 PORTB|=(1
#define LCM_E_0 PORTB&=(~(1
unsigned char LCM_Num_Table[]={'0','1','2','3','4','5','6','7','8','9'};
/**************************************************************************************
函数功能:延时1us(4M晶振,0.25微秒的指令执行周期)
入口参数:无
函数说明:4*0.25=1(微秒)
***************************************************************************************/
void Delay_1_us(void)
{
NOP();
NOP();
NOP();
NOP();
}
/**************************************************************************************
函数功能:延时若干微秒
入口参数:n_us
***************************************************************************************/
void Delay_n_us(unsigned int n_us)
{
unsigned int cnt_i;
for(cnt_i=0;cnt_i
{
Delay_1_us();
}
}
/**************************************************************************************
函数功能:延时1ms(4M晶振,0.25微秒的指令执行周期)
入口参数:无
函数说明:(3×cnt_j+2)×cnt_i=(3×33+2)×40*0.25=1010(微秒),可以近似认为是1毫秒
***************************************************************************************/
void Delay_1_ms(void)
{
unsigned char cnt_i,cnt_j;
for(cnt_i=0;cnt_i
{
for(cnt_j=0;cnt_j
{
}
}
}
/**************************************************************************************
函数功能:延时若干毫秒
入口参数:n_ms
***************************************************************************************/
void Delay_n_ms(unsigned int n_ms)
{
unsigned int cnt_i;
for(cnt_i=0;cnt_i
{
Delay_1_ms();
}
}
/**************************************************************************************
函数功能:读取忙标志和AC的值
入口参数:无
***************************************************************************************/
unsigned char LCM_Re_BAC()
{
unsigned char status;
//LCM_Dat为输入
DDRD=0x00;
//选择命令通道
LCM_RS_0;
//选择读操作
LCM_RW_1;
//使能线置1
LCM_E_1;
//等待信号线稳定
Delay_n_us(1);
//读入
status=PIND;
//使能线置0
LCM_E_0;
return status;
}
/**************************************************************************************
函数功能:写入命令
入口参数:命令代码
***************************************************************************************/
void LCM_Wr_CMD(unsigned char cmd_dat)
{
//判忙
while(LCM_Re_BAC()>=0x80);
//LCM_Dat为输出
DDRD=0xFF;
//选择命令通道
LCM_RS_0;
//选择写操作
LCM_RW_0;
//使能线置1
LCM_E_1;
//设置命令数据
PORTD=cmd_dat;
//等待信号线稳定
Delay_n_us(1);
//送命令数据
LCM_E_0;
}
/**************************************************************************************
函数功能:写入数据
入口参数:数据代码
***************************************************************************************/
void LCM_Wr_DAT(unsigned char dis_dat)
{
//判忙
while(LCM_Re_BAC()>=0x80);
//LCM_Dat为输出
DDRD=0xFF;
//选择数据通道
LCM_RS_1;
//选择写操作
LCM_RW_0;
//使能线置1
LCM_E_1;
//设置数据数据
PORTD=dis_dat;
//等待信号线稳定
Delay_n_us(1);
//送数据数据
LCM_E_0;
Delay_n_us(40);
}
/**************************************************************************************
函数功能:初始化
入口参数:无
***************************************************************************************/
void LCM_1602_Init(void)
{
LCM_Wr_CMD(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口 Delay_n_ms(5); //延时5ms
LCM_Wr_CMD(0x38);
Delay_n_ms(5);
LCM_Wr_CMD(0x38);
Delay_n_ms(5);
LCM_Wr_CMD(0x0c); //显示模式设置:显示开,无光标,无闪烁
Delay_n_ms(5);
LCM_Wr_CMD(0x06); //显示模式设置:光标右移,字符不移
Delay_n_ms(5);
LCM_Wr_CMD(0x01); //清屏幕指令,将以前的显示内容清除
Delay_n_ms(5);
}
//ADC初始化
void ATmega16_ADC_Init(void)
{
ADCSRA=0x00; //关闭ADC
ADMUX=0x41; //选择参考电压为AVCC、数据右对齐、通道1 ACSR=0x80; //关闭模拟比较器的电源
ADCSRA=0x87; //使能ADC、单次转换、ADC转换中断禁止、128分频 }
//ad转换
//返回转换结果
unsigned int ATmega16_ADC_Convert(void)
{
unsigned int adc_value;
ATmega16_AD_Start; //启动AD转换
while(!(ADCSR&(1
adc_value=(unsigned int)ADCL; //读取低8位
adc_value|=((unsigned int)(ADCH&0x03))
NOP();
return adc_value;
}
void main(void)
{
float temp_float;
unsigned int temp_int;
unsigned char temp_char[4];
DDRB=0xFF;
LCM_1602_Init();
ATmega16_ADC_Init();
while(1)
{
temp_float=ATmega16_ADC_Convert()*0.09765625; temp_int=(unsigned int)(temp_float*100);
if(temp_int>9999) temp_int=9999;
temp_char[0]=temp_int/1000;
temp_char[1]=(temp_int%1000)/100;
temp_char[2]=((temp_int%1000)%100)/10;
temp_char[3]=((temp_int%1000)%100)%10;
LCM_Wr_CMD(0x80);
LCM_Wr_DAT('T');
LCM_Wr_DAT('e');
LCM_Wr_DAT('m');
LCM_Wr_DAT('p');
LCM_Wr_DAT('e');
LCM_Wr_DAT('r');
LCM_Wr_DAT('a');
LCM_Wr_DAT('t');
LCM_Wr_DAT('u');
LCM_Wr_DAT('r');
LCM_Wr_DAT('e');
LCM_Wr_DAT(':');
LCM_Wr_CMD(0xc0);
LCM_Wr_DAT(LCM_Num_Table[temp_char[0]]);
} }
3:Protel图
LCM_Wr_DAT(LCM_Num_Table[temp_char[1]]); LCM_Wr_DAT('.'); LCM_Wr_DAT(LCM_Num_Table[temp_char[2]]); LCM_Wr_DAT(LCM_Num_Table[temp_char[3]]); LCM_Wr_DAT(0xdf); LCM_Wr_DAT('C'); Delay_n_ms(500);