zhange 发表于 2024-6-1 17:07:30

stc32-9.6试验箱演示程序移植为usb自动下载

本帖最后由 zhange 于 2024-6-1 20:38 编辑

今天说仔细研究下试验箱,一看程序有的是2013年写的,下载比较麻烦,于是打着学习的目的给程序都加上热下载吧(这里应该叫啥?)

自己用isp软件下载好头文件到下图路径自己安装到哪里选择好或者放到程序包的根目录








本着全部都移植的心,慢慢来搞一个发一个。。

zhange 发表于 2024-6-1 17:11:39


第零个没啥意思,设置端口没演示

01.1-用P6口做跑马灯-入门版




zhange 发表于 2024-6-1 17:25:01

01.1-用P6口做跑马灯-入门版解读

主要代码就是控制p60-p67输出高低电平,注意试验箱上的接了一个pnp三极管需要p40输出低电平。



zhange 发表于 2024-6-1 17:43:01

01.2-用P6口做跑马灯




zhange 发表于 2024-6-1 17:44:56

01.2-用P6口做跑马灯解读


u8 ledNum[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};



0x01 = 0000 0001B;

把数组映射到p6口

每500毫秒转换一个口

zhange 发表于 2024-6-1 20:33:51

02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序


这又是一个没有示波器看不见效果的代码


#define Timer0_Reload   (MAIN_Fosc / 1000)      //Timer 0 中断频率, 1000次/秒
#define Timer1_Reload   (MAIN_Fosc / 2000)      //Timer 1 中断频率, 2000次/秒
#define Timer2_Reload   (MAIN_Fosc / 3000)      //Timer 2 中断频率, 3000次/秒
#define Timer3_Reload   (MAIN_Fosc / 4000)      //Timer 3 中断频率, 4000次/秒
#define Timer4_Reload   (MAIN_Fosc / 5000)      //Timer 4 中断频率, 5000次/秒


哈哈

我给改了改成一个中断零了   不知道咋回事全部中断打开usb端口会失效

我给改成了2秒一闪的了 中断频率没变加了个全局变量

void timer0_int (void) interrupt 1
{
        i++;
        if(i>=1000)
        {
                i = 0;
                P67 = ~P67;
                P61 = ~P61;
        }
}




zhange 发表于 2024-6-1 20:39:40

本帖最后由 zhange 于 2024-6-1 20:47 编辑

02-Timer0-Timer1-Timer2-Timer3-Timer4    原代码解读


void Timer1_init(void)
{
      TR1 = 0;    //停止计数

    #if (Timer1_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
      #error "Timer1设置的中断过快!"

    #elif ((Timer1_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
      ET1 = 1;    //允许中断
    //PT1 = 1;    //高优先级中断
      TMOD &= ~0x30;
      TMOD |= (0 << 4);   //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
    //T1_CT = 1;//计数
      T1_CT = 0;//定时
    //T1CLKO = 1; //输出时钟
      T1CLKO = 0; //不输出时钟

      #if (Timer1_Reload < 65536UL)
            T1x12 = 1;//1T mode
            TH1 = (u8)((65536UL - Timer1_Reload) / 256);
            TL1 = (u8)((65536UL - Timer1_Reload) % 256);
      #else
            T1x12 = 0;//12T mode
            TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
            TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
      #endif

      TR1 = 1;    //开始运行

    #else
      #error "Timer1设置的中断过慢!"
    #endif
}



主要是红色部分:

#if (Timer1_Reload < 65536UL)
T1x12 = 1; //1T mode
TH1 = (u8)((65536UL - Timer1_Reload) / 256);   
TL1 = (u8)((65536UL - Timer1_Reload) % 256);



结合下边代码带进去计算
#define Timer1_Reload   (MAIN_Fosc / 2000)      //Timer 1 中断频率, 2000次/秒


Timer1_Reload = 24000000/2000 = 12000


TH1 = (u8)((65536UL - Timer1_Reload) / 256);   



带进去就为 209.1换为 十六进制 为0x D1





其实直接在isp设置多简单。。。。。。。。。。。。

zhange 发表于 2024-6-2 05:54:12

03-用P6,P7qudong8个shu码管   汉字keil显示乱码 我把名字改了






zhange 发表于 2024-6-2 06:13:21

03-用P6,P7qudong8个shu码管   简单原理分析


这利用到了数码管循环扫描显示为啥看起来不闪?因为人眼有辉光暂留   扫描周期只要不大于20-40毫秒就分辨不出来

这里的扫描周期8毫秒

P7 = ~T_COM;


P7和P6按位取反 是因为共阳数码管阳极接法有个pnp三极管 P7相关位必须输出低电压才有电流流进去







其实1毫秒时间还可以再往上加加到2毫秒测试我测试了2毫秒可以但是4毫秒就看出来闪了

为啥不能三毫秒?因为1秒等于1000毫秒   除于三除不尽

zhange 发表于 2024-6-2 06:17:30

注意:用到中断的地方 不要忘了开对应中断和中断总开关
页: [1] 2 3 4 5 6
查看完整版本: stc32-9.6试验箱演示程序移植为usb自动下载