学单片机的时候是51入门,
现在已经N些年没碰过51了,一直在用stm32
现在突然要用51,STC12LE2052,都不知道怎么写程序了
首先因为Keil里面没有宏晶的片子,所以不知道要选哪个型号代替
我选了89C51,简单代码如下:
#include <reg51.h>
void main()
{
P3 = 0x0f;
P1 = 0x0f;
while(1);
}
ISP下载(ISP好的,下载公司现成的Hex能用),就是没动静,哎,感觉好失败啊
哪位能耐心说说,谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
嗯,我应该没把问题说明白,我是说keil里找不到stc的型号,然后忘记了51程序的一般格式,比如sbit定义之类
下载这些都没问题的
谢谢回复,现在这些我都搞明白了,呵呵
------------------------------------------------------------
名称:遥控器红外解码,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 -------------------------------------------
-*------------------------------------------------------------*/
一周热门 更多>