stc32-9.6试验箱演示程序移植为usb自动下载
本帖最后由 zhange 于 2024-6-1 20:38 编辑今天说仔细研究下试验箱,一看程序有的是2013年写的,下载比较麻烦,于是打着学习的目的给程序都加上热下载吧(这里应该叫啥?)
自己用isp软件下载好头文件到下图路径自己安装到哪里选择好或者放到程序包的根目录
本着全部都移植的心,慢慢来搞一个发一个。。
第零个没啥意思,设置端口没演示
01.1-用P6口做跑马灯-入门版
01.1-用P6口做跑马灯-入门版解读
主要代码就是控制p60-p67输出高低电平,注意试验箱上的接了一个pnp三极管需要p40输出低电平。
01.2-用P6口做跑马灯
01.2-用P6口做跑马灯解读
u8 ledNum[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
0x01 = 0000 0001B;
把数组映射到p6口
每500毫秒转换一个口
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: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设置多简单。。。。。。。。。。。。
03-用P6,P7qudong8个shu码管 汉字keil显示乱码 我把名字改了
03-用P6,P7qudong8个shu码管 简单原理分析
这利用到了数码管循环扫描显示为啥看起来不闪?因为人眼有辉光暂留 扫描周期只要不大于20-40毫秒就分辨不出来
这里的扫描周期8毫秒
P7 = ~T_COM;
P7和P6按位取反 是因为共阳数码管阳极接法有个pnp三极管 P7相关位必须输出低电压才有电流流进去
其实1毫秒时间还可以再往上加加到2毫秒测试我测试了2毫秒可以但是4毫秒就看出来闪了
为啥不能三毫秒?因为1秒等于1000毫秒 除于三除不尽
注意:用到中断的地方 不要忘了开对应中断和中断总开关