目录
1、必写内容
根据小蜜蜂老师代码写的
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
//0-9
u8 code SMG_DM[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void CH138(u8 ch)
{
switch(ch)
{
case 4: P2=P2&0x1f|0x80; break;
case 5: P2=P2&0x1f|0xa0; break;
case 6: P2=P2&0x1f|0xc0; break;
case 7: P2=P2&0x1f|0xe0; break;
case 0: P2=P2&0x1f;
}
}
void Delay(u16 t)
{
while(t--);
}
void Display_bit(u8 pos,u8 dat)
{
CH138(7);P0=0xff;
CH138(6);P0=0x01<<pos;
CH138(7);P0=SMG_DM[dat];
Delay(500);
}
void Display_bit_N(u8 pos,u8 dat)
{
CH138(7);P0=0xff;
CH138(6);P0=0x01<<pos;
CH138(7);P0=SMG_DM[dat]+0x80;
Delay(500);
}
void System()
{
CH138(4);P0=0xff;
CH138(5);P0=0x00;
CH138(0);
}
void main()
{
System();
while(1)
{
}
}
2、SMG显示(温度保留一位小数点)
void Display_wd()
{
Display_bit(0,10);
Display_bit(1,1);
Display_bit(5,wd/100);
Display_bit_N(6,wd/10%10);
Display_bit(7,wd%10);
CH138(7);P0=0xff;
CH138(0);
}
最后两行消隐必写;
数码管显示其他的同理;
3、温度模块
onewire.c文件中要添加
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
t=t*12;//加这一段
while(t--);
}
main.c中
float Read_WD()
{
u8 low,high;
u16 temp;
float val;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=high&0x0f;
temp=temp<<8;
temp=temp|low;
val=temp*0.0625;
return val;
}
main()函数中加
wd=(u16)(Read_WD()*10);
保留一位小数乘10;保留两位小数乘100;
4、ADC模块
u8 ADC_out3()
{
u8 i,temp=0;
for(i=0;i<2;i++)
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x03);
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
temp=I2CReceiveByte();
I2CSendAck(1);
I2CStop();
}
return temp;
}
输出加上
dy=(u16)((ADC_out3()*5.0/255)*100);
4.5 DAC输出电压
IIC_Start();//IIC总线起始信号
IIC_SendByte(0x90);//发送PCF8591的写设备地址
IIC_WaitAck();//等待从机应答
IIC_SendByte(0x40);//发送控制字节,选择DA模式
IIC_WaitAck();//等待从机应答
IIC_SendByte(temp);//发送0-255
IIC_WaitAck();//等待从机应答
IIC_Stop();//IIC总线起始信号
5、串口设置
加上EA=1;ES=1;
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xE6; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void SendByte(u8 dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void SendString(u8 *str)
{
while(*str!='\0')
{
SendByte(*str++);
}
}
发送单字节
if(RI==1)
{
cmd=SBUF;
SendByte(cmd);
RI=0;
CH138(4);P0=0xff;
}
发送字符串
void Uart()interrupt 4
{
if(RI==1)
{
cmd[i]=SBUF;
i++;
RI=0;
if(i==6)
{
i=0;
if(strcmp(cmd,"return")==0)
{
status=1;
}
}
}
}
接收显示
wd_dat=(float)wd/10.0;//接收电压数据
sprintf(str,"voltage:%.1f°C\r\n",wd_dat);
SendString(str);
6、定时器
- 定时器初始化
void Timer0Init(void) //10毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xF0; //设置定时初值
TH0 = 0xD8; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;//自己加 定时器0使能
EA=1; //自己加 总使能
}
加上最后两行
2. 中断服务函数(如LED 0.1S闪烁)
void Timer0() interrupt 1
{
u8 a;
a++;
if(a==10)
{
L3=~L3;
CH138(4);
L3|=0xfb;
P0=L3;
a=0;
CH138(0);
}
}
7、继电器,蜂鸣器设置
(1)打开蜂鸣器:P0=0100 0000;或者P0=0x40;
关闭蜂鸣器:P0=1011 1111;或者P0&=0xb0
(2)打开继电器:P0=0001 0000; 或者P0=0x10;
关闭继电器:P0=1110 1111;或者P0=0xe8;
void jdq()
{
if(wd>=200)
{
CH138(5);P0=0x00;//打开继电器
CH138(5);P0=0x10;
CH138(0);
}
else
{
CH138(5);P0=0x00;//关闭继电器
CH138(0);
}
}
void Fmq()
{
if(dy>360)//打开蜂鸣器
{
CH138(5);P0=0x00;
CH138(5);P0=0x40;
CH138(0);
}
else
{
CH138(5);P0=0x00;//关闭蜂鸣器
CH138(0);
}
}
7、AT14C02存储
写字节
void Write_AT24C02(unsigned char addr,unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xA0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
读字节
unsigned char Read_AT24C02(unsigned char addr)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0xA0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xA1);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
8、N555频率
void initTimer()
{
TMOD = 0X04;//定时器0工作于计数模式且为16位自动重装载模式 定时器1工作于定时模式且为16位自动重装载模式
TL0 = 0XFF;//差一个脉冲就会中断
TH0 = 0XFF;
TL1 = (65536-50000)%256;
TH1 = (65536-50000)/256;
EA = 1;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
}
void Timer0 () interrupt 1
{
count_f++;
}
void Timer1() interrupt 3
{
count_t++;
if(count_t==20)//每隔1s就计算数了多少个脉冲,即为频率
{
dat_f = count_f;
count_t = 0;
count_f = 0;
}
if(press_flag==1)
{
press_count++;
}
}
9、DS1302时间模块
void Init_time()
{
u8 i;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<3;i++)
{
Write_Ds1302_Byte(write_t[i],time[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void Read_time()
{
u8 i;
for(i=0;i<3;i++)
{
time[i]=Read_Ds1302_Byte(read_t[i]);
}
}
ds1302.c文件添加头文件
#include "reg52.h"
#include "intrins.h"
sbit SCK=P1^7;
sbit RST=P1^3;
sbit SDA=P2^3;
10、超声波模块
sbit TX=P1^0;
sbit RX=P1^1;
void Ultrasonic_Timer0Init(void)
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xF4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0并不开始计时
}
u8 Wave_Recv(void)
{
u8 Wave_Num = 10;
u8 Dist;
//完成超声波的发送
TX = 0;
TL0 = 0xF4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TR0 = 1;
while(Wave_Num-- )
{
while(!TF0);
TX ^= 1;
TF0 = 0;
}
//完成超声波的接收
TR0 = 0; //关掉定时器的目的是为了重新装载
TL0 = 0; //设置定时初值,用于计时
TH0 = 0; //设置定时初值
TR0 = 1; //关掉定时器的目的是为了重新装载
while(RX && (~TF0));
TR0 = 0; //关闭的目的是计算距离
if(TF0 == 1)//表示溢出了
{
Dist = 250;//表示数据太大了,有病,为什么要测量这么长的高度
TF0 = 0;
}
else //没有产生溢出
{
Dist = (((TH0<<8) | TL0) * 0.017);
}
return Dist;
}