1题目:
只是一次练习
## 注意:继电器,蜂鸣器干扰问题可以利用标志位解决
关于继电器和蜂鸣器的干扰问题https://blog.csdn.net/qq_28997735/article/details/88344555
## 注意:代码未完成超重记录单元
Q:啥时候完成?
A:大三实训抽到的时候(没抽到就不填了)
2代码:
main.c
******************************************************************************
* 文件名:模拟智能传送装置(未完成)
* 描 述:
* 作 者:思索与猫
* 日 期: 19/3/19
* 备 注:
*
******************************************************************************
#include<stc15f2k60s2.h>
#include<sys.h>
bit flag_buzz,flag_relay;
void ControlFucker();
sbit buzz = P0^6;
sbit relay = P0^4;
void main()
{
CloseFucker();
Timer0Init();
init_pcf859();
while(1)
{
if(flag_ad == 1) //读取AD值
{
flag_ad = 0;
weight = read_pcf859();
weight = weight*100/255.0f;
weight = weight*10;
if(weight >= 750) //发出警报
{
flag_buzz = 1;
flag_relay = 0;
flag_start = 0;
led_dat = 0x00;
}
else
{
flag_buzz = 0;
if(flag_led == 1)
{
flag_relay = 1;
}
else
{
flag_relay = 0;
}
flag_start = 1;
}
}
KeyDriver();
ShowTable();
ControlFucker();
}
}
void ControlFucker() //继电器,蜂鸣器控制
{
if(flag_buzz == 1)
{
if(flag_relay == 1)
{
P2 = P2&0x1f|0xa0;
buzz = 1;relay = 1;
P2 = P2&0x1f;
}
else
{
P2 = P2&0x1f|0xa0;
buzz = 1;relay = 0;
P2 = P2&0x1f;;
}
}
else
{
if(flag_relay == 1)
{
P2 = P2&0x1f|0xa0;
buzz = 0;relay = 1;
P2 = P2&0x1f;
}
else
{
P2 = P2&0x1f|0xa0;
buzz = 0;relay = 0;
P2 = P2&0x1f;;
}
}
}
sys.h
#ifndef __SYS_H_
#define __SYS_H_
#include<stc15f2k60s2.h>
#include<iic.h>
typedef unsigned char uchar;
typedef unsigned int uint;
//初始
void Timer0Init();
void CloseFucker();
uchar LedMode();
//显示
void Display();
void ShowTable();
void ShowLed(uchar led);
//按键
void KeyDriver();
void KeyAction(uchar key_value);
void KeyScan();
extern uchar code duan[];
extern uchar Table[8];
extern bit flag_led,flag_start,flag_order,flag_reverse;
extern uchar led_dat;
extern uint weight;
extern bit flag_ad;
extern bit flag_buzz,flag_relay;
#endif
sys.c
#include<sys.h>
uchar led_dat = 0x00;
uchar index = 0;
bit flag_ad;
void Timer0Init() //2ms@12.000MHz
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x40;
TH0 = 0xA2;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void T0_time() interrupt 1
{
static uint led_count = 0,ad_count = 0;
TL0 = 0x40;
TH0 = 0xA2;
KeyScan();
Display();
if(++ad_count == 30) //60ms读取一次AD值
{
ad_count = 0;
flag_ad = 1;
}
if(flag_led == 1) //控制开关
{
if(flag_start == 1&&++led_count >= 100) //0.2S流水灯
{
led_dat = LedMode();
led_count = 0;
}
ShowLed(led_dat);
}
else
{
ShowLed(0x00);
}
}
uchar LedMode() //流水灯模式
{
uchar led[] = {0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //0black
uchar led_dat;
if(flag_order == 1) //顺序
{
if(++index > 8) index = 1;
}
if(flag_reverse == 1) //逆序
{
if(index-- < 1) index = 8;
}
led_dat = led[index];
return led_dat;
}
void CloseFucker()
{
P2 = P2&0x1f|0xa0;
P0 = 0xaf;
P2 = P2&0x1f;
}
display.c
#include<sys.h>
uchar code duan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};//10black,11-
uchar Table[8];
uint weight;
void Display()
{
static uchar index = 0;
P2 = P2&0x1f|0xe0;
P0 = 0xff;
P2 = P2&0x1f;
P2 = P2&0x1f|0xc0;
P0 = 1<<index;
P2 = P2&0x1f;
P2 = P2&0x1f|0xe0;
P0 = ~duan[Table[index]];
P2 = P2&0x1f;
index++;
index &= 0x07;
}
void ShowTable() //显示重量
{
Table[0] = 10;
Table[1] = 10;
Table[2] = 10;
Table[3] = 10;
Table[4] = weight/1000;
Table[5] = weight/100%10;
Table[6] = weight/10%10;
Table[7] = weight%10;
}
void ShowLed(uchar led)
{
P2 = P2&0x1f|0x80;
P0 = ~led;
P2 = P2&0x1f;
}
key.c
#include<sys.h>
sbit Key_In_1 = P3^0;
sbit Key_In_2 = P3^1;
sbit Key_In_3 = P3^2;
sbit Key_In_4 = P3^3;
uchar KeySta[4] = {1, 1, 1, 1};
uchar KeyCodeMap[4] = {7, 6, 5, 4};
bit flag_led,flag_start,flag_order,flag_reverse;
void KeyDriver()
{
uchar i = 0;
static uchar KeyBack[4] = {1, 1, 1, 1};
for(i=0; i<4; i++)
{
if(KeySta[i] != KeyBack[i])
{
if(KeySta[i] == 1)
{
KeyAction(KeyCodeMap[i]);
}
}
KeyBack[i] = KeySta[i];
}
}
void KeyAction(uchar key_value)
{
if(key_value == 4) //启动
{
flag_led = 1;
flag_relay = 1;
}
else if(key_value == 5) //顺序流水灯
{
flag_start = 1;
flag_order = 1;
flag_reverse = 0;
}
else if(key_value == 6) //逆序流水灯
{
flag_start = 1;
flag_order = 0;
flag_reverse = 1;
}
else if(key_value == 7) //关闭
{
flag_led = 0;
flag_start = 0;
flag_order = 0;
flag_reverse = 0;
flag_relay = 0;
}
}
void KeyScan()
{
uchar i = 0;
static uchar KeyBuf[4] = {0xff, 0xff, 0xff, 0xff};
KeyBuf[0] = KeyBuf[0]<<1|Key_In_1;
KeyBuf[1] = KeyBuf[1]<<1|Key_In_2;
KeyBuf[2] = KeyBuf[2]<<1|Key_In_3;
KeyBuf[3] = KeyBuf[3]<<1|Key_In_4;
for(i=0; i<8; i++)
{
if(KeyBuf[i] == 0xff)
{
KeySta[i] = 1;
}
else if(KeyBuf[i] == 0x00)
{
KeySta[i] = 0;
}
else
{
;
}
}
}
iic.h
#ifndef _IIC_H
#define _IIC_H
#include "stc15f2k60s2.h"
#include "intrins.h"
#define somenop Delay5us()
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
sbit SDA = P2^1;
sbit SCL = P2^0;
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(unsigned char ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);
void Delay5us();
void write_eeprom(unsigned char dat,unsigned char add);
unsigned char read_eeprom(unsigned char add);
void init_pcf859();
unsigned char read_pcf859();
#endif
iic.c
#include "iic.h"
void Delay5us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 12;
while (--i);
}
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}
void IIC_Ack(unsigned char ackbit)
{
if(ackbit)
{
SDA = 0;
}
else
{
SDA = 1;
}
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1;
somenop;
}
bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
}
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
somenop;
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop;
}
return da;
}
void write_eeprom(unsigned char dat,unsigned char add)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char read_eeprom(unsigned char add)
{
unsigned char dat;
EA = 0;
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
dat = IIC_RecByte();
IIC_WaitAck();
EA = 1;
return dat;
}
void init_pcf859()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
}
unsigned char read_pcf859()
{
unsigned char dat;
EA = 0;
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat = IIC_RecByte();
IIC_WaitAck();
EA = 1;
return dat;
}