基于 CT107D 单片机达到以下要求

1)初始化: 1.开发板上电后,关闭蜂鸣器,继电器等无关外设; 2.酷炫复杂的开机方式:数码管上居中显示“PoT.”,并保持 1.5 秒。LED 灯 1 2 7 8 按顺序间隔 1s 闪烁,4s 后 3 4 5 6 灯以 1s 间隔闪烁,2 秒后全亮。

接线需要注意一下,代码如下:

#include <reg52.h> // 引入单片机头文件

sbit LED1 = P2^0; // 定义 LED 引脚
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;

sbit BUZZER = P3^7; // 定义蜂鸣器引脚
sbit RELAY = P3^6; // 定义继电器引脚

void delay(unsigned int t) // 延时函数
{
    unsigned int i, j;
    for(i = t; i > 0; i--)
        for(j = 110; j > 0; j--);
}

void init() // 初始化函数
{
    BUZZER = 1; // 关闭蜂鸣器
    RELAY = 0; // 关闭继电器
}

void startup() // 开机函数
{
    unsigned char i;

    for(i = 0; i < 15; i++) // 数码管上显示 "PoT."
    {
        P1 = 0x3F; // P1 对应数码管的引脚,0x3F 对应 "PoT."
        delay(100);
        P1 = 0x00;
        delay(100);
    }

    for(i = 0; i < 4; i++) // LED 灯 1 2 7 8 按顺序间隔 1s 闪烁
    {
        LED1 = 1;
        LED2 = 1;
        LED7 = 1;
        LED8 = 1;
        delay(1000);
        LED1 = 0;
        LED2 = 0;
        LED7 = 0;
        LED8 = 0;
        delay(1000);
    }

    for(i = 0; i < 4; i++) // LED 灯 3 4 5 6 按顺序间隔 1s 闪烁
    {
        LED3 = 1;
        LED4 = 1;
        LED5 = 1;
        LED6 = 1;
        delay(1000);
        LED3 = 0;
        LED4 = 0;
        LED5 = 0;
        LED6 = 0;
        delay(1000);
    }

    LED1 = 1; // 全部 LED 灯亮
    LED2 = 1;
    LED3 = 1;
    LED4 = 1;
    LED5 = 1;
    LED6 = 1;
    LED7 = 1;
    LED8 = 1;
    delay(2000);
}

void main()
{
    init(); // 初始化
    startup(); // 开机
    while(1); // 无限循环
}


#include <reg51.h>

// 定义延时函数
void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 120; j++) {
            // 这里的延时值需要根据实际情况进行调整
        }
    }
}

// 数码管显示函数
void displayDigit(unsigned char digit) {
    // 这里编写数码管显示的代码
    // 根据单片机的引脚连接情况,控制数码管显示特定的数字
}

void main() {
    unsigned int i;
    
    // 关闭蜂鸣器和继电器等外设
    // 这里根据实际的硬件连接情况,使用相应的引脚控制外设的开关状态
    
    // 初始化数码管显示
    displayDigit(0);  // 将数码管显示为0
    
    // 酷炫的开机方式
    for (i = 0; i < 4; i++) {
        P1 = 0x0F;  // 控制LED灯1278亮起
        delay(1000);  // 延时1秒
        P1 = 0xF0;  // 控制LED灯1278熄灭,LED灯3456亮起
        delay(1000);  // 延时1秒
    }
    
    // 数码管显示"PoT."
    displayDigit(1);  // 显示字母P
    delay(500);  // 延时0.5秒
    displayDigit(15);  // 显示字母o
    delay(500);  // 延时0.5秒
    displayDigit(10);  // 显示字母T
    delay(500);  // 延时0.5秒
    displayDigit(11);  // 显示句号
    delay(500);  // 延时0.5// 延时1.5秒
    delay(1500);
    
    // 控制LED灯全部亮起
    P1 = 0xFF;
    
    while (1) {
        // 循环执行其他操作
    }
}

引脚位置
你这是仿真还是实物

基于new bing部分指引作答:
要实现这些功能,你可以使用CT107D单片机的GPIO口来控制LED灯和数码管,并通过编程控制它们的状态和显示。

首先,你需要了解CT107D单片机的引脚分配和功能,以确定要使用的GPIO口。然后,编写适当的代码来初始化单片机和外设。

以下是一个示例代码,实现了你提到的要求:

#include <reg52.h> // 引入CT107D单片机的寄存器定义

// 定义LED灯和数码管的引脚连接
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;
sbit DIG1 = P1^0;
sbit DIG2 = P1^1;
sbit DIG3 = P1^2;
sbit DIG4 = P1^3;

// 初始化函数
void init()
{
    // 关闭蜂鸣器和继电器
    // TODO: 根据实际连接,设置相应的GPIO口为输出,并将其置为适当的状态
    
    // 数码管显示初始化
    // TODO: 根据实际连接,设置相应的GPIO口为输出,并将其置为适当的状态
}

// 数码管显示函数
void display(char* text)
{
    int i, j;
    int delay_time = 1000; // 延时时间,单位为毫秒

    // 在数码管上显示文本"PoT."
    for (i = 0; i < 4; i++)
    {
        // TODO: 根据实际连接,设置相应的GPIO口为适当的状态,控制数码管显示字符
        // 这里假设函数display_digit(char digit)可以将单个字符显示在数码管上
        display_digit(text[i]);
        delay_ms(delay_time);
    }
}

// LED灯闪烁函数
void blink_leds(sbit* leds, int num_leds, int delay_time)
{
    int i;

    // 依次控制LED灯的状态,实现闪烁效果
    for (i = 0; i < num_leds; i++)
    {
        leds[i] = 1; // 点亮LED灯
        delay_ms(delay_time);
        leds[i] = 0; // 熄灭LED灯
        delay_ms(delay_time);
    }
}

// 主函数
void main()
{
    // 初始化单片机和外设
    init();

    // 显示"PoT."在数码管上,并保持1.5秒
    display("PoT.");
    delay_ms(1500);

    // LED灯1、2、7、8按顺序间隔1秒闪烁
    sbit leds1[] = {&LED1, &LED2, &LED7, &LED8};
    blink_leds(leds1, sizeof(leds1) / sizeof(leds1[0]), 1000);

    // 4秒后,LED灯3、4、5、6以1秒间隔闪烁
    delay_ms(4000);
    sbit leds2[] = {&LED3, &LED4, &LED5, &LED6};
    blink_leds(leds2, sizeof(leds2) / sizeof(leds2[0]), 1000);

    // 2秒后,所有LED灯全亮
    delay_ms(2000);
    LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = LED8 = 1;

    while (1)
    {
        // 主循环
        // 可以在这里添加额外的代码逻辑或功能
    }
}

上述代码只是一个示例,具体的GPIO引脚分配和操作可能需要根据你的硬件连接进行调整。同时,你可能需要查阅CT107D单片机的资料和文档来了解其寄存器和功能的详细信息,以及使用合适的编译器和开发环境进行编译和调试。

希望以上信息对你有帮助。

根据题意,简单的构思了一小段代码思路,供你参考:

#include <CT107D.h>  
  
// 定义数码管显示模式  
#defineDigitMode1 0x80  
#defineDigitMode2 0x40  
#defineDigitMode3 0x20  
#defineDigitMode4 0x10  
  
// 定义数码管显示数据  
#defineDigit0 0x03  
#defineDigit1 0x09  
#defineDigit2 0x25  
#defineDigit3 0x2D  
#defineDigit4 0x07  
#defineDigit5 0x1B  
#defineDigit6 0x13  
#defineDigit7 0x3E  
#defineDigit8 0x7A  
#defineDigit9 0x62  
  
void main(void)  
{  
    // 初始化 CT107D 单片机  
    Init();  
  
    // 关闭蜂鸣器和继电器等无关外设  
    AnologPinOutput(0, 0);  
    DigitalPinOutput(5, 0);  
    DigitalPinOutput(6, 0);  
    DigitalPinOutput(7, 0);  
    DigitalPinOutput(8, 0);  
    DigitalPinOutput(9, 0);  
    DigitalPinOutput(10, 0);  
    DigitalPinOutput(11, 0);  
    DigitalPinOutput(12, 0);  
    DigitalPinOutput(13, 0);  
    DigitalPinOutput(14, 0);  
    DigitalPinOutput(15, 0);  
    DigitalPinOutput(16, 0);  
    DigitalPinOutput(17, 0);  
    DigitalPinOutput(18, 0);  
    DigitalPinOutput(19, 0);  
    DigitalPinOutput(20, 0);  
    DigitalPinOutput(21, 0);  
    DigitalPinOutput(22, 0);  
    DigitalPinOutput(23, 0);  
    DigitalPinOutput(24, 0);  
    DigitalPinOutput(25, 0);  
    DigitalPinOutput(26, 0);  
    DigitalPinOutput(27, 0);  
    DigitalPinOutput(28, 0);  
    DigitalPinOutput(29, 0);  
    DigitalPinOutput(30, 0);  
    DigitalPinOutput(31, 0);  
  
    // 设置数码管显示模式为独立位显示,共阴极,亮度高,无小数点  
    SetDigitMode(DigitMode1 | DigitMode2 | DigitMode3 | DigitMode4);  
    SetDigitBrightness(15);  
    SetDigitDecPointMode(0);  
  
    // PoT.居中显示并保持 1.5 秒  
    SetDigitData(0, Digit8);  // Po  
    SetDigitData(1, Digit5);  // T.  
    DelayMs(1500);  // 保持 1.5 秒  
    ClearDigitData(0);  // Po 清空  
    ClearDigitData(1);  // T. 清空  
  
    // LED 灯 1 2 7 8 按顺序间隔 1s 闪烁,4s 后 3 4 5 6 灯以 1s 间隔闪烁,2 秒后全亮  
    int i;  
    for (i = 0; i < 6; i++) {  
        SetDigitData(i, Digit8);  // 全亮  
        DelayMs(2500);  //等待2.5秒  
        ClearDigitData(i);  // 全灭  
        DelayMs(2500);  //等待2.5秒

#如有帮助,恭请采纳
  • 这篇博客: 【蓝桥杯】CT107D开发板没有操作的led灯频闪、暗亮问题,蜂鸣器咔咔响中的 项目场景: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •         项目写好之后,led与beep也有初始化,烧录到开发板中,发现没有操作的LED灯暗亮、频闪,蜂鸣器有时也会咔咔响,如下视频,拍的不清楚,可以看到我操作的一个LED常亮,其他的灯在项目中并未操作,却会突然闪一下,或者微微亮

    6ff998387a7b4045a2ca814ddf35ecef-00001.jpg?auth_key=4812313945-0-0-718839ba830039c85eeea14dfb9d1a78

    【BUG】CT107D开发板LED灯频闪、暗亮(已解决)


CT107D是什么单片机?

回答部分参考、引用ChatGpt以便为您提供更准确的答案: 基于CT107D单片机达到以下要求的初始化步骤如下:

  1. 开发板上电后,关闭蜂鸣器、继电器等无关外设。 这可以通过相应的控制引脚或寄存器设置来实现。根据CT107D单片机的具体引脚和外设连接情况,确定控制相应外设的引脚,并将其设置为关闭状态。
  2. 酷炫复杂的开机方式: a. 数码管上居中显示"PoT.",并保持1.5秒。 首先,需要控制数码管的引脚和显示方式。将数码管的引脚连接到CT107D单片机的相应引脚,并使用适当的代码将"PoT."显示在数码管上,然后延迟1.5秒。 b. LED灯1、2、7、8按顺序间隔1秒闪烁,4秒后LED灯3、4、5、6以1秒间隔闪烁。 类似地,将LED灯的引脚连接到CT107D单片机的相应引脚,并使用适当的代码按照指定的顺序和时间间隔进行闪烁控制。首先,LED灯1、2、7、8按照1秒的间隔闪烁,持续4秒,然后延迟2秒后,LED灯3、4、5、6以1秒的间隔闪烁。 c. 2秒后所有LED灯全亮。 最后,延迟2秒后,将所有LED灯设置为亮起状态。

通过编写适当的程序代码,结合CT107D单片机的引脚和外设连接情况,可以实现上述酷炫的开机方式。

CT107D单片机DS18b20程序

#include <reg52.h>
#include <intrins.h>
 
#define uchar unsigned char
#define uint unsigned int
    
sbit DQ = P1^4; 
 
uchar code tab_duan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,\
                                                0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff};
uchar yi,er,san,si,wu,liu,qi,ba;
long wendu;
                                                
void All_Init();
void Delay1ms();
void Delay500us();
void Delay80us();
                                                
void Display1(uchar yi,uchar er);
void Display2(uchar san,uchar si);
void Display3(uchar wu,uchar liu);
void Display4(uchar qi,uchar ba);                                                
                                                
void init_ds18b20(void);                                                
unsigned char Read_DS18B20(void);    
void Write_DS18B20(unsigned char dat);
long TemperGet();
                                                
void main()
{
    All_Init();
    yi=21;er=21;san=21;si=21;wu=21;liu=21;qi=21;ba=21;
    
    while(1)
    {
        wendu = TemperGet();
        yi=wendu/100000;er=wendu%100000/10000+10;san=wendu%10000/1000;si=wendu%1000/100;
        Display1(yi,er);
        Display2(san,si);
        Display3(wu,liu);
        Display4(qi,ba);
    }
}
//DS18B20设备初始化
void init_ds18b20(void)
{
      DQ = 0;
      Delay500us();
      DQ = 1;
      Delay500us();
}
 
void Delay80us()        //@11.0592MHz
{
    unsigned char i, j;
 
    _nop_();
    i = 1;
    j = 217;
    do
    {
        while (--j);
    } while (--i);
}
 
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DQ = 0;
        DQ = dat&0x01;
        Delay80us();
        DQ = 1;
        dat >>= 1;
    }
}
 
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
    unsigned char i;
    unsigned char dat;
  
    for(i=0;i<8;i++)
    {
        DQ = 0;
        dat >>= 1;
        DQ = 1;
        if(DQ == 1)
        {
            dat |= 0x80;
        }        
        Delay80us();
    }
    return dat;
}
void Delay500us()        //@11.0592MHz
{
    unsigned char i, j;
 
    _nop_();
    _nop_();
    i = 6;
    j = 93;
    do
    {
        while (--j);
    } while (--i);
}
 
 
 
long TemperGet()
{
    uchar low,high;
    long temp;
    init_ds18b20();
    Write_DS18B20(0xcc);//忽略ROM指令
    Write_DS18B20(0x44);//直接温度转换
    Delay500us();
    
    init_ds18b20();
    Write_DS18B20(0xcc);//忽略ROM指令
    Write_DS18B20(0xbe);//读寄存器指令
    //Delay500us();
    low = Read_DS18B20();
    high = Read_DS18B20();
    
    temp = (high&0x0f);
    temp <<=8;
    temp|=low;
    
    temp = temp*625;
    return temp;
}
 
void All_Init()
{
    P2=0xa0;P0=0x00;//关闭蜂鸣器,继电器
    P2=0x80;P0=0xff;//关闭小灯
    P2=0xc0;P0=0xff;//选中8个数码管
    P2=0xe0;P0=0xff;//关闭选中的8个数码管
}
void Delay1ms()        //@11.0592MHz
{
    unsigned char i, j;
 
    _nop_();
    _nop_();
    _nop_();
    i = 11;
    j = 190;
    do
    {
        while (--j);
    } while (--i);
}
 
void Display1(uchar yi,uchar er)
{
    P2=0xc0;
    P0=0x01;
    P2=0xe0;
    P0=tab_duan[yi];
    Delay1ms();
    
    P2=0xc0;
    P0=0x02;
    P2=0xe0;
    P0=tab_duan[er];
    Delay1ms();
    
}
 
void Display2(uchar san,uchar si)
{
    P2=0xc0;
    P0=0x04;
    P2=0xe0;
    P0=tab_duan[san];
    Delay1ms();
    
    P2=0xc0;
    P0=0x08;
    P2=0xe0;
    P0=tab_duan[si];
    Delay1ms();
    
}
 
void Display3(uchar wu,uchar liu)
{
    P2=0xc0;
    P0=0x10;
    P2=0xe0;
    P0=tab_duan[wu];
    Delay1ms();
    
    P2=0xc0;
    P0=0x20;
    P2=0xe0;
    P0=tab_duan[liu];
    Delay1ms();
    
}
 
void Display4(uchar qi,uchar ba)
{
    P2=0xc0;
    P0=0x40;
    P2=0xe0;
    P0=tab_duan[qi];
    Delay1ms();
    
    P2=0xc0;
    P0=0x80;
    P2=0xe0;
    P0=tab_duan[ba];
    Delay1ms();
    
}