曹会杰 发表于 2025-6-24 21:36:42


/*
        MAIN_Fosc24000000Hz
*/
#include <AI8051U.H>
#include "stc32_stc8_usb.h"
#include <intrins.H>

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

unsigned char ucLed=0xFE;
unsigned char ucLed_Mode;//流水灯模式
unsigned char ucLed_Buff[]={0x7E,0xBD,0xDB,0xE7};

/*---Xms延时函数 ---*/
void DelayXms(unsigned int Xms)        //@24.000MHz
{
        unsigned long edata i;
        while(Xms--)
        {
                _nop_();
                _nop_();
                _nop_();
                i = 5998UL;
                while (i) i--;
        }
}
/*---LED流水灯处理函数 ---*/
void ucLed_Proc()
{
        static unsigned char i=0;
        P2 = ucLed;
        switch(ucLed_Mode)
        {
                case 0:
                        if(ucLed==0x7E)
                        {
                                ucLed = 0xFE;
                        }
                        else
                        ucLed = _crol_(ucLed,1);
                        DelayXms(500);
                        if(ucLed==0x7F)ucLed_Mode=1;
                break;
                case 1:
                        ucLed = _cror_(ucLed,1);
                        DelayXms(500);
                        if(ucLed==0xFE)ucLed_Mode=2;
                break;
                case 2:                                       
                                ucLed=ucLed_Buff;
                                i++;
                                if(i==3)ucLed_Mode=3;
                       
                        DelayXms(500);
                break;
                case 3:
                       
                        ucLed=ucLed_Buff;
                        i--;
                        if(i==255)ucLed_Mode=0;
                        DelayXms(500);
                break;
        }
        P2=0xFF;
}
/*---MAIN 主函数 ---*/
void main()
{
        P_SW2 |= 0x80;                //B7位写1,使能访问XFR       
                                                                       
        P0M1 = 0x00;   P0M0 = 0x00;        //初始化IO口为准双向IO口
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
       
        usb_init();                                     //USB CDC 接口配置
    IE2 |= 0x80;                                    //使能USB中断
    EA = 1;                                                                                        //IE |= 0X80;开总中断
               
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
               
        while(1)
        {
                if (bUsbOutReady)
      {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
      }
                ucLed_Proc();
        }
}

ZIJIN_CHJ 发表于 2025-7-2 23:18:00

冲哥辛苦了,我想问一下第9 课数码管中的HC595驱动函数中的 "CY"是在什么地方定义的.这里有的弄不明白.


海洋 发表于 2025-7-10 16:44:18

感谢孜孜不倦的教学

木木01 发表于 2025-7-31 19:42:09

能不能封装一下usb的更多功能,usbhub, usbhid设备等

yunhehao 发表于 2025-9-10 16:54:31

果然高端,受益匪浅,感谢大佬

wuzhengmin 发表于 2025-9-15 21:06:09

请教一个掉电保存数据的问题:


我仔细的学习了冲哥的22讲比较器,也认真跟着冲哥把源程序写好了,经过下载实验,发现用降低电压(调整电位器W1)

可以顺利的保存按键次数数据,但是如果关电源(按Power-SW)或者把连接PC的电缆把掉,数据就无法保存

初步怀疑是电容太小,马上把240uf的电容换了个3300uf的,结果没用

接着把STC公司的AI8051U的相关里例程 22号   22-使用比较器检测外部稳压管输入前端,掉电时及时保存数据到EEPROM

下载后发现是可以保存秒数据的,无论是关电源(按Power-SW)或者把连接PC的电缆把掉,数据都正常保存。

我就开始乱怀疑,也按照STC公司的例程 22号,把秒时间改成按键次数,结果和冲哥的例程一样,只能调整电位器W1降低电压的时候

可以正常保存,就有点懵,我把源程序都作为附件,看看哪位大侠有时间,帮手看看?

实验环境是STC的AI8051U试验箱,32位模式


GGG_988 发表于 2025-9-18 08:10:12

ZIJIN_CHJ 发表于 2025-7-2 23:18
冲哥辛苦了,我想问一下第9 课数码管中的HC595驱动函数中的 "CY"是在什么地方定义的.这里有的弄不明白.




sbit      CY          =         PSW^7;

wuzhengmin 发表于 2025-10-3 11:56:46

要小结一下!

    从上个月开始重新学习冲哥的32位8051视频教程,今天看到21集:

第二十一集:串口应用上 昨晚把很久没有使用的一箭双雕小板也找出来了

还好,一切顺利:

把冲哥的例程改了一点:多点亮几个数码管和LED灯...............

本来还想把温度读出来,结果下载运行后没反应,好像整个程序都跑飞啦?

暂时不管按“D” 的温度显示啦!




wuzhengmin 发表于 2025-10-4 12:22:46

今天学习了冲个的《STC32G单片机视频教程》第二十一集:串口应用上和第二十一集:串口应用下


小改了一下,把温度的测量值带进去,真实一点点:

void main()                                        //程序开始运行的入口
{
        char str;
        int temp=0;
        float Temp_xs=0;
        sys_init();                                //USB功能+IO口初始化
        UART2_config(2);    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
       
        usb_init();                //usb库初始化
        delay_ms(500);
        Timer0_Init();        //定时器0初始化
       
        ADC_Init();       
       
        P1M0 = 0x00; P1M1 = 0x08;

       
        EA = 1;                                        //CPU开放中断,打开总中断。

        PrintString2("STC32G UART2 Test Programme!\r\n");//UART2发送一个字符串

        while(1)                //死循环
        {
                delay_ms(2);
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();

                }
               
                if( Rec_Flag==1 )        //他已经检测到了最末尾的\R\N结束符号
                {       
                        switch( RX2_Buffer )
                        {
                                case 'A':                        //点亮某个LED的命令
                                        if(( RX2_Buffer>=48 ) && ( RX2_Buffer<=55 ))
                                        {
                                                //LED = ~(1<<(RX2_Buffer-48));
                                                LED0 = ~(RX2_Buffer-48);LED1 = ~(RX2_Buffer-48);LED2 = ~(RX2_Buffer-48);LED3 = ~(RX2_Buffer-48);
                                                LED4 = ~(RX2_Buffer-48);LED5 = ~(RX2_Buffer-48);LED6 = ~(RX2_Buffer-48);LED7 = ~(RX2_Buffer-48);
                                        }
                                        break;
                                case 'B':
                                                SEG0= RX2_Buffer-48;SEG1= RX2_Buffer-48;SEG2= RX2_Buffer-48;SEG3= RX2_Buffer-48;
                                                SEG4= RX2_Buffer-48;SEG5= RX2_Buffer-48;SEG6= RX2_Buffer-48;SEG7= RX2_Buffer-48;
                                       
                                                break;
                                case 'C':
                                                if(RX2_Buffer==48)
                                                        BEEP = 0;
                                                else
                                                        BEEP = 1;       
                                        break;
                                case 'D':
                                                temp = Temp_Cal( ADC_Read(3) );
                                                Temp_xs = temp;
                                                //sprintf(str,"温度:%d\r\n",(int)temp);
                                                sprintf(str,"温度:%f\r\n",(float)Temp_xs/10);
                                                PrintString2(str);
                                               
                               
                                        break;
                                case 'Z':
                                                PrintString2("HELLO STC!\r\n");
                                        break;
                                default:
                                        break;                               
                        }
                        Rec_Flag = 0;
                }
                if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
                {
                        TIM_10MS_Flag = 0;                                                                        //清空标志位       
                }


        }
}
注意:
sprintf(str,"温度:%f\r\n",(float)Temp_xs/10);
sprintf产生的str,实际是从下列
PrintString2(str);函数输出到PC机串口去,当然先引用#include "stdio.h"

wuzhengmin 发表于 2025-10-4 12:24:35

实际运行一下:

效果还好啦



页: 21 22 23 24 25 26 27 28 29 30 [31] 32
查看完整版本: 冲哥32位8051视频教程疑问解答贴