彻底败给51了,程序都不知道怎么写了

2020-01-30 14:05发布

学单片机的时候是51入门,
现在已经N些年没碰过51了,一直在用stm32
现在突然要用51,STC12LE2052,都不知道怎么写程序了
首先因为Keil里面没有宏晶的片子,所以不知道要选哪个型号代替
我选了89C51,简单代码如下:

#include <reg51.h>

void main()
{
    P3 = 0x0f;
    P1 = 0x0f;
    while(1);
}

ISP下载(ISP好的,下载公司现成的Hex能用),就是没动静,哎,感觉好失败啊
哪位能耐心说说,谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
29条回答
lengshuicha
2020-02-02 04:43
来一个51的红外线解码列子供参考

------------------------------------------------------------
  名称:遥控器红外解码,PO口接LED,显示功能码以供查看
  编写:mhjerry
  日期:20011.7
  内容:按遥控器上的按键,会在PO口LED上显示
-*------------------------------------------------------------*/  
#include "reg52.h"   //头文件,STC的片子通用,除了特殊寄存器之外可以通用  
  
//定义 此口为红外信号输入MCU口  
sbit IR_Out = P3^2;   
  
// 主程序运行标志位,运行主程序时LED灭,运行中断程序时LED亮   
sbit IR_Flag = P3^1;  
  
// LED显示口  
#define LED_Port P1  
  
// 用于存放按键码值,初始化为0000 0000这样接受数据时可以只考虑1了   
unsigned char dat[4] = {0,0,0,0};  
  
  
/*............................................................*/  
void main()  
{  
    IR_Out = 1;     // 此口为MCU输入口,故需要置1  
    IR_Flag = 1;    // 灭LED灯  
    TMOD = 0x01;    // 定时器0,方式1  
    IT0 = 1;        // 外部中断0,下降沿触发  
    EX0 = 1;        // 准许外部中断  
    EA = 1;         // CPU准许中断  
  
    while(1)  
    {  
        IR_Flag = 1;// 执行主程序时,LED灯灭  
    }  
}  
/*------------------------------------------------------------*-  
  函数名称:Int0()
  函数输入:无(容许中断时,外部触发)
  函数输出:无
  函数说明:外部中断0中断处理
-*------------------------------------------------------------*/  
void Int0() interrupt 0  
{  
    unsigned char i,j;  
    EX0 = 0;            // 关闭外部中断0  
    IR_Flag = 0;        // 执行中断程序时,LED灯亮  
    i = 10;             // 0.793ms延时,运行10次  
    while( --i )  
    {  
        // 定时0.793ms,延时0.793ms*10=7.93ms  
        TH0 = 0xfc;  
        TL0 = 0xe7;  
        TR0 = 1;  
        while( !TF0 );  
        TF0 = 0;  
        TR0 = 0;  
         
        // 这7.93ms期间只要IR_Out变高电平,就非合法的红外信号,跳出  
        if( IR_Out )  
        {  
            EX0 = 1;    // 准许中断  
            return ;  
        }  
    }  
      
    // 程序进行到这里,表明是合法的红外信号(利用9ms判断)  
    while( !IR_Out );   // 等待9ms低电平过去  
      
    // 程序进行到这里,表明经过9ms低电平  
    TH0 = 0xf6;  
    TL0 = 0xff;  
    TR0 = 1;  
    while( !TF0 );  
    TF0 = 0;  
    TR0 = 0;            // 延时2.305ms  
      
    // IR_Out 为低表明是连发码,不予理睬,跳出  
    if( !IR_Out )  
    {  
        EX0=1;  
        return;  
    }  
  
    // 程序进行到这里,表明是引导码,等待4.5ms高电平的过去  
    while( IR_Out );      
      
    // 开始接收用户码  
    for(i=0; i<4; i++)  
    {  
        for(j=0; j<8; j++)  
        {  
            while( !IR_Out );   // 等待低电平过去  
            dat[i] >>= 1;     // 把上次的数据位右移一位  
  
            TH0 = 0xfc;  
            TL0 = 0xe7;  
            TR0 = 1;  
            while( !TF0 );  
            TR0=0;  
            TF0=0;              //延时0.793ms   
              
            // 若为数据"1",则延时后IR_Out为高电平  
            if( IR_Out )   
            {  
                dat[i] |= 0x80;     // 所有数据位1放最高位  
                while( IR_Out );    // 等待高电平过去  
            }  
        }  
    }     
    LED_Port = dat[2];  
    EX0=1;      // 开中断  
    return;  
}  
/*------------------------------------------------------------*-
  ---- END OF FILE -------------------------------------------
-*------------------------------------------------------------*/

一周热门 更多>