我用另一块stc89c52单片机却可以,为什么会出现这种情况?

我的STC89C52RC单片机,写了程序,在实验板上能够正常使用,在另一实验板无变化!求救!请高手指导!_百度知道
我的STC89C52RC单片机,写了程序,在实验板上能够正常使用,在另一实验板无变化!求救!请高手指导!
程序如下:#include &reg52.h&
//此文件中定义了52的一些特殊功能寄存器sbit M0=P2^0;sbit M1=P2^1;void delayms(unsigned char ms)// 延时子程序{while(ms--){for(i = 0; i & 120; i++);}}main(){//unsigned char LED;//LED = 0
//0xfe = P2=0// while(1)//{
M0 = 0;M1=0;
//高电平输出delayms(1000);
//延时M0 = 1;
//低电平输出delayms(1000);
//延时
//高电平输出delayms(1000);
//延时M1= 1; //M1=1;
//低电平输出delayms(1000);
//延时//}}我的电路图如下:
按你这样说不是程序问题,是板子问题。检查一下这两个板子相关的硬件接线。
其他类似问题
为您推荐:
stc89c52rc的相关知识
其他2条回答
那就只能是你两块板子上的接线不同咯,检查下接线吧,这程序很简单
你可以用导线连接你的LED到GND上测试一下你的硬件有没有问题。程序很简单应该问题不大!你可以考虑一下你LED的供电部分是否正常!
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁查看: 5390|回复: 14
我以前用STC89C52RC单片机写的红外解码为什么下到STC12C5A60S2单片机中就不能用了,
我以前用STC89C52RC单片机写的红外解码为什么下到STC12C5A60S2单片机中就不能用了,
------------------------------------------------*/
#include&reg52.h&& & //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include&1602.h&
#include&delay.h&
sbit IR=P3^3;&&//红外接口标志
char code Tab[16]=&ABCDEF&;
/*------------------------------------------------
& && && && && & 全局变量声明
------------------------------------------------*/
unsigned char&&//红外用全局变量
& & //&&红外接收完成标志& && &&&红外码值处理成16进制
bit& &irreceok ,& && && && && & irpro_ok& & ;
unsigned char IRcord[4];
unsigned char irdata[33];
unsigned char TempData[16];
/*------------------------------------------------
& && && && && && &函数声明
------------------------------------------------*/
void Ir_work(void);
void Ircordpro(void);
/*------------------------------------------------
& && && && && && &定时器0中断处理
------------------------------------------------*/
void tim0_isr (void) interrupt 1 using 1
&&irtime++;&&//用于计数2个下降沿之间的时间
/*------------------------------------------------
& && && && && && &外部中断0中断处理
------------------------------------------------*/
void EX1_ISR (void) interrupt 2 //外部中断0服务函数
&&static unsigned char&&i;& && && && & //接收红外信号处理
&&& && && && && & //是否开始处理标志位
& & if(startflag)& && && && && && && && &
& && &&&if(irtime&63&&irtime&=33)//引导码 TC9012的头码,9ms+4.5ms
& && && && && && && && && & i=0;
& && &&&& & & & & & & & irdata=//存储每个电平的持续时间,用于以后判断是0还是1
& && &&&& & & & & & & & irtime=0;
& && &&&& & & & & & & & i++;
& && & & & & & & & & & & & & &&&if(i==33)
& && && & & & & & & & & & & & & & {
& & & & & && && & & & & & & & & & & &&&irreceok=1;
& & & & & & & & & & & & & & & & & &&&i=0;
& & & & & && && & & & & & & & & & & & }
& & & & & & irtime=0;
& & & & & & startflag=1;
& && &&&& & & &
/*------------------------------------------------
& && && && && & 红外码值处理
------------------------------------------------*/
void Ircordpro(void)//红外码值处理函数
&&unsigned char i, j,
&&unsigned char cord,
&&for(i=0;i&4;i++)& && &//处理4个字节
& && &for(j=1;j&=8;j++) //处理1个字节8位
& && && &{
& && && & cord=irdata[k];
& && && & if(cord&7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
& && && && & value|=0x80;
& && && & if(j&8)
& & & & & & & && &&&{
& & & & & & & & & & & &&&value&&=1;
& & & & & & & & & & & & }
& && && &&&k++;
& && && &}
& &&&IRcord=
& &&&value=0;& &&&
& & & &&&irpro_ok=1;//处理完毕标志位置1
/*------------------------------------------------
& && && && && && &键值处理
------------------------------------------------*/
void Ir_work(void)
& && & TempData[0] = Tab[IRcord[0]/16];& &//处理客户码
& & & && & TempData[1] = Tab[IRcord[0]%16];
& && & TempData[2] = '-';
& & & && & TempData[3] = Tab[IRcord[1]/16];& &//处理客户码
& & & && & TempData[4] = Tab[IRcord[1]%16];
& & & && & TempData[5] = '-';
& & & && & TempData[6] = Tab[IRcord[2]/16];& &//处理数据码
& & & && & TempData[7] = Tab[IRcord[2]%16];
& & & && & TempData[8] = '-';
& & & && & TempData[9] = Tab[IRcord[3]/16];& &//处理数据反码
& & & && & TempData[10] = Tab[IRcord[3]%16];
& && & LCD_Write_String(5,1,TempData);
& && &if(IRcord[2]==69)
& && && &LCD_Write_String(14,0,&1&);
& & & && & irpro_ok=0;//处理完成标志
/*------------------------------------------------
& && && && && & 定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
&&TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
&&TH0=0x00; //重载值
&&TL0=0x00; //初始化值
&&ET0=1;& & //开中断
&&TR0=1;& &
/*------------------------------------------------
& && && && && && &外部中断0初始化
------------------------------------------------*/
void EX1init(void)
IT1 = 1;& &//指定外部中断0下降沿触发,INT0 (P3.2)
EX1 = 1;& &//使能外部中断
EA = 1;& & //开总中断
/*------------------------------------------------
& && && && && && &&&主函数
------------------------------------------------*/
void main(void)
EX1init();& && && && &//初始化外部中断
TIM0init();& && && &&&//初始化定时器
LCD_Init();& && && &&&//初始化液晶
DelayMs(20);& && && & //延时有助于稳定
LCD_Clear();& && && & //清屏
LCD_Write_String(0,0,&www.doflye.net&);
LCD_Write_String(0,1,&Code:&);
while(1)//主循环
& & if(irreceok)& && &//irreceok=1,说明红外接收完毕&&
& & & && &{& &
& & & && & Ircordpro();& & //红外码值处理函数
& & & && & irreceok=0;& &&&//方便下次红外接收
& & & && &}
& & if(irpro_ok)&&//irpro_ok=1;说明红外处理完毕
& & & && &{
& & & && & Ir_work(); //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
&&& & & && &}
如果这个程序真的是您亲自写的话,解决起来不过是几分钟的事情。怕就怕是抄来的,恐怕几个月都解决不了。
回复【1楼】fetish
如果这个程序真的是您亲自写的话,解决起来不过是几分钟的事情。怕就怕是抄来的,恐怕几个月都解决不了。
-----------------------------------------------------------------------
STC12C5A60S2这个单片机某些指令要快一些,从而导致时序不对。。。
STC12老妖说是1T,STC89C是传统的12T,把一个同样的流水灯下载到它俩试试看,就知道速度不一样
严重支持4楼!
回复【楼主位】woxiangxin
-----------------------------------------------------------------------
我是个菜鸟,程序是我在别人的程序上修改的
给你一个好的实验方法.换一个DS18B20能在89C52下面有跑的程序,换到1T的STC12就可以发现,取不出温度,只要你去慢慢去改延时代码,最终也能实现和89C52一样效果.
确实阿!我之前以碰到这样的情况但是知道是速度问题改改延时就可用了阿!我的是在做DS18B20上碰到的阿!
楼主既然是改的别人的程序,再改一次应该不是什么难事
将延时扩大10倍即可
STC12系列是高速单片机,时钟比52的快的多啊,红外解码的时序很重要,所以应该是时序的问题。
延时扩大10-12倍即可
阿莫电子论坛, 原"中国电子开发网"我买了一块stc89c52的单片机,是usb口的,可不可以用手机充电宝给它充电?_百度知道
我买了一块stc89c52的单片机,是usb口的,可不可以用手机充电宝给它充电?
提问者采纳
单片机是不带电池的吧另外你要看一下输入电压和电流是多少不要用充电宝吧单片机烧了就不好了电压电流低了,没办法带动
提问者评价
来自团队:
其他类似问题
为您推荐:
充电宝的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁查看: 5294|回复: 15
我用把程序烧尽STC89C52时可以正常运行,换了STC12C5A60S2却不行了
我用把程序烧尽STC89C52时可以正常运行,换了STC12C5A60S2却不行了
1、指令时间不同了。STC89C52是12周期的,STC12C5A60S2是1周期的,控制外围电路的指令时间变化很大。
2、EEPROM,地址变了。
3、特殊功能寄存器地址变了。
一个是12T 一个是1T.
建议把程序贴出来让大家分析下。(我只会汇编)
我也碰到这样的问题,郁闷
回复【1楼】dianzi_zhong
1、指令时间不同了。89c52是12周期的,12c5a60s2是1周期的,控制外围电路的指令时间变化很大。
2、eeprom,地址变了。
3、特殊功能寄存器地址变了。
-----------------------------------------------------------------------
STC12C5A60S2默认也是12T的(SPEC上看的)
IAP的操作也有所改变。
应该是两个不同厂家的芯片了。
125CA60S2默认是1T的吧,楼主可以测试一下
我开始也不成功,后来不知道怎么就好了(纳闷~),是个简单的流水灯之类的程序(我用C写的测试程序),可以下载。
上官网下比较新的下载软件试下,不行就降低波特率试。
回复【3楼】hefanghua
-----------------------------------------------------------------------
谁告诉你默认是12T的?它只有定时器默认是12T,CPU跑代码默认就是1T了!
额。虽然不是我说的,也帮3L回答下。
STC89系列可以选6T的双倍数和12T的单倍数,5A就不能选指令时间了。说是1T,如果按平均值计算,实际算4T好了。
回复【4楼】powerxia
-----------------------------------------------------------------------
哥们!把你看的那份资料传上来!谢谢le
(原文件名:STC12C5A60S2.jpg)
(原文件名:STC89C52.jpg)
看程序是最好解决方法
完全不同的单片机
为什么我的超声波程序在stc89c52中正常&&但是在stc12中却不能正常工作& & 求助{:2:}
到底有没有解决过这类问题的 ?
看datasheet,里面有讲与传统51的区别,注意IO读取时先写1,然后两个NOP,再读才能正确。因为1t单片机IO翻转只要4个时钟周期,普通51则超过12个所以不需要
阿莫电子论坛, 原"中国电子开发网"我写的一个程序,但是不能烧进单片机,单片机型号是STC89C52,请问是什么原因?_百度知道
我写的一个程序,但是不能烧进单片机,单片机型号是STC89C52,请问是什么原因?
#include&reg52.h&#define key P3^7void delay(unsigned int count){ unsigned int a,b; for(a=0;a&a++) for(b=0;b&110;a++);}void main(void){ unsigned int i=0; unsigned char code table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,}; while(1) {
delay(10);
while(!key)
P1=table[i++];
提问者采纳
首先建议你把if(!key)
while(!key)
P1=table[i++];
}这段中的P1=0改成十六进制表示的,否则不容易搞懂是不是以ascii码付给P1的,当然这不是问题所在。请问你可以生成hex文件吗?如果可以但烧不进去就不是程序问题。你应该检查单片机或烧录器问题,比如说单片机晶振没插好或烧录器坏了都可能的
提问者评价
其他类似问题
为您推荐:
stc89c52的相关知识
其他1条回答
如果你得程序能编译不报错,平且生成了hex文件,那就是烧写软件的问题了,检查com口是否正确
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 stc89c52 的文章

 

随机推荐