题目



代码
timer.c
#include <timer.h>
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=ET0=1;
}
timer.h
#ifndef _TIMER_H_
#define _TIMER_H_
#include <STC15F2K60S2.H>
void Timer0Init(void);
#endif
smg.c
#include <smg.h>
uchar code smgduan[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0xff,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//后面加的是小数的显示
uchar dspbuf[8]={10,10,10,10,10,10,10,10};
void smg_display(void)
{
static uchar i=0;
XBYTE[0XE000]=0XFF; //这是MM编辑模式
XBYTE[0XC000]=1<<i;
XBYTE[0XE000]=smgduan[dspbuf[i]];
if(++i == 8)
i=0;
}
smg.h
#ifndef _SMG_H_
#define _SMG_H_
#include <STC15F2K60S2.H>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
void smg_display(void);
extern uchar dspbuf[8];
#endif
key.c
#include <key.h>
uchar key_sum;
uchar k7_press;
uchar k6_press;
void key_read(void)
{
static uchar k7_time=0,k6_time=0;
key_sum=0;
if(k7==0)
{
k7_time++;
if(k7_time==1)
{
key_sum=7;
}
if(k7_time>=20)
{
k7_time=1;
key_sum=0;
}
}
else
k7_time=0;
if(k6==0)
{
k6_time++;
if(k6_time==1)
{
key_sum=6;
}
if(k6_time>=20)
{
k6_time=1;
key_sum=0;
}
}
else
k6_time=0;
}
void key_control(void)
{
if(key_sum==7)
k7_press=1;
if(key_sum==6)
k6_press=1;
}
key.h
#ifndef _KEY_H_
#define _KEY_H_
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
sbit k7=P3^0;
sbit k6=P3^1;
void key_read(void);
void key_control(void);
extern uchar k7_press;
extern uchar k6_press;
#endif
adc.c
#include <adc.h>
#include "intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
//总线启动条件
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;
}
//等待应答
bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//通过I2C总线发送数据
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;
}
}
//从I2C总线上接收数据
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;
}
unsigned char adc_read(void)
{
unsigned char dat=0;
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(0X03);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0X91);
IIC_WaitAck();
dat=IIC_RecByte();
IIC_Stop();
return dat;
}
adc.h
#ifndef _ADC_H_
#define _ADC_H_
#include <STC15F2K60S2.H>
unsigned char adc_read(void);
#endif
main.c
#include <timer.h>
#include <smg.h>
#include <key.h>
#include <adc.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag_key;
uchar flag_adc;
uchar adc_dat;
uchar flag_smg;
uchar flag_relay;
uchar flag_water_count;
uint water_sum;
uint water_price;
void bee_init(void)
{
XBYTE[0XA000]=0X00;
}
void relay_on(void)
{
XBYTE[0XA000]=0X10;
}
void relay_off(void)
{
XBYTE[0XA000]=0X00;
}
void led1_on(void)
{
XBYTE[0X8000]=0X7F;
}
void led1_off(void)
{
XBYTE[0X8000]=0XFF;
}
void main()
{
bee_init();
Timer0Init();
adc_init(0x01); //选中光敏电阻
while(1)
{
/************key*************/
if(flag_key==1)
{
flag_key=0;
key_read();
key_control();
}
if(k7_press==1)
{
k7_press=0;
flag_smg=1;
flag_relay=1;
}
else if(k6_press==1)
{
k6_press=0;
flag_smg=0;
flag_relay=0;
}
/************adc*************/
if(flag_adc==1) //200ms读一次
{
flag_adc=0;
adc_dat=adc_read();
}
if(adc_dat<=63) //(1.25/5)*255
led1_on();
else if(adc_dat>63)
led1_off();
/************realy*************/
if(flag_relay==1)
relay_on();
else
relay_off();
/************water*************/
if(flag_relay==1)
{
if(flag_water_count==1)
{
flag_water_count=0;
water_sum+=1;
water_price=water_sum/2;
if(water_sum==9999)
{
flag_relay=0;
flag_smg=0;
}
}
}
/************smg*************/
if(flag_smg==1)
{
dspbuf[0]=10;
dspbuf[1]=11;
dspbuf[2]=5;
dspbuf[3]=0;
dspbuf[4]=water_sum/1000;
dspbuf[5]=(water_sum%1000/100+11); //小数
dspbuf[6]=water_sum%100/10;
dspbuf[7]=water_sum%10;
}
else if(flag_smg==0)
{
dspbuf[0]=10;
dspbuf[1]=11;
dspbuf[2]=5;
dspbuf[3]=0;
dspbuf[4]=water_price/1000;
dspbuf[5]=(water_price%1000/100+11);
dspbuf[6]=water_price%100/10;
dspbuf[7]=water_price%10;
}
}
}
void timer0_isr() interrupt 1
{
static uchar flag_key_time=0;
static uchar flag_adc_time=0;
static uchar flag_water_count_time=0;
if(++flag_key_time==30)
{
flag_key_time=0;
flag_key=1;
}
if(++flag_adc_time==200)
{
flag_adc_time=0;
flag_adc=1;
}
if(++flag_water_count_time==100)
{
flag_water_count_time=0;
flag_water_count=1;
}
smg_display();
}
本文介绍了参与蓝桥杯第三届省赛的自动售水机项目,涉及单片机编程,包括timer、smg、key、adc及main等模块的代码实现。

1749

被折叠的 条评论
为什么被折叠?



