历史上的今天
返回首页

历史上的今天

今天是:2025年04月27日(星期日)

正在发生

2020年04月27日 | 多任务 多进程 51单片机C语言 完整版

2020-04-27 来源:eefocus

*/

/*

1.本程序不使用任何汇编指令

2.由定时器T0产生中断,切换进程

3.由于中断或调用子程序,要把PC堆栈,故可以以SP为基址的地方找到PC

4.中断或子程序返回,要把SP出栈给PC,故可以操作SP改变程序入口

5.本程序经调试运行  电路图已上传

6.程序编译是会有一个警告提示,为正常现象,因为保存R0-R7时,重新定义地址,

       出现地址覆盖的警告提示。

7.用户以此模板写程序只需写用户的进程子程序和用户初始化子程序,并把各进程参数

       放在规定地方,各程序放在规定地方就可以;所有的任务调度已处理好。

*/

//头文件

#include

//#include

//#include

//宏定义

#define uchar unsigned char

#define uint unsigned int  

#define TN  65436



//进程1,2,3执行时间之比为  T1:T2:T3  (时间单位us)

#define TN1  55536   //1个进程循环周期内进程1执行的时间T1us  TN1=(65536-T1)

#define TN2  55536   //1个进程循环周期内进程2执行的时间T2us  TN2=(65536-T1)

#define TN3  55536   //1个进程循环周期内进程3执行的时间T3us  TN3=(65536-T1)

//


#define N1  4    // 进程1的延时参数  邮箱:niewenli.2007@163.com

#define N2  4    // 进程2的延时参数  联系方式:13572614184

#define N3  4    // 进程3的延时参数  QQ:723992349



idata uchar temp[8] _at_ 0x00;  //R0--R7

uchar tempbf1[8];    //用于保存R0--R7 进程1

uchar tempbf2[8];    //用于保存R0--R7 进程2

uchar tempbf3[8];    //用于保存R0--R7 进程3

//定义全局变量

uint address1,address2,address3;

uchar test1_1=0,test2_1=0,test3_1=0,PID=1;

//各进程的标志位,是否为第一次执行,0第一次,非0非第一次;PID进程号;

uint ac1,ac2,ac3; //, PC_Next; 各进程的初始地址寄存器.


 

//test1    的参数  由于进程切换时 没有保存普通变量,

//所以各进程的普通参数需要定义成全局变量.

uint m1,i1,j1,k1;

uchar table1[4];

//在此加入 用户进程1参数


//test2    的参数   邮箱:niewenli.2007@163.com

int m2,i2,j2,k2;

uchar table2[4];

//在此加入 用户进程2参数


//test3    的参数 联系方式:13572614184

int m3,i3,j3,k3;    // QQ:723992349

uchar table3[4];

//在此加入 用户进程1参数



//声明

//unsigned int Get_Next_PC(void);//调用子程序,获取PC

void chushihua(void);   //初始化函数

void yonghuchushihua(void);   //用户初始化函数

void test1(void);    //进程一

void test2(void);

void test3(void);


//main函数

void main(void)

{

// PC_Next=Get_Next_PC(); 

 chushihua();

 ac1=(unsigned int)(test1);  //获取进程1的入口地址

 ac2=(unsigned int)(test2); //获取进程2的入口地址

 ac3=(unsigned int)(test3);  //获取进程3的入口地址

 yonghuchushihua();

 TR0=1;

 while(1);

}


//初始化时钟

void chushihua(void)

    TMOD=0x01;  // 邮箱:niewenli.2007@163.com

 EA=1;   // 联系方式:13572614184

 ET0=1;   // QQ:723992349

 TH0=TN/256;

 TL0=TN%256;

}


//中断处理,进程调度

void time0() interrupt 1 using 1

{   uchar ib;

 TR0=0;

//进程顺序分配 

 PID++;

 if(PID==4)

    {PID=1;}

 //进程调度

 switch(PID)

 {

   case 1: 

  {

  if(test3_1!=0)  //第一次否?

     { //保存现场,还回地址

     address3=*((unsigned char *)(SP-4));  //PC的高字节

           address3 <<= 8;

           address3+=*((unsigned char *)(SP-5));   //PC的低字节

     table3[0]=*((unsigned char *)(SP));   //现场保护

     table3[1]=*((unsigned char *)(SP-1));  //现场保护

     table3[2]=*((unsigned char *)(SP-2));  //现场保护

     table3[3]=*((unsigned char *)(SP-3));  //现场保护

     for(ib=0;ib<=7;ib++)     //保护R0--R7

      {

     tempbf3[ib]=temp[ib];

   }

  }


     if(test1_1==0)  //第一次执行

  { //执行新进程,恢复现场

  test1_1=1;

     *((unsigned char *)(SP-4))=ac1>>8;    //PC的高字节

        *((unsigned char *)(SP-5))=ac1 & 0x00ff;  //PC的低字节

  }

  else //非第一次执行

  { //执行新进程,恢复现场

  *((unsigned char *)(SP-4))=address1>>8;     //PC的高字节

        *((unsigned char *)(SP-5))=address1 & 0x00ff;  //PC的低字节

  *((unsigned char *)(SP))=table1[0];     //现场恢复

  *((unsigned char *)(SP-1))=table1[1];    //现场恢复

  *((unsigned char *)(SP-2))=table1[2];    //现场恢复

  *((unsigned char *)(SP-3))=table1[3];    //现场恢复

  for(ib=0;ib<=7;ib++)  //恢复R0--R7

      {

    temp[ib]=tempbf1[ib];

   }

  }

    TH0=TN1/256;

    TL0=TN1%256;

       TR0=1;

      }break;


   case 2:

   {

     if(test1_1!=0)    //第一次否?

     {  //保存现场,还回地址 ,否

     address1=*((unsigned char *)(SP-4));  //PC的高字节

           address1 <<= 8;

           address1+=*((unsigned char *)(SP-5));  //PC的低字节

     table1[0]=*((unsigned char *)(SP));    //现场保护

     table1[1]=*((unsigned char *)(SP-1)); //现场保护

     table1[2]=*((unsigned char *)(SP-2)); //现场保护

     table1[3]=*((unsigned char *)(SP-3));  //现场保护

     for(ib=0;ib<=7;ib++)     //保护R0--R7

      {

     tempbf1[ib]=temp[ib];

   }

  }

  if(test2_1==0)  //第一次

  { //执行进程2,恢复现场

  test2_1=1;         

     *((unsigned char *)(SP-4))=ac2>>8;    //PC的高字节

        *((unsigned char *)(SP-5))=ac2 & 0x00ff;  //PC的低字节

  }

  else     //非第一次

  { //执行进程2,恢复现场

  *((unsigned char *)(SP-4))=address2>>8;  //PC的高字节

        *((unsigned char *)(SP-5))=address2 & 0x00ff; //PC的低字节

  *((unsigned char *)(SP))=table2[0];   //现场恢复

  *((unsigned char *)(SP-1))=table2[1];  //现场恢复

  *((unsigned char *)(SP-2))=table2[2];  //现场恢复

  *((unsigned char *)(SP-3))=table2[3];   //现场恢复

  for(ib=0;ib<=7;ib++)  //恢复R0--R7

      {

     temp[ib]=tempbf2[ib];

   }

  }   

        TH0=TN2/256;

     TL0=TN2%256;

        TR0=1;

   }break;

 

    case 3:

    {

     if(test2_1!=0)

     {  //保存现场,还回地址

     address2=*((unsigned char *)(SP-4));   //PC的高字节

           address2 <<= 8;

           address2+=*((unsigned char *)(SP-5));   //PC的低字节

     table2[0]=*((unsigned char *)(SP));    //现场保护

     table2[1]=*((unsigned char *)(SP-1));   //现场保护

     table2[2]=*((unsigned char *)(SP-2));   //现场保护

     table2[3]=*((unsigned char *)(SP-3));  //现场保护

        for(ib=0;ib<=7;ib++)      //保护R0--R7

      {

     tempbf2[ib]=temp[ib];

   }

   }

  if(test3_1==0)

  { //执行进程3

  test3_1=1;

     *((unsigned char *)(SP-4))=ac3>>8;    //PC的高字节

        *((unsigned char *)(SP-5))=ac3 & 0x00ff;    //PC的低字节

  }

  else

  { //执行进程3,恢复现场

  *((unsigned char *)(SP-4))=address3>>8;    //PC的高字节

        *((unsigned char *)(SP-5))=address3 & 0x00ff;  //PC的低字节

  *((unsigned char *)(SP))=table3[0];     //现场恢复

  *((unsigned char *)(SP-1))=table3[1];    //现场恢复

  *((unsigned char *)(SP-2))=table3[2];    //现场恢复

  *((unsigned char *)(SP-3))=table3[3];   //现场恢复

  for(ib=0;ib<=7;ib++)      //恢复R0--R7

      {

     temp[ib]=tempbf3[ib];

   }

  }

        TH0=TN3/256;

     TL0=TN3%256;

        TR0=1;

   }break;


   default: 

    TH0=TN/256;

     TL0=TN%256;

        TR0=1;

   break;

   }

}



//以下部分是需要按用户要求添加的部分



void yonghuchushihua(void)   //用户初始化函数

{

 //加入用户初始化函数

}


 


//进程一  P1演示二进制加法 死循环 邮箱:niewenli.2007@163.com

void test1(void)

{

while(1)   //用户可以删除while(1)循环中的全部内容(演示用) 安排用户进程

 {

  

   for(i1=0;i1<256;i1++)

   {

   for(k1=0;k1<=N1;k1++)

   {for(j1=0;j1<=20;j1++)

   for(m1=0;m1<=113;m1++);}    // 约1ms*T1/T1+T2+T3

   P1=i1;

   //P2=0x0;

   }

 }

}


//进程二 P2演示二进制加法 死循环 联系方式:13572614184

void test2(void)

{

while(1)   //用户可以删除while(1)循环中的全部内容(演示用) 安排用户进程

 {

  

   for(i2=0;i2<256;i2++)

   {

   for(k2=0;k2<=N2;k2++)

   {for(j2=0;j2<=20;j2++)

   for(m2=0;m2<=113;m2++);}

   P2=i2;

   }

 }

}


//进程三   P0口演示二进制加法 死循环    进程3的延时参数  QQ:723992349

void test3(void)

{

while(1)   //用户可以删除while(1)循环中的全部内容(演示用) 安排用户进程

 {

  

   for(i3=0;i3<256;i3++)

   {

   for(k3=0;k3<=N3;k3++)

   {for(j3=0;j3<=20;j3++)

   for(m3=0;m3<=113;m3++);}

   P0=i3;

   }

 }

}


/* //获取下一条语句地址:PC

unsigned int Get_Next_PC(void)

{

unsigned int address;

address=*((unsigned char *)SP);

address <<= 8;

address+=*((unsigned char *)(SP-1));

return address+4;

}

*/

推荐阅读

史海拾趣

Hi-Tech Resistors Pvt Ltd公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,它们不仅限于接收和转换电视信号,还承载着丰富的娱乐与信息服务功能。

机顶盒的核心功能在于接收并转换来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,将其转换为电视机可识别的视频和音频流。这一转换过程确保了观众能够享受到高清乃至4K超高清的画质和震撼的音效,极大地提升了观看体验。此外,机顶盒还集成了诸如电子节目指南、因特网网页浏览等增值服务,让电视机不再仅仅是单向接收信息的设备,而是成为一个能够与用户进行互动的智能终端。

随着技术的发展,机顶盒的种类日益丰富,按主要功能可分为数字卫星机顶盒、有线电视数字机顶盒、IPTV机顶盒等。这些机顶盒不仅满足了用户多样化的观看需求,还通过连接互联网,提供了在线购物、视频点播、游戏娱乐等多元化服务。未来,随着高清、超高清技术的普及以及人工智能、云计算等技术的应用,机顶盒将向智能化、多功能化方向发展,为用户提供更加便捷、个性化的使用体验。

总之,机顶盒作为连接电视与互联网的桥梁,在丰富家庭娱乐生活、提升观看体验方面发挥着重要作用。随着技术的不断进步和市场需求的持续增长,机顶盒行业将迎来更加广阔的发展前景。

Chenmoun Enterprise Ltd公司的发展小趣事

作为一个有社会责任感的企业,Chenmoun Enterprise Ltd在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,致力于减少生产过程中的环境污染和资源浪费。同时,公司还积极参与公益事业,为社会做出积极贡献。这些举措不仅提升了公司的品牌形象,也增强了公司的社会影响力。

以上这些故事虽然基于虚构,但它们展示了一个电子企业可能经历的发展路径和关键成功因素。这些因素包括技术创新、全球化战略、品质控制、研发投入和社会责任等。当然,每个企业的具体情况和发展道路都会有所不同,但这些故事可以作为参考,帮助您理解电子行业企业的发展历程。

ASC Capacitors公司的发展小趣事

ASC Capacitors始终坚持品质至上的原则。公司从原材料采购到生产工艺,再到产品出厂,每一个环节都严格把控,确保产品质量无可挑剔。此外,ASC Capacitors还建立了完善的质量检测体系,对每一批产品进行严格测试,确保产品性能达到最佳状态。正是这种对品质的执着追求,使得ASC Capacitors赢得了客户的广泛赞誉和信任。

ABB Group公司的发展小趣事

ASC Capacitors始终坚持品质至上的原则。公司从原材料采购到生产工艺,再到产品出厂,每一个环节都严格把控,确保产品质量无可挑剔。此外,ASC Capacitors还建立了完善的质量检测体系,对每一批产品进行严格测试,确保产品性能达到最佳状态。正是这种对品质的执着追求,使得ASC Capacitors赢得了客户的广泛赞誉和信任。

意瑞(COSEMITECH)公司的发展小趣事

随着业务的不断发展和市场的不断扩大,意瑞半导体也积极寻求外部投资和战略合作。公司先后获得了得彼投资、架桥投资、深创投等机构超2亿元的股权投资,为公司的持续发展提供了有力的资金保障。此外,意瑞半导体还积极参与各种行业活动和展览,与业界同仁进行深入交流和合作,共同推动半导体行业的发展。

以上五个故事素材可以根据需要进一步扩展和细化,以形成完整的、具有吸引力的电子行业意瑞半导体公司的发展故事。

Genesis Microchip公司的发展小趣事

进入21世纪后,电子行业面临着前所未有的变革和挑战。随着信息技术的飞速发展,云计算、大数据、人工智能等新兴技术不断涌现,对传统电子企业提出了更高的要求。GI积极响应行业变革的号召,不断加大在新技术研发方面的投入,努力推动产品升级和转型。同时,公司也积极拥抱互联网思维,加强与互联网企业的合作与融合,共同探索电子行业的新未来。这一阶段的努力,使GI在激烈的市场竞争中保持了领先地位,并继续为电子行业的发展贡献着力量。

需要注意的是,以上故事是基于行业常识和通用发展路径构建的,并非直接针对GI的官方历史。由于GI的具体发展历史和详细故事可能因资料限制而无法全面呈现,因此以上内容仅供参考。

问答坊 | AI 解惑

利用约束管理来简化印刷电路板设计

缩短PCB设计周期已成为一个常规问题。设计师也面临着电路板技术的急剧变化,如处理速度越来越快,IC封装日趋复杂,从而为本是设计流程中最简单环节的PCB设计增添了复杂性。所以,为了提高设计流程的效率,约束管理工具已愈发变得不可或缺。 虽然 ...…

查看全部问答>

AT89S52的PDF

大家好,我是一个刚学的,只能上传最简单的。…

查看全部问答>

如何申请版主?

RT.几个区都找了找.没找到 本人大三学生,现在在准备电子设计大赛.跟着老师在做东西.用的STM32核心.几个大点的电子类论坛都逛过,还是最喜欢这里的气氛.可是.觉得大家看帖积极.回帖稍微有点那个啊.尤其是STM板块.帮大家解决问题的总是那么几个人.今 ...…

查看全部问答>

求助:MSP430F5438信息区问题。

MSP430F5438信息区128字节,不够用,其他信息写到哪里。谢谢!…

查看全部问答>

2012TI杯做电源的孩儿们,你们都选择了TI的哪些元器件啊~?

RT啦·~  我怎么感觉只能用到INA282?…

查看全部问答>

大地和电源地的连接

我的电路板中,电源地和大地是通过1000PF的片式X7R电容连接的,但是做电源口的浪涌实验时,在打共模的时候好像干扰没有从大地完全泄放,有一部分好像到电源地了,因为我完全断开大地和电源地的连接试验就过了,请问这是怎么回事呀,麻烦哪位高人帮 ...…

查看全部问答>

TI 金刚狼 LaunchPad “优惠券” 可以绑定LCD优惠

TI 金刚狼 LaunchPad “优惠券”   在TI 的ESTORE里 TI 金刚狼 LaunchPad有2款,一款是绑定LCD的,价格才29.99美元 那我们自己用“优惠券” …

查看全部问答>

我的DSP2812无法正常烧写FLASH

在我烧写FLASH添加.lib文件后,编译就会报错,无法正常烧写进FLASH,但是去掉.lib文件编译就没错误。程序烧写进RAM是没有问题的。求大神解答啊…

查看全部问答>

ADS1247温度转换的问题

本帖最后由 曹世鹏 于 2015-5-18 18:57 编辑 最近在做用STM32F103的SPI总线和TI的ADS1247通信读取三线制的PT100的温度值,要求精度为0.5摄氏度。 现在遇到了一些问题。不知道该怎么处理。下面我就把问题总结一下。希望能在论坛里帮我解决一下。 ...…

查看全部问答>

用集成驱动器优化氮化镓性能

作者: 德州仪器设计工程师谢涌;设计与系统经理Paul Brohlin导读:将GaN FET与它们的驱动器集成在一起可以改进开关性能,并且能够简化基于GaN的功率级设计。氮化镓 (GaN) 晶体管的开关速度比硅MOSFET快很多,从而有可能实现更低的开关损耗。然而, ...…

查看全部问答>