21ic问答首页 - 使用的stc8g的单片机,做温控,没反应,不知道啥原因
使用的stc8g的单片机,做温控,没反应,不知道啥原因
刷个怪2024-08-28
#include <STC8G.H>#include <intrins.h>
#include "math.h"
///**********************************************************************************************/
///**********************************************************************************************/
//“程序开发调试设置项”
#define DY_DELAY 10 // 设置每一个点显示的时间长度(1~20)
float VCC = 3.3; // 设置基准电压
float Rp = 100000.0; // 设置上拉电阻
float Bx = 3950.0; // 设置热敏电阻B值
float Rt; // 热敏电阻的实际阻值
float Tk2 = 273.15 + 25.0;
float Ka = 273.15;
float vol; // 设置测量电压
data unsigned char temp; // 实际温度
data unsigned char temp_set = 0; // 设置温度
data unsigned char temp_set1 = 150; // 设置温度2
data unsigned char temp_set2 = 0; // 设置温度2
float DTADC;
/**********************************************************************************************/
/**********************************************************************************************/
sbit DIG1 = P5 ^ 5;
sbit DIG2 = P1 ^ 2;
sbit SEG_A = P3 ^ 7;
sbit SEG_B = P3 ^ 2;
sbit SEG_C = P3 ^ 3;
sbit SEG_D = P3 ^ 5;
sbit SEG_E = P3 ^ 4;
sbit SEG_F = P3 ^ 6;
sbit SEG_G = P1 ^ 1;
sbit BUTTON1 = P1 ^ 6;
sbit BUTTON2 = P1 ^ 5;
sbit BUTTON3 = P1 ^ 4;
sbit RESET = P5 ^ 4;
sbit RELAY = P1 ^ 3;
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x20 //ADC完成标志位
#define ADC_START 0x40 //ADC启动控制位
#define ADC_SPEEDLL 0x00 //ADC速度选择
bit flag = 0;
typedef unsigned char BYTE;
data unsigned char DY_PWM; // 显示亮度
unsigned char code disdata[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 // 数码管段码表(0~9)
};
/*********************************************************************************************/
void delay(unsigned int a) { // 用于点扫描的延时
unsigned int i;
while (--a != 0) {
for (i = 0; i < DY_DELAY; i++);
}
}
/*********************************************************************************************/
void delay1ms(unsigned int a) { // 1ms延时程序
unsigned int i;
while (--a != 0) {
for (i = 0; i < 24000; i++);
}
}
/*********************************************************************************************/
void dis_off(void) {
DIG1 = 1; // 关闭所有数码管
DIG2 = 1;
SEG_A = 0;
SEG_B = 0;
SEG_C = 0;
SEG_D = 0;
SEG_E = 0;
SEG_F = 0;
SEG_G = 0;
delay(10 - DY_PWM);
}
/*********************************************************************************************/
void diplay_data (unsigned char digit, unsigned char value) {
DIG1 = 0;
DIG2 = 0;
// 设置段码(共阳极数码管,段码为高电平点亮)
SEG_A = (value & 0x01) ? 0 : 1;
SEG_B = (value & 0x02) ? 0 : 1;
SEG_C = (value & 0x04) ? 0 : 1;
SEG_D = (value & 0x08) ? 0 : 1;
SEG_E = (value & 0x10) ? 0 : 1;
SEG_F = (value & 0x20) ? 0 : 1;
SEG_G = (value & 0x40) ? 0 : 1;
// 选通对应的数码管
if (digit == 1) {
DIG1 = 0;
} else if (digit == 2) {
DIG2 = 0;
}
delay(DY_DELAY); // 保持显示时间
dis_off(); // 关闭显示,避免重影
}
/*********************************************************************************************/
//void GetADCResult(BYTE ch) {
// ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
// _nop_(); // 必须等待才能查询
// _nop_();
// _nop_();
// _nop_();
// while (!(ADC_CONTR & ADC_FLAG)); // 等待完成标志
// ADC_CONTR &= ~ADC_FLAG; // 关闭ADC
//}
void GetADCResult(BYTE ch)
// uint GetADCResult(uchar CH)
{
ADC_CONTR=ADC_POWER|ADC_START|CH;//启动转换1100 1000
_nop_();_nop_(); //小延时
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成标志置位 1010 0000
ADC_CONTR &=~ADC_FLAG; //清完成标志
//返回十位ADC结果
}
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x20 //ADC完成标志位
#define ADC_START 0x40 //ADC启动控制位
#define ADC_SPEEDLL 0x00 //ADC速度选择
/*********************************************************************************************/
void InitADC() {
P1M1 |= 0x80; // 开P1.7的ADC功能
P1M0 &= ~0x80;
ADC_RES = 0;
ADC_CONTR = ADC_POWER; // 开P1.7的ADC功能
}
/*********************************************************************************************/
void init(void) { // 上电初始化
// 设置I/O口工作方式
P1M0 = 0x1F; // P1.0, P1.1, P1.2, P1.3为推挽输出,P1.4-P1.6按键输入,P1.7为ADC输入
P1M1 = 0x80; // P1.7配置为ADC输入,其余引脚为推挽输出或准双向口
P3M0 = 0xFC; // P3.2-P3.7为推挽输出,P3.0和P3.1为准双向口(用于TX/RX)
P3M1 = 0x00; // 设置为准双向口
P5M0 = 0x20; // P5.4为复位引脚,P5.5为数码管位控制(推挽输出)
P5M1 = 0x00; // 设置为准双向口
DY_PWM = 9;
dis_off();
}
/*********************************************************************************************/
void process_buttons(void) {
if (BUTTON1 == 0) {
delay1ms(10); // 简单的防抖
if (BUTTON1 == 0) {
// 处理按键1被按下的事件
}
}
if (BUTTON2 == 0) {
delay1ms(10);
if (BUTTON2 == 0) {
// 处理按键2被按下的事件
}
}
if (BUTTON3 == 0) {
delay1ms(10);
if (BUTTON3 == 0) {
// 处理按键3被按下的事件
}
}
if (RESET == 0) {
// 复位系统或执行相应的操作
}
}
/*********************************************************************************************/
void main (void){ //主程序
init();
InitADC(); //Init ADC sfr
DTADC=0;
temp_set=0;
delay1ms(100);
while (1){
unsigned int i;
unsigned int a;
i=i+1;
GetADCResult(6);
temp_set=ADC_RES;
GetADCResult(7);
DTADC=ADC_RES+DTADC;
DTADC=(ADC_RES<<2)+ADC_RESL +DTADC;
if(i==10)
{
i=0;
if(a>0) a--;
else flag=0;
DTADC=DTADC/10;
temp_set1=temp_set;
if((temp_set1>(temp_set2+2)) ||(temp_set1<(temp_set2-2))){ flag=1; a=200; }
temp_set2=temp_set1;
vol=DTADC*VCC/256;
DTADC=0;
temp_set=0;
Rt=(vol * Rp ) / (VCC-vol);
temp=1/(1/Tk2+ log(Rt/Rp)/Bx)-Ka+0.5;
}
if (flag == 0) { // 显示当前温度
diplay_data (1, disdata[temp / 10]); // 显示十位
diplay_data (2, disdata[temp % 10]); // 显示个位
} else { // 显示设置温度
diplay_data (1, disdata[temp_set1 / 10]);
diplay_data (2, disdata[temp_set1 % 10]);
}
}
}
#include "math.h"
///**********************************************************************************************/
///**********************************************************************************************/
//“程序开发调试设置项”
#define DY_DELAY 10 // 设置每一个点显示的时间长度(1~20)
float VCC = 3.3; // 设置基准电压
float Rp = 100000.0; // 设置上拉电阻
float Bx = 3950.0; // 设置热敏电阻B值
float Rt; // 热敏电阻的实际阻值
float Tk2 = 273.15 + 25.0;
float Ka = 273.15;
float vol; // 设置测量电压
data unsigned char temp; // 实际温度
data unsigned char temp_set = 0; // 设置温度
data unsigned char temp_set1 = 150; // 设置温度2
data unsigned char temp_set2 = 0; // 设置温度2
float DTADC;
/**********************************************************************************************/
/**********************************************************************************************/
sbit DIG1 = P5 ^ 5;
sbit DIG2 = P1 ^ 2;
sbit SEG_A = P3 ^ 7;
sbit SEG_B = P3 ^ 2;
sbit SEG_C = P3 ^ 3;
sbit SEG_D = P3 ^ 5;
sbit SEG_E = P3 ^ 4;
sbit SEG_F = P3 ^ 6;
sbit SEG_G = P1 ^ 1;
sbit BUTTON1 = P1 ^ 6;
sbit BUTTON2 = P1 ^ 5;
sbit BUTTON3 = P1 ^ 4;
sbit RESET = P5 ^ 4;
sbit RELAY = P1 ^ 3;
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x20 //ADC完成标志位
#define ADC_START 0x40 //ADC启动控制位
#define ADC_SPEEDLL 0x00 //ADC速度选择
bit flag = 0;
typedef unsigned char BYTE;
data unsigned char DY_PWM; // 显示亮度
unsigned char code disdata[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 // 数码管段码表(0~9)
};
/*********************************************************************************************/
void delay(unsigned int a) { // 用于点扫描的延时
unsigned int i;
while (--a != 0) {
for (i = 0; i < DY_DELAY; i++);
}
}
/*********************************************************************************************/
void delay1ms(unsigned int a) { // 1ms延时程序
unsigned int i;
while (--a != 0) {
for (i = 0; i < 24000; i++);
}
}
/*********************************************************************************************/
void dis_off(void) {
DIG1 = 1; // 关闭所有数码管
DIG2 = 1;
SEG_A = 0;
SEG_B = 0;
SEG_C = 0;
SEG_D = 0;
SEG_E = 0;
SEG_F = 0;
SEG_G = 0;
delay(10 - DY_PWM);
}
/*********************************************************************************************/
void diplay_data (unsigned char digit, unsigned char value) {
DIG1 = 0;
DIG2 = 0;
// 设置段码(共阳极数码管,段码为高电平点亮)
SEG_A = (value & 0x01) ? 0 : 1;
SEG_B = (value & 0x02) ? 0 : 1;
SEG_C = (value & 0x04) ? 0 : 1;
SEG_D = (value & 0x08) ? 0 : 1;
SEG_E = (value & 0x10) ? 0 : 1;
SEG_F = (value & 0x20) ? 0 : 1;
SEG_G = (value & 0x40) ? 0 : 1;
// 选通对应的数码管
if (digit == 1) {
DIG1 = 0;
} else if (digit == 2) {
DIG2 = 0;
}
delay(DY_DELAY); // 保持显示时间
dis_off(); // 关闭显示,避免重影
}
/*********************************************************************************************/
//void GetADCResult(BYTE ch) {
// ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
// _nop_(); // 必须等待才能查询
// _nop_();
// _nop_();
// _nop_();
// while (!(ADC_CONTR & ADC_FLAG)); // 等待完成标志
// ADC_CONTR &= ~ADC_FLAG; // 关闭ADC
//}
void GetADCResult(BYTE ch)
// uint GetADCResult(uchar CH)
{
ADC_CONTR=ADC_POWER|ADC_START|CH;//启动转换1100 1000
_nop_();_nop_(); //小延时
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成标志置位 1010 0000
ADC_CONTR &=~ADC_FLAG; //清完成标志
//返回十位ADC结果
}
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x20 //ADC完成标志位
#define ADC_START 0x40 //ADC启动控制位
#define ADC_SPEEDLL 0x00 //ADC速度选择
/*********************************************************************************************/
void InitADC() {
P1M1 |= 0x80; // 开P1.7的ADC功能
P1M0 &= ~0x80;
ADC_RES = 0;
ADC_CONTR = ADC_POWER; // 开P1.7的ADC功能
}
/*********************************************************************************************/
void init(void) { // 上电初始化
// 设置I/O口工作方式
P1M0 = 0x1F; // P1.0, P1.1, P1.2, P1.3为推挽输出,P1.4-P1.6按键输入,P1.7为ADC输入
P1M1 = 0x80; // P1.7配置为ADC输入,其余引脚为推挽输出或准双向口
P3M0 = 0xFC; // P3.2-P3.7为推挽输出,P3.0和P3.1为准双向口(用于TX/RX)
P3M1 = 0x00; // 设置为准双向口
P5M0 = 0x20; // P5.4为复位引脚,P5.5为数码管位控制(推挽输出)
P5M1 = 0x00; // 设置为准双向口
DY_PWM = 9;
dis_off();
}
/*********************************************************************************************/
void process_buttons(void) {
if (BUTTON1 == 0) {
delay1ms(10); // 简单的防抖
if (BUTTON1 == 0) {
// 处理按键1被按下的事件
}
}
if (BUTTON2 == 0) {
delay1ms(10);
if (BUTTON2 == 0) {
// 处理按键2被按下的事件
}
}
if (BUTTON3 == 0) {
delay1ms(10);
if (BUTTON3 == 0) {
// 处理按键3被按下的事件
}
}
if (RESET == 0) {
// 复位系统或执行相应的操作
}
}
/*********************************************************************************************/
void main (void){ //主程序
init();
InitADC(); //Init ADC sfr
DTADC=0;
temp_set=0;
delay1ms(100);
while (1){
unsigned int i;
unsigned int a;
i=i+1;
GetADCResult(6);
temp_set=ADC_RES;
GetADCResult(7);
DTADC=ADC_RES+DTADC;
DTADC=(ADC_RES<<2)+ADC_RESL +DTADC;
if(i==10)
{
i=0;
if(a>0) a--;
else flag=0;
DTADC=DTADC/10;
temp_set1=temp_set;
if((temp_set1>(temp_set2+2)) ||(temp_set1<(temp_set2-2))){ flag=1; a=200; }
temp_set2=temp_set1;
vol=DTADC*VCC/256;
DTADC=0;
temp_set=0;
Rt=(vol * Rp ) / (VCC-vol);
temp=1/(1/Tk2+ log(Rt/Rp)/Bx)-Ka+0.5;
}
if (flag == 0) { // 显示当前温度
diplay_data (1, disdata[temp / 10]); // 显示十位
diplay_data (2, disdata[temp % 10]); // 显示个位
} else { // 显示设置温度
diplay_data (1, disdata[temp_set1 / 10]);
diplay_data (2, disdata[temp_set1 % 10]);
}
}
}
赞0
评论
2024-08-29
赞0
204
评论
2024-08-29
赞0
评论
2024-08-29
赞0
评论
2024-08-28
赞0
评论
2024-08-28
您需要登录后才可以回复 登录 | 注册