|
原來是<STC12C5A60S2.H>,想修改為STC H8 單片機。
編譯一直通不過,不知道怎么修改!
請幫忙看看!!
#include <STC12C5A60S2.H>
#include <intrins.h>
#include "TM1650.h"
#include "DS18B20.h"
#include "Key.h"
sbit LED2 = P2 ^ 3;
sbit LED3 = P2 ^ 4;
sbit LED4 = P2 ^ 5;
sbit FAN = P4 ^ 2;
// 定義TM1650的顯示數組
unsigned char code dig1[11] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40}; // 0、1、2、3、4、5、6、7、8、9、-//不帶小數點
unsigned char code dig2[11] = {0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef, 0x40}; // 0、1、2、3、4、5、6、7、8、9、-//帶小數點
unsigned char code dig3[3] = {0x76, 0x38, 0x40}; // H、L、-
// 定義計數變量
unsigned int count = 0, count1 = 0; // 計數值
// 溫度上下限值
uint8_t H_Set = 50;
uint8_t L_Set = 25;
// 定義顯示模式的枚舉變量類型
typedef enum
{
H_mode = 0, // 上限溫度設置
L_mode, // 下限溫度設置
T_mode, // 溫度顯示
} Display_MODE;
Display_MODE Display_mode = T_mode;
uint16_t temp;
// 定時器/計數器初始化
void Timer_Init()
{
EA = 1; // 使能總中斷
AUXR |= 0x80; // 定時器0時鐘1T模式
TMOD &= 0xF0; // 清零低四位,設置為16位計數器模式
TMOD |= 0x01; // 設置高四位為定時器模式0
TL0 = 0xCD; // 設置定時初始值
TH0 = 0xD4; // 設置定時初始值
TF0 = 0; // 清除TF0標志
TR0 = 1; // 定時器0開始計時
ET0 = 1; // 使能定時器0中斷
AUXR &= 0xBF; // 定時器1時鐘12T模式
TMOD &= 0x0F; // 設置定時器模式
TMOD |= 0x10; // 設置定時器模式
TL1 = 0x00; // 設置定時初始值
TH1 = 0xB8; // 設置定時初始值
TF1 = 0; // 清除TF1標志
TR1 = 1; // 定時器1開始計時
ET1 = 1; // 使能定時器1中斷
}
// 定時器/計數器0中斷服務函數
void Timer0_Isr(void) interrupt 1
{
TL0 = 0xCD; // 設置定時初始值
TH0 = 0xD4; // 設置定時初始值
count++; // 每隔1毫秒,計數值加1
count1++;
}
void Timer1_Isr(void) interrupt 3
{
TL1 = 0x00; // 設置定時初始值
TH1 = 0xB8; // 設置定時初始值
key_status_check(0, KEY1);
key_status_check(1, KEY2);
key_status_check(2, KEY3);
key_status_check(3, KEY4);
}
void PWMInit()
{
// 配置PWM
CCON = 0; // Initial PCA control register
// PCA timer stop running
// Clear CF flag
// Clear all module interrupt flag
CL = 0; // Reset PCA base timer
CH = 0;
CMOD = 0x00; // 設置PCA定時器時鐘為晶振頻率/12,禁用PCA計數器溢出中斷
CCAP0H = CCAP0L = 0x80; // PWM0 port output 50% duty cycle square wave
CCAPM0 = 0x42; // 開啟比較器功能,開啟PWM0
AUXR1 |= 0x40; // 切換PWM輸出IO到P4
CR = 1; // PCA timer start run
}
void SetPwmDutyCycle(unsigned char dutyCycle)
{
// dutyCycle的范圍可以是0到100,表示0%至100%的占空比。
unsigned char newValue = ((100 - dutyCycle) * 255) / 100;
CCAP0H = CCAP0L = newValue; // 更新CCAP0L,從而改變PWM信號占空比
}
// 主函數
void main()
{
TM_WrCmd(0x21); // 設置TM1650為8段×4位模式,并打開顯示,亮度為2級
Timer_Init(); // 初始化定時器
Key_Init(); // 初始化按鍵狀態機
P4M0 = 0x04; // 設置P4.2為推挽輸出
P4M1 = 0x00;
PWMInit(); // 初始化PWM
SetPwmDutyCycle(0); // 設置PWM占空比為0
temp = GetTemp();
while (1) // 死循環,反復執行以下操作
{
if (count >= 100) // 每隔100毫秒執行一次
{
count = 0;
temp = GetTemp(); // 讀取溫度
if (Display_mode == T_mode) // 溫度顯示模式
{
TM_WrDat(0x68, dig1[temp / 1000]); // 寫入第1位的顯示數據
TM_WrDat(0x6a, dig2[temp / 100 % 10]); // 寫入第2位的顯示數據
TM_WrDat(0x6c, dig1[temp / 10 % 10]); // 寫入第3位的顯示數據
TM_WrDat(0x6e, dig1[temp % 10]); // 寫入第4位的顯示數據
}
if (Display_mode == H_mode) // 上限溫度設置
{
TM_WrDat(0x68, dig3[0]); // 數碼管第1位顯示 H
TM_WrDat(0x6a, dig3[2]); // 數碼管第2位顯示 -
TM_WrDat(0x6c, dig1[H_Set / 10]); // 寫入第3位的顯示數據
TM_WrDat(0x6e, dig1[H_Set % 10]); // 寫入第4位的顯示數據
}
else if (Display_mode == L_mode) // 下限溫度設置
{
TM_WrDat(0x68, dig3[1]); // 數碼管第1位顯示 L
TM_WrDat(0x6a, dig3[2]); // 數碼管第2位顯示 -
TM_WrDat(0x6c, dig1[L_Set / 10]); // 寫入第3位的顯示數據
TM_WrDat(0x6e, dig1[L_Set % 10]); // 寫入第4位的顯示數據
}
if (temp / 100 >= L_Set && temp / 100 < H_Set) // 當溫度在下限和上限之間,根據溫度設置風扇PWM占空比
{
uint8_t pwm_set = (uint8_t)((temp / 100.0 - (float)L_Set) / ((H_Set - L_Set) / 55.0) + 45.0 + 0.5);
SetPwmDutyCycle(pwm_set);
}
else if (temp / 100 >= H_Set) // 當溫度大于上限時風扇全速
{
SetPwmDutyCycle(100); // 設置占空比100%
}
else if (temp / 100 < L_Set) // 當溫度小于下限時風扇關閉
{
SetPwmDutyCycle(0);
}
LED2 = ~LED2;
}
if (count1 >= 500) // 每隔500毫秒執行一次
{
count1 = 0;
LED3 = ~LED3;
}
if (key[0] == 1) // SW3模式切換
{
if (Display_mode != 2)
{
Display_mode++;
}
else
{
Display_mode = 0;
}
key[0] = 0;
}
if (key[1] == 1) // SW4上鍵
{
if (Display_mode == H_mode)
{
if (H_Set < 99)
{
H_Set++;
}
}
else if (Display_mode == L_mode)
{
if (L_Set < 99)
{
L_Set++;
}
}
key[1] = 0;
}
if (key[2] == 1) // SW5下鍵
{
if (Display_mode == H_mode)
{
if (H_Set > 0)
{
H_Set--;
}
}
else if (Display_mode == L_mode)
{
if (L_Set > 0)
{
L_Set--;
}
}
key[2] = 0;
}
LED4 = ~LED4;
}
}
|
|