• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

混频机C源文件,已在proteus中仿真通过

 

/********************
单硅混频程序
作者:无衣
采用STC11F02E芯片
主频固定为120HZ
********************/
// #include
 #include"STC_NEW_8051.h"
 #define uint unsigned int
 #define uchar unsigned char
 #define YHCS 300//600    //延时重要参数
 #define on 0        //为零则按键按下
 #define TH0CZ 0xef//0xdf //为T0初值
 #define TL0CZ 0xb8//0x72 //T0初值采用120HZ副频计算得到
 #define LMAX 85
 #define LMIN 15
 #define KEYS 12    //按键变化速度
 sbit key1=P3^0;
 sbit key2=P3^1;
 sbit out1=P3^5;      
 sbit out2=P3^7;
 sbit LED1=P3^4;
 sbit LED2=P3^3;
 sbit LED3=P3^2;
 uchar pwmt1;        //定义T1占空比
 bit onoff;
 uchar dg1,dg2,dg3;  //定义三个显示缓冲区,全局变量
 uchar code tabel[]={0xc0,0xf9,0xa4,0xb0,
  0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83};
  union{uint t1;struct{uchar th1;uchar tl1;}word;}t1a,t1b;
   /*定义两个共用体类型变量,其中T1A用来存
   放T1导通时间参数,T1B用来存放截止时间参数*/
  
void eeprom(uchar cmd)
{
 IAP_DATA=pwmt1;  //将占空比值传送到EEPROM数据寄存器
 IAP_ADDRH=0x00;  //送地址高字节
 IAP_ADDRL=0x00;  //送地址低字节
 IAP_CMD=cmd;  //送操作命令
 IAP_CONTR=0x82;  //允许IAP操作并设置CPU等待时间
 IAP_TRIG=0x5A;  //触发IAP
 IAP_TRIG=0xa5;  //触发IAP
 IAP_CONTR=0;  //禁止IAP
 IAP_CMD=0;   //去除IAP命令,防止误操作
 IAP_TRIG=0;   //防止误触发
 IAP_ADDRH=0x80;  //送地址高字节为0x80,指向非EEPROM区
 IAP_ADDRL=0x00;  //送地址低字节为0X00,防止误操作
 pwmt1=IAP_DATA;  //读取占空比值
}
void f10dsp()  //显示码转换函数
{
 dg1=0xc7;
 dg2=tabel[pwmt1/10];
 dg3=tabel[pwmt1%10];
}
void ftzh()      //占空比转T1计数器初值函数
 {
 t1a.t1=65535-(500*pwmt1);
 t1b.t1=65535-500*(100-pwmt1);
 }
void delaynms(uchar i)
 { uint sum;
   for(;i>0;i--)
  {
  sum=YHCS; 
  while(sum--);
  }
 } 
void dsp()   //显示函数
 {
 P1=dg1;
 LED1=1;
 delaynms(5);
 LED1=0;
 P1=dg2;
 LED2=1;
 delaynms(5);
 LED2=0;
 P1=dg3;
 LED3=1;
 delaynms(5);
 LED3=0;
 }
void stat()   //初始化函数
{
 CLK_DIV=0x01;
 P3=0xa3;
 P3M0=0xa0;   //设置P3.5和P3.7为强推挽输出.
 eeprom(1);  //读取EEPROM中的占空比数据
 if(pwmt1>LMAX||pwmt1  {
 pwmt1=60;
 eeprom(3);
 eeprom(2);
 }
 f10dsp();  //占空比数据转显示码并保存到显示缓冲区
 ftzh();   //占空比换算成定时器初值
 TH0=TH0CZ;  //将主频送到T0中
 TL0=TL0CZ;  //
 TMOD=0x11; //定时器模式1
 PT0=1;  //定时器0中断为高优先级
 ET1=1;  //开T1中断
 ET0=1;  //开T0中断
 EA=1;  //开全局中断
 TR1=1;  //启动T1
}
void main()
{
void key1com();
void key2com();
stat();//初始化
while(1)            
 {
 dsp();
 if(key1==on)
 key1com();
 if(key2==on)
 key2com();
 }
}
void key1com()
{ uchar i;
dsp();
if(key1==on)
 {do
  {
   if(pwmt1    pwmt1++;        
   f10dsp();
   ftzh();
   for(i=KEYS;i>0;i--)
   dsp();
     }
  while(key1==on);
  dsp();
  eeprom(3);
  eeprom(2);
 }

}
void key2com()
{ uchar i;
  dsp();
  if(key2==on)
 {do
  {
   if(pwmt1>LMIN)
   pwmt1--;
   f10dsp();
   ftzh();
   for(i=KEYS;i>0;i--)
   dsp();
     }
  while(key2==on);
  dsp();
  eeprom(3);
  eeprom(2);
    }
}
void t0int() interrupt 1 using 1
{uchar i;
 ET1=0;
 TH0=TH0CZ;
 TL0=TL0CZ;
 out1=0;
 out2=0;
 i=75;   //触发脉冲宽度为50us
while(--i);
out1=1;
out2=1;
ET1=1;
}
void t1int() interrupt 3 using 2
{ onoff=~onoff;
  if(onoff==1)
  { 
  TL1=t1a.word.tl1;
  TH1=t1a.word.th1;
  TR0=1;
  }
 else
{
TL1=t1b.word.tl1;
TH1=t1b.word.th1;
TR0=0;
}
}

全部回复(5)
正序查看
倒序查看
jd01140
LV.2
2
2011-05-24 15:21

好贴

太深了看不懂

0
回复
2011-05-24 18:23
@jd01140
好贴太深了看不懂

还以为楼主是搞正弦的哟。问下,在protues里,STC的片子,用的什么替换?或者哪里有库?

0
回复
无衣
LV.6
4
2011-05-24 18:35
@重庆酱油仔
还以为楼主是搞正弦的哟。问下,在protues里,STC的片子,用的什么替换?或者哪里有库?
楼主不是搞正弦的,是搞维修的,专门修理地球的.你问的问题实在是抱歉,我也不清楚.
0
回复
yitt
LV.9
5
2011-05-25 11:16
@无衣
楼主不是搞正弦的,是搞维修的,专门修理地球的.你问的问题实在是抱歉,我也不清楚.

顶无衣兄。

0
回复
氢气球
LV.6
6
2011-10-17 22:25
@yitt
顶无衣兄。
0
回复