#include <REG51.H>
#define TXD_Pin P3_1 //定義TXD引腳為P3.1
#define BAUDRATE 9600 //定義波特率
#define FREQ_OSC 11059200 //定義外部晶振頻率
#define TH 40 //定義溫度閾值
void send_data(unsigned char dat);
void send_string(unsigned char *s);
void init_uart();
void init_adc();
int get_adc_value();
void delay(int time);
void display_temp(int temp);
void main()
{
unsigned int adc_val = 0;
int temp = 0;
init_uart(); //初始化串口
init_adc(); //初始化ADC
while(1)
{
adc_val = get_adc_value(); //讀取ADC值
temp = (int)(adc_val / 2); //將ADC值轉換為溫度(假設為50mV/℃)
if(temp >= TH) //如果溫度超過閾值,則LED閃爍
{
display_temp(temp);
delay(500);
}
else //否則,LED顯示當前溫度
{
display_temp(temp);
}
}
}
void init_uart()
{
//計算波特率預分頻器的值
unsigned char SCON_value = 0x50; //定義串口控制寄存器的初始值
unsigned int Baud_value = 0x10000 - (FREQ_OSC / (16 * BAUDRATE));
//配置串口
SCON = SCON_value;
TMOD &= 0x0F;
TMOD |= 0x20; //使用timer1作為波特率發生器,允許8位自動重載
TH1 = (unsigned char)(Baud_value / 256); //設置波特率預分頻器的高8位
TL1 = (unsigned char)Baud_value; //設置波特率預分頻器的低8位
TR1 = 1; //啟動timer1
}
void send_data(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void send_string(unsigned char *s)
{
while(*s)
{
send_data(*s++);
}
}
void init_adc()
{
EA = 1; //使能全局中斷
ADC_CONTR = 0x80; //設置ADC時鐘源為系統時鐘、ADC啟動、ADC自動重載模式
}
int get_adc_value()
{
ADC_CONTR |= 0x08; //啟動ADC轉換
while(!(ADC_CONTR & 0x10)); //等待ADC轉換完成
return ADC_RES * 256 + ADC_RESL; //返回ADC轉換結果
}
void delay(int time)
{
int i, j;
for (i = time; i > 0; i--)
{
for (j = 10; j > 0; j--);
}
}
void display_temp(int temp)
{
static unsigned char code digit_table[] = { //數碼管顯示表(0~9,A~F)
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
int i;
unsigned char dat[4] = {0, 0, 0, 0}; //定義一個數組,用于存放各個位的顯示值
dat[0] = digit_table[temp % 10]; //個位
dat[1] = digit_table[(temp / 10) % 10];//十位
dat[2] = digit_table[(temp / 100) % 10];//百位
dat[3] = digit_table[temp / 1000]; //千位
//依次點亮每個數碼管,顯示溫度數值
for(i = 0; i < 4; i++)
{
P2 = 1 << i;
P0 = dat;
delay(1);
}
}
|