stc12c4052ad串口程序c语言,STC12C4052部分调试成功的程序

这篇博客介绍了如何在STC单片机上进行定时器配置,实现1ms定时,并通过LED闪烁验证。同时,详细讲解了串口通信的设置和实现,包括发送单片机ID和LED闪烁控制。最后,博主展示了如何利用MAX6675芯片读取热电偶温度,并通过串口发送到调试助手。所有程序都在硬件上进行了调试并成功运行。
摘要由CSDN通过智能技术生成

参考STC官方例程。

1、定时器程序。

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

时间:2014年7月7日0:34:09

地点:桂电

制作:天空之恋

说明:定时器0工作在16位计数模式。,硬件调试成功

时间:2014年7月28日12:59:52

在新的板子上面硬件调试成功

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

#include //stc单片机专用的头文件

#include

#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

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 //stc单片机专用的头文件

#include

#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 //stc单片机专用的头文件 #include #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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值