为什么stc12c5a32s2单片机60S2单片机第一次可以下程序,以后就不行了

STC12C5A60S2下载程序的问题
[问题点数:40分,结帖人skyblackspring]
STC12C5A60S2下载程序的问题
[问题点数:40分,结帖人skyblackspring]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年4月 硬件/嵌入开发大版内专家分月排行榜第二2007年9月 硬件/嵌入开发大版内专家分月排行榜第二
2013年5月 硬件/嵌入开发大版内专家分月排行榜第三2012年9月 硬件/嵌入开发大版内专家分月排行榜第三2007年11月 硬件/嵌入开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。查看: 5543|回复: 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倍即可
阿莫电子论坛, 原"中国电子开发网"

我要回帖

更多关于 stc12c5a60s2中文资料 的文章

 

随机推荐