- 打卡等级:以坛为家II
- 打卡总天数:419
- 最近打卡:2025-05-01 07:24:50
金牌会员
- 积分
- 1991
|
发表于 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]++;
}
}
|
|