1.定时器
void TM0()
{
TH0 = (65535-50000) / 256;
TL0 = (65535-50000) % 256;
TMOD = 0x01;
TR0 = 1;
EA = 1;
ET0 = 1;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b9befddf450dcf5119a45c3421d490c9.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/15e5609b00897e2d5fb269704c948de9.png)
1.1定时器中断
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/34898517b5c38eff2bc7f99fec8b4aac.png)
2.串口
sfr AUXR = 0x8e;
void uart_init()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
ET1 = 1;
SCON = 0x50;
AUXR = 0x00;
ES = 1;
EA = 1;
}
unsigned char receive()
{
unsigned char temp;
while(RI==0);
RI = 0;
temp = SBUF;
return temp;
}
void send_bit(unsigned char str)
{
SBUF = str;
while(TI ==0);
TI = 0;
}
void send_String(unsigned char *string)
{
while(*string != '\0')
{
send_bit(*string++);
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/91d34b0051d314de0e9682a341954646.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/515907bfad6142d46152dec9ecd4b525.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6854d78761a01df6125eb120aae62ec5.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/81f94fef51f8009ff376c1dcfdf460f6.png)
3.时钟
unsigned char write_add[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char read_add[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char time[7] = {0x35,0x49,0x19,0x02,0x01,0x01,0x23};
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/dc8b416a7a4592e7043184da3d7d5116.png)
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
void ds_write()
{
unsigned char i;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_Ds1302_Byte(write_add[i],time[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void ds_read()
{
unsigned char i;
for(i=0;i<7;i++)
{
time[i] = Read_Ds1302_Byte(read_add[i]);
}
}
smg_show(1,smg[time[2]/16]);
Delay();
smg_show(2,smg[time[2]%16]);
Delay();
4.555振荡器
同时用两个定时器,一个计数,一个定时,获取1秒的脉冲数。
void init_TM()
{
TMOD = 0x16;
TH1 = (65535-50000) / 256;
TL1 = (65535-50000) % 256;
TH0 = 0xff;
TL0 = 0xff;
TR1 = 1;
TR0 = 1;
ET0 = 1;
ET1 = 1;
EA = 1;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3b7b4120b12a8c6462e998f94813bc31.png)
void TM0_routine() interrupt 1
{
count_f++;
}
void TM1_routine() interrupt 3
{
TH1 = (65535-50000) / 256;
TL1 = (65535-50000) % 256;
count_t++;
if(count_t == 20)
{
f = count_f;
count_t = 0;
count_f = 0;
}
}
5. PCF8591(IIC)
void read_rd1()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
rd1 = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
}
6. 24C02 (IIC) (存数据)(EEPROM)
unsigned char read(unsigned char add)
{
unsigned char r;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
r = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return r;
}
void write(unsigned char add,unsigned char value)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(value);
IIC_WaitAck();
IIC_Stop();
}
7. DS18B20(温度测量)
void read_temp()
{
unsigned char h,l;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
smg_delay(2);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
l = Read_DS18B20();
h = Read_DS18B20();
init_ds18b20();
temp = (h << 8) | l;
temp = temp*0.625;
}
常用代码
uchar smg_nodot[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc1,0x8e,0xc8,0x8c,0xbf};
uchar smg_dot[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};