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