找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2742|回复: 5
打印 上一主题 下一主题
收起左侧

有两个MCU程序主函数各有一个while(1),如果合成一个程序怎样改动才能同时运行

[复制链接]
跳转到指定楼层
楼主
ID:731982 发表于 2020-4-27 19:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5黑币
两个while(1)不可能同时存在,那么怎么改动才能合二为一呢
程序1 喇叭
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P2^0;        //定义喇叭输出端口
uchar tick,tl,th;                //定义节拍和T0初值变量
uchar TABLE[]={        //音符节拍表
    0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
        0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
        0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
        0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
        0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
        0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
        0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
        0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
        0x00};
uchar TABLE1[]={  //定时器初值表
0xfb,0x04,0xfb,0x90,0xfc,0x09,0xfc,0x44,
0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82,
0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,
0xfe,0x85,0xfe,0x9a,0xfe,0xc1};
   //T0中断服务函数
timer0()interrupt 1 using 1{
TL0=tl;TH0=th;//低八位定时器和高八位定时器
BEEP=~BEEP;
}
//基本单位延时函数
void delay1(){
uint i;
for(i=0;i<20000;i++);
}
//节拍延时函数
void delay(tt){
uchar i;
for(i=0;i<=tt;i++)delay1();
}
//主函数
void main(){
uchar t,t1,k=0;
while(1){
TMOD=0x01;IE=0x82;// T0工作于模式1,即16位定时器模式.IE是中断允许寄存器,D7置1表示允许CPU中断,D1置1表示允许T0溢出中断.
while(TABLE[k]!=0)
{ tick=(TABLE[k])&0x0f;
t=(_crol_(TABLE[k],4))&0x0f;
if(t!=0){
t1=--t*2+1;
t=t*2;
tl=TL0=TABLE1[t1];
th=TH0=TABLE1[t];
TR0=1;
  }
else TR0=0;
delay(tick);
k++;
     }
TR0=0;
   }
}

==========================
程序2 点阵
#include<reg52.h>
#include<intrins.h>
//intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用
//OE        第13脚        输出有效(低电平)
//MR        第10脚        主复位(低电平)
typedef unsigned char uchar;
typedef unsigned int uint;
/**********管脚说明********************/
#define P P1   //define 不用加;
sbit SER = P3^4;    //p3.4串行数据输入   DS
sbit SCK = P3^6;    //串行输入时钟,上升沿有效    SHCP        第11脚        数据输入时钟线
sbit RCK = P3^5;    //串行寄存器时钟,上升沿有效  STCP        第12脚        输出存储器锁存时钟线

/***********************************/

/**********函数声明********************/
void SendTo595(uchar byteData);
/***********************************/

/**********全局参数声明********************/
char shu=0xFE;
/***********************************/


void delay(unsigned int n)//延时函数
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}

void hang()//行扫描
{
        P=shu;
        shu=_crol_(shu,1);
}

char a[32]={0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,
                        0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00,
                    0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,
                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void main()
{
  int i,b=0;
        while(1)
        {
                        int num=12;
                        while(num--)
                        {
                                for(i=0;i<8;i++)
                                {
                                        hang();     //先位选再段选
                                        SendTo595(a[i+b]);                        
                                        delay(3);
                                }
                                //P=0xFF;
                                //SendTo595(0x00);
                        }
                  b++;
                        if(b>=24)b=0;
                        //P=0xFF;
         }        
}



//发送一个字节数据给595再并行输出
void SendTo595(uchar Data)
{
   int j=0;
   for(j;j<8;j++)
   {
                SCK = 0;
        SER=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0
        Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010
        SCK = 1;          //上升沿让串行输入时钟变成高电平 并延时两个时钟周期
        _nop_();

   }  

   /*位移寄存器完毕,转移到存储寄存器*/
         
        
   RCK = 0;
   RCK = 1;         //上升沿,存储寄存器变为高电平 延迟两个时钟周期
   _nop_();
   RCK = 0;

}



里面部分重复的变量名我自己会改,只想解决main里面怎么合并的问题

最佳答案

查看完整内容

可以直接把一个while(1)里面的程序放到另一个while(1)中,但是最好通过中断实现,把主要的部分放到定时器中断里面。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:578714 发表于 2020-4-27 19:47 | 只看该作者
可以直接把一个while(1)里面的程序放到另一个while(1)中,但是最好通过中断实现,把主要的部分放到定时器中断里面。
回复

使用道具 举报

板凳
ID:592807 发表于 2020-4-27 21:51 | 只看该作者
while里面的内容直接放一起,不冲突就好
回复

使用道具 举报

地板
ID:723681 发表于 2020-4-27 21:59 | 只看该作者
你可以根据情况,把两套程序有机的整合到一起,把主程序中需要循环执行的部分才放到while(1)里面
回复

使用道具 举报

5#
ID:624817 发表于 2020-4-28 00:40 | 只看该作者
C语言不过关啊 就算这个程序给你给你说明白了 换另一个还是不会,这样治标不治本 可以先把基础学好,基础好了移植自然不成问题。
回复

使用道具 举报

6#
ID:731982 发表于 2020-4-28 08:42 来自手机 | 只看该作者
houge123 发表于 2020-4-27 23:01
可以直接把一个while(1)里面的程序放到另一个while(1)中,但是最好通过中断实现,把主要的部分放到定时器中 ...

谢谢您了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表