| 
				打卡等级:以坛为家II打卡总天数:584最近打卡:2025-10-31 07:05:51   金牌会员 
 
 
	积分2705 
 | 
 
 发表于 2024-6-29 16:23:10
|
显示全部楼层 
| 本帖最后由 科学*** 于 2024-6-29 16:25 编辑 
 
 科学妞妞 发表于 2024-6-29 10:17示例程序,要和坛里的其他版的一样;
 有STC8   一份示例程序;
 有STC32   一份示例程序;
 
 #include <STC32G.h>
 //#define MAIN_Fosc                24000000L        //定义主时钟
 
 typedef unsigned char u8;                                //unsigned char                 类型用 u8 表示
 typedef unsigned int u16;                                //unsigned int                  类型用 u16表示
 typedef unsigned long int u32;        //unsigned long int 类型用 u32表示
 
 sbit LED1 = P2^0;                //引脚定义:LED1->P20
 sbit LED2 = P2^1;                //引脚定义:LED2->P21
 
 // 多线程功能定义如下:
 #define Task_Max 10             // 最大线程数
 u8 Task = 0;                    // 全局线程指针
 u8 Task_This[Task_Max] = {0};   // 线程状态表
 u16 Task_Timer[Task_Max] = {0}; // 线程私有定时器
 
 // 函数声明如下:
 void Core_Init(void);
 void Delay(unsigned int Time);
 void Get_Delay(void);
 
 //主运行函数如下:
 void main(void)
 {
 EAXFR = 1;                         // 使能访问 XFR
 CKCON = 0x00;         // 设置外部数据总线速度为最快
 WTST = 0x00;                // 设置程序代码等待参数,等待时间为0个时钟,CPU执行程序速度最快
 
 P0M1 = 0x00;P0M0 = 0x00;                //设置P0口为准双向口模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
 P1M1 = 0x00;P1M0 = 0x00;                //设置P1口为准双向口模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
 P2M1 = 0x00;P2M0 = 0xFF;                //设置P2口为推挽输出模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
 P3M1 = 0x00;P3M0 = 0x00;                //设置P3口为准双向口模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
 P4M1 = 0x00;P4M0 = 0x00;                //设置P4口为准双向口模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
 P5M1 = 0x00;P5M0 = 0x00;                //设置P5口为准双向口模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
 P6M1 = 0x00;P6M0 = 0x00;                //设置P6口为准双向口模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
 P7M1 = 0x00;P7M0 = 0x00;                //设置P7口为准双向口模式 //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
 
 Core_Init();
 EA = 1;                                                //使能总中断
 
 while (1)
 {
 Task = 1;// 线程1开始
 switch (Task_This[Task])
 {
 case 0:
 LED1 = ~LED1, Delay(100);
 break;
 case 2:                  // 进入Delay会自动跳下一个数字并进行等待,所以完成延时已经是下下个数字了
 Task_This[Task] = 0; // 回到最初的状态
 break;
 default:
 Get_Delay();
 break;
 }
 
 
 Task = 2;// 线程1开始
 switch (Task_This[Task])
 {
 case 0:
 LED2 = ~LED2, Delay(350);//换一个灯闪烁,并且不同频率
 break;
 case 2:                  // 进入Delay会自动跳下一个数字并进行等待,所以完成延时已经是下下个数字了
 Task_This[Task] = 0; // 回到最初的状态
 break;
 default:
 Get_Delay();
 break;
 }
 }
 }
 
 // 初始化定时及核心功能
 void Core_Init(void)
 {
 AUXR |= 0x80; // 定时器时钟1T模式
 TMOD &= 0xF0; // 设置定时器模式
 TL0 = 0x40;   // 设置定时初始值@24MHz,1ms
 TH0 = 0xA2;   // 设置定时初始值
 TF0 = 0;      // 清除TF0标志
 TR0 = 1;      // 定时器0开始计时
 ET0 = 1;      // 使能定时器0中断
 EA = 1;
 }
 
 void Timer0_Isr(void) interrupt 1
 {
 u8 xdata i;
 // 遍历所有线程定时器
 for (i = 0; i < Task_Max; i++)
 {
 if (Task_Timer > 0)
 {
 Task_Timer--;
 }
 }
 }
 
 // 设置非堵塞定时,刻度1ms
 void Delay(unsigned int Time)
 {
 Task_Timer[Task] = Time;
 Task_This[Task]++;
 }
 
 // 获取当前定时器状态
 void Get_Delay(void)
 {
 if (Task_Timer[Task] == 0)
 {
 Task_This[Task]++;
 }
 }
 
 | 
 |