久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1615|回復: 4
打印 上一主題 下一主題
收起左側

這個單片機程序編譯通不過,原來是<STC12C5A60S2.H>,想修改為STC H8

[復制鏈接]
跳轉到指定樓層
樓主
ID:97678 發表于 2023-8-13 15:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
原來是<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;
    }
}

溫度顯示和溫度控制.zip

9.06 KB, 下載次數: 4

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:584814 發表于 2023-8-14 08:30 | 只看該作者
由于文件不全,完全看不出啥問題
回復

使用道具 舉報

板凳
ID:123289 發表于 2023-8-14 09:13 | 只看該作者
依據錯誤提示修改。再對照兩芯片的手冊,重點看看特殊寄存器有何差異。
回復

使用道具 舉報

地板
ID:143767 發表于 2023-8-14 10:40 | 只看該作者
錯誤提示信息是什么,你不寫出來別人怎么給你解決?
回復

使用道具 舉報

5#
ID:883242 發表于 2023-8-14 12:16 | 只看該作者
文件不全就算了,連錯誤是什么,錯在哪一行都不肯告訴大家嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜成人免费视频 | 亚洲国产精品人人爽夜夜爽 | 午夜爽爽爽男女免费观看影院 | 中文字幕精品一区久久久久 | 天天想天天干 | 男女激情网站免费 | 免费在线日韩 | 综合色婷婷 | 又黑又粗又长的欧美一区 | 免费av电影网站 | 精品一区二区不卡 | 一区二区三区四区不卡 | av黄色在线观看 | 精品国产一区二区三区日日嗨 | 国产亚洲成av人片在线观看桃 | 91青青草视频 | 国产激情精品 | 亚洲 欧美 另类 综合 偷拍 | av毛片| 精品一区二区三区日本 | 欧美不卡一区二区三区 | 爱爱视频在线观看 | 欧美日韩一二区 | 亚洲欧美国产精品久久 | 日本欧美黄色片 | 中文字幕成人 | 成人在线免费网站 | 国产精品久久久久久久久久免费看 | 久久久日韩精品一区二区三区 | 免费一区二区三区 | 久久久久久一区 | 日韩精品极品视频在线观看免费 | 香蕉视频一区二区 | 香蕉一区二区 | 99re6在线视频精品免费 | 91久久久久久 | 日韩一区二区免费视频 | 久久久免费精品 | 国产午夜在线观看 | 91视频麻豆 | jizjizjiz中国护士18 |