參考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; //
}