题目:
好久没有更新了,今天又写了一个第十届的,感觉这次就是555的频率计数时那个定时器的使用有点小注意事项,要用定时器0来计数,定时器1来计时,同时定时器1要计数555和模拟电压,话不多说,直接上源代码
main.c
#include"reg52.h"
#include"intrins.h"
#include"iic.h"
void SMG(int wei,int dat);
sfr AUXR=0x8e;
sbit S4=P3^3;int K4=0; //mode
sbit S5=P3^2;int K5=0; //choose_V
sbit S6=P3^1;int K6=1; //led
sbit S7=P3^0;int K7=1; //smg
unsigned int v_temp;
char code xianshi[15]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x7F,0xC1,0x8e};
void get_v()
{
v_temp=read_v();
v_temp=v_temp*1.96+0.5;}
void choose_573(int n)
{
switch(n)
{
case(0):P2=(P2&0x1f)|0x00;break;
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;
}
}
void init_system()
{
choose_573(4);
P0=0xff;
choose_573(5);
P0=0x00;
choose_573(0);
P0=0xff;
}
//---------------------------- 中断
void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x80;
TMOD = 0x04;
TL0 = 0xff;
TH0 = 0xff;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
}
int five_f;
void Timer1_server() interrupt 1
{
five_f++;
}
void Timer1Init(void) //5毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x00; //设置定时初始值
TH1 = 0x28; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1=1;
EA=1;
}
int Timer0_n=0;
int Timer0_m=0;
int dat_of_555;
void Timer0_server() interrupt 3
{
Timer0_n++;
Timer0_m++;
if(Timer0_n>=100)
{
Timer0_n=0;
get_v();
}
if(Timer0_m>=200)
{
dat_of_555=five_f;
five_f=0;
Timer0_m=0;
}
}
//----------------------------
//----------------------------按键
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 54;
j = 199;
do
{
while (--j);
} while (--i);
}
int x;
void key_board()
{
if(S4==0)
{
Delay5ms();
if(S4==0)
{
K4++;
if(K4==2)
{
K4=0;
}
}
while(!S4);
}
if(S5==0)
{
Delay5ms();
if(S5==0)
{
K5++;
if(K5==2)
{
K5=0;
v_temp=200;
}
}
while(!S5);
}
if(S6==0)
{
Delay5ms();
if(S6==0)
{
K6++;
if(K6==2)
{
K6=0;
choose_573(4);
P0=0xff;
choose_573(0);
P0=0xff;
}
}
while(!S6);
}
if(S7==0)
{
Delay5ms();
if(S7==0)
{
K7++;
if(K7==2)
{
K7=0;
for(x=1;x<9;x++)
{
SMG(x,10);
}
}
}
while(!S7);
}
}
//----------------------------
//----------------------------数码管
void Delay300us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 4;
j = 54;
do
{
while (--j);
} while (--i);
}
void SMG(int wei,int dat)
{
choose_573(6);
P0=0x80>>(wei-1);
choose_573(7);
P0=xianshi[dat];
choose_573(0);
P0=0xff;
}
void smg_display()
{
if(K4==0&&K5==0&&K7==1)
{
SMG(1,0);
Delay300us();
SMG(2,0);
Delay300us();
SMG(3,2);
Delay300us();
SMG(3,12);
Delay300us();
SMG(4,10);
Delay300us();
SMG(5,10);
Delay300us();
SMG(6,10);
Delay300us();
SMG(7,10);
Delay300us();
SMG(8,13);
Delay300us();
}
if(K4==0&&K5==1&&K7==1)
{
SMG(1,v_temp%10);
Delay300us();
SMG(2,(v_temp%100)/10);
Delay300us();
SMG(3,v_temp/100);
Delay300us();
SMG(3,12);
Delay300us();
SMG(4,10);
Delay300us();
SMG(5,10);
Delay300us();
SMG(6,10);
Delay300us();
SMG(7,10);
Delay300us();
SMG(8,13);
Delay300us();
}
if(K4==1&&K7==1)
{
SMG(1,dat_of_555%10);
Delay300us();
if(dat_of_555>=10)
{
SMG(2,(dat_of_555%100)/10);
}
else
{
SMG(2,10);
}
Delay300us();
if(dat_of_555>=100)
{
SMG(3,(dat_of_555%1000)/100);
}
else
{
SMG(3,10);
}
Delay300us();
if(dat_of_555>1000)
{
SMG(4,(dat_of_555%10000)/1000);
}
else
{
SMG(4,10);
}
Delay300us();
if(dat_of_555>10000)
{
SMG(5,(dat_of_555%100000)/10000);
}
else
{
SMG(5,10);
}
Delay300us();
if(dat_of_555>100000)
{
SMG(6,(dat_of_555%1000000)/100000);
}
else
{
SMG(6,10);
}
Delay300us();
SMG(7,10);
Delay300us();
SMG(8,14);
Delay300us();
}
}
//----------------------------
//----------------------------led工作
void led_work()
{
if(K6==1&&K4==0)
{
if(v_temp<150)
{
choose_573(4);
P0=0xfe;
choose_573(0);
P0=0xff;
}
if(v_temp<350&&v_temp>=250)
{
choose_573(4);
P0=0xfe;
choose_573(0);
P0=0xff;
}
if(v_temp>=150&&v_temp<250)
{
choose_573(4);
P0=0xfa;
choose_573(0);
P0=0xff;
}
if(v_temp>=350)
{
choose_573(4);
P0=0xfa;
choose_573(0);
P0=0xff;
}
}
if(K6==1&&K4==1)
{
if(dat_of_555<1000)
{
choose_573(4);
P0=0xfd;
choose_573(0);
P0=0xff;
}
if(dat_of_555>=1000&&dat_of_555<5000)
{
choose_573(4);
P0=0xf5;
choose_573(0);
P0=0xff;
}
if(dat_of_555>=5000&&dat_of_555<10000)
{
choose_573(4);
P0=0xfd;
choose_573(0);
P0=0xff;
}
if(dat_of_555>=10000)
{
choose_573(4);
P0=0xf5;
choose_573(0);
P0=0xff;
}
}
}
//----------------------------
void main()
{
init_system();
Timer0Init();
Timer1Init();
while(1)
{
key_board();
smg_display();
led_work();
}
}
iic.c
#include "reg52.h"
#include "intrins.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1;
sbit SCL = P2^0;
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//发送应答
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0:应答,1:非应答
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
unsigned int read_v()
{
unsigned int temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_SendAck(1);
IIC_WaitAck();
IIC_Stop();
return temp;
}
iic.h
#ifndef _IIC_H #define _IIC_H void IIC_Start(void); void IIC_Stop(void); bit IIC_WaitAck(void); void IIC_SendAck(bit ackbit); void IIC_SendByte(unsigned char byt); unsigned char IIC_RecByte(void); unsigned char read_v(); #endif
**
码字不容易,点个赞再走!!!!**



