找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 803|回复: 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 单片机教程网

快速回复 返回顶部 返回列表