STC12C4052部分调试成功的程序

来源:互联网 发布:窗帘 知乎 编辑:程序博客网 时间:2024/05/22 11:33

参考STC官方例程。

1、定时器程序。

/**********************

时间:2014年7月7日0:34:09
地点:桂电
制作:天空之恋
说明:定时器0工作在16位计数模式。,硬件调试成功
        时间:2014年7月28日12:59:52
在新的板子上面硬件调试成功
*******************/  
#include <stc12c2052ad.h> //stc单片机专用的头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define  FOSC  11059200L
#define  T1MS  (65536-FOSC/1000)        //1ms timer calculation method in 1T mode
sbit led=P3^7;
uint  count;                            //1000 times counter
/*void delay(uint t)
{
  uint a,b;
  for(a=0;a<t;a++)
    for(b=0;b<110;b++);
} */

/* Timer0 interrupt routine */

void tm0_isr() interrupt 1 using 1
{
     TL0 = T1MS;                        //reload timer0 low byte
     TH0 = T1MS >> 8;                   //reload timer0 high byte
     if (count-- == 0)                  //1ms * 1000 -> 1s
     {
          count = 1000;                 //reset counter
          led =~led;       //work LED flash
     }
}
void main()
{
     AUXR  = 0x80;                     //timer0 work in 1T mode

     TMOD  = 0x01;                     //set timer0 as mode1 (16-bit)

     TL0  = T1MS;                      //initial timer0 low byte

     TH0  = T1MS >> 8;                 //initial timer0 high byte

     TR0  = 1;                          //timer0 start running

     ET0  = 1;                          //enable timer0 interrupt

     EA  = 1;                           //open global interrupt switch
     count  = 0;                        //initial counter
     while (1);                        //loop

}

2、串口程序---学习单片机,必学串口程序,这对以后的设计帮助非常大

/**********************
时间:2014年7月7日0:34:09
地点:桂电
制作:天空之恋
说明:测试串口,测试单片机ID,测试LED闪烁
9600
2014年7月28日13:01:22
在新的板子上硬件调试成功
*******************/
#include <stc12c2052ad.h> //stc单片机专用的头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit  MCU_Start_Led   =  P3^7;
#define  RELOAD_COUNT   0xfd     //11.0592MHz,12T,SMOD=0,9600bp
void  serial_port_initial();
void  send_UART(unsigned char);
void  UART_Interrupt_Receive(void);
void  delay(void);
void  display_MCU_Start_Led(void);
void main(void)  
{

    unsigned  char i = 0;
     unsigned  char j = 0;
     unsigned char idata *idata_point;
     serial_port_initial();
     display_MCU_Start_Led();      //
    idata_point = 0xF8;
 for(j=0;j<=3;j++)
 {
 i = *idata_point;
 send_UART(i);//这个地方把单片机内部的序列号发送出来了
 idata_point++;
 }
     while(1)
{
  send_UART('2');
  delay();
  send_UART(10);
  delay();
  display_MCU_Start_Led();
}
}

void serial_port_initial()
{

     SCON     =   0xc0;      //0101,0000 8
     TMOD    =   0x21;      //0011,0001
PCON=0X00;//频率提高一倍
     TH1      =   RELOAD_COUNT; //
TL1      =   RELOAD_COUNT;
     TR1      =   1;        //
ES       =   1;        //
     EA       =   1;        //
}
void send_UART(unsigned char i)
{
     ES      =   0;      //
     TI      =   0;      //
     SBUF    =   i;
     while(TI ==0);     //
TI      =   0;      //
ES      =   1;      //
   }
void UART_Interrupt_Receive(void) interrupt 4
{
    unsigned char   k   =   0;
 if(TI) TI=0;

void delay(void)
{
     unsigned int j  =   0;
     unsigned int g  =   0;
     for(j=0;j<5;j++)
     {
          for(g=0;g<20000;g++)
          {
               _nop_();
               _nop_();
               _nop_();
             _nop_();
              _nop_();
          }
     }
}
void display_MCU_Start_Led(void)   
{

     unsigned  char i = 0;
         MCU_Start_Led   =   0;     //
          delay();
          MCU_Start_Led   =   1;     //   
          delay();
          MCU_Start_Led   =   0;     //
}

3、MAX6675读取实验。通过MAX6675采集热电偶温度,将采集的温度发到串口调试助手显示。

/**********************
时间:2014年7月7日0:34:09
地点:桂电
制作:天空之恋
说明:测试串口,测试单片机ID,测试LED闪烁
9600
//这个地方主要就是看时序了 
这个地方需要小心了
     2014年7月28日13:08:38
在新的板子上硬件调试成功  
  
*******************/  
#include <stc12c2052ad.h> //stc单片机专用的头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit  MCU_Start_Led   =  P3^7;


#define  RELOAD_COUNT   0xfd     //18.432MHz,12T,SMOD=0,9600bp
sbit MAX6675_SO=P1^6;    
sbit MAX6675_SCK=P1^7;    
sbit MAX6675_CS=P1^4; 
unsigned int Value;  
unsigned char data disdata[5];
void  serial_port_initial();   
void  send_UART(unsigned char);  
void  UART_Interrupt_Receive(void);
void  delay(void); 
void  display_MCU_Start_Led(void);
void delayspi(uint n)
{
    while (n--)
    {
        _nop_();
        _nop_();
    }
}
/*******************
这个地方要特别注意了,主要是时序问题
***********************************/
unsigned int ReadMAX6675()   
{
 unsigned char count;
 MAX6675_CS=1; //关闭MAX6675
 delayspi(500);
 MAX6675_CS=0;//置低,使能MAX6675
 delayspi(500);
 MAX6675_SCK=1;
 delayspi(500);
 Value=0;
 for(count=16;count>0;count--) //获取16位MSB
 {
  MAX6675_SCK=0;  //sck置低
  delayspi(500);
  Value=Value<<1;     //左移
    if(MAX6675_SO==1) //取当前值
       Value|=0x0001;
    else
     Value&=0xffff;
     MAX6675_SCK=1;
     delayspi(500);
 }
    MAX6675_CS=1;  //关闭MAX6675
    delayspi(500);
 return Value;
}
/**************************温度值显示 **************************************************/
void tempdisp()  

  unsigned int TempValue;
  unsigned int xiaoshu;  
   TempValue=ReadMAX6675();//读取MAX6675 转换后的温度数值;
   delayspi(500);   
   TempValue=TempValue<<1;         //去掉第15位
   TempValue=TempValue>>4;//去掉第0~2位
   xiaoshu=TempValue*10;
   TempValue=TempValue/4;     //MAX6675最大数值为1023。75,而AD精度为12位,即2的12次方为4096,转换对应数,故要除4;
   xiaoshu=xiaoshu/4; //与上述同理
if(TempValue>=1024)
{TempValue=1024;}
    disdata[0]=(TempValue/1000)%10+0x30;//千位 +0x30是对应LCD里的ROM字符位置编码
    disdata[1]=(TempValue/100)%10+0x30;//百位  +0x30是对应LCD里的ROM字符位置编码
    disdata[2]=(TempValue/10)%10+0x30;//十位 +0x30是对应LCD里的ROM字符位置编码
    disdata[3]=(TempValue)%10+0x30;//个位  +0x30是对应LCD里的ROM字符位置编码
    disdata[4]=xiaoshu%10+0x30;//分位 +0x30是对应LCD里的ROM字符位置编码
//使用串口将数据发送出来
 }
void main(void)  
{
      uint i=0;
     serial_port_initial();
     display_MCU_Start_Led();      //
     while(1)
{
      tempdisp(); 
    for(i=0;i<5;i++)
  {
     if(i==4)
    {
      send_UART('.');
    }
    send_UART(disdata[i]);
    delayspi(5000); 
}
send_UART(10);
  delayspi(5000); 
  delay();
  display_MCU_Start_Led(); 
  delay();
  delay();
  delay();
}
}
void serial_port_initial()
{
    SCON     =   0xc0;      //0101,0000 8
     TMOD    =   0x21;      //0011,0001
PCON=0X00;//频率提高一倍
     TH1      =   RELOAD_COUNT; //
TL1      =   RELOAD_COUNT;
     TR1      =   1;        //
ES       =   1;        //
     EA       =   1;        //
}
void send_UART(unsigned char i)
{
     ES      =   0;      //
     TI      =   0;      //
     SBUF    =   i;
     while(TI ==0);     //
    TI      =   0;      //
    ES      =   1;      //
   }
void UART_Interrupt_Receive(void) interrupt 4
 {
    unsigned char   k   =   0;
   if(TI) TI=0;

void delay(void)
{
    unsigned int j  =   0;
     unsigned int g  =   0;
     for(j=0;j<5;j++)
     {
          for(g=0;g<15000;g++)
          {
               _nop_();
               _nop_();
               _nop_();
               _nop_();
              _nop_();
          }
     }
}
void display_MCU_Start_Led(void)   
{
     unsigned  char i = 0;
       MCU_Start_Led   =   0;     //
       delay();
        MCU_Start_Led   =   1;     //   
        delay();
        MCU_Start_Led   =   0;     //
}

0 0
原创粉丝点击