蓝桥杯单片机学习过程记录(十一)第三届自动售水机
用到的内容:
独立按键s6.s7
数码管显示
IIC光敏电阻
Led小灯
定时器
继电器
#include<STC15F2K60S2.H>
#include<intrins.h>
unsigned char yi,er,san,si,wu,liu,qi,ba;
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff};
sbit s4=P3^3;
sbit s5=P3^2;
sbit s6=P3^1;
sbit s7=P3^0;
sbit SCL=P2^0;
sbit SDA=P2^1;
long int num,num_1;
long int price;
unsigned char flag_time;
unsigned char t;
unsigned char rd_num;
void delayms(int ms);
void allinit();
void display_12(yi,er);
void display_34(san,si);
void display_56(wu,liu);
void display_78(qi,ba);
void key_scan();
void Delay6us();
void time0init();
void rd_start();
void rd_stop();
void rd_send(unsigned char dat);
void wait();
unsigned char rd_rect();
unsigned char rd_read();
void main(void){
allinit();
yi=21;er=10;san=5;si=0;
wu=0;liu=10;qi=0;ba=0;
while(1){
key_scan();
rd_num=rd_read();
if(flag_time==1){
wu=num/100;liu=num%100/10+10;qi=num%10;ba=0;
}
else{
EA=0;ET0=0;
P2=0XA0;
//¼ÌµçÆ÷¹Ø
P0=~0X10;
price=num*5;
wu=price/1000;liu=price%1000/100+10;qi=price%100/10;ba=price%10;
}
if(rd_num>125){
P2=0X80;P0=0XFF;
}
else if(rd_num<126){
P2=0X80;P0=~0X01;
}
//yi=rd_num/100;er=rd_num%100/10;san=rd_num%10;
display_12(yi,er);
display_34(san,si);
display_56(wu,liu);
display_78(qi,ba);
}
}
//Æô¶¯
void rd_start(){
SCL=1;SDA=1;Delay6us();
SDA=0;Delay6us();
SCL=0;
}
//Í£Ö¹
void rd_stop(){
SCL=0;SDA=0;Delay6us();
SDA=1;Delay6us();
}
//·¢ËÍ
void rd_send(unsigned char dat){
unsigned char i;
for(i=0;i<8;i++){
if(dat&0x80) SDA=1;
else SDA=0;
Delay6us();
SCL=1;
dat<<=1;
Delay6us();
SCL=0;
}
}
//µÈ´ý
void rd_wait(){
SDA=1;Delay6us();
SCL=1;Delay6us();
if(SDA){
SCL=0;
rd_stop();
}
else
SCL=0;
}
//½ÓÊÕ
unsigned char rd_rect(){
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++){
SCL=1;Delay6us();
dat<<=1;
if(SDA)
dat|=0x01;
SCL=0;Delay6us();
}
return dat;
}
//¶ÁÈ¡
unsigned char rd_read(){
unsigned char temp;
rd_start();
rd_send(0x90);
rd_wait();
rd_send(0x01);
rd_wait();
rd_stop();
rd_start();
rd_send(0x91);
rd_wait();
temp=rd_rect();
rd_stop();
return temp;
}
//ÑÓʱ6us
void Delay6us() //@11.0592MHz
{
unsigned char i;
i = 14;
while (--i);
}
//°´¼ü¹¦ÄÜ
void key_scan(){
//S7¿ØÖÆ¿ª
if(s7==0){
delayms(5);
if(s7==0){
if(flag_time==1){
num=num;
}
else{
time0init();
P2=0XA0;
//¼ÌµçÆ÷¿ª
P0=0X10;
//¶¨Ê±Æ÷´ò¿ª
EA=1;ET0=1;
flag_time=1;
num=0;
}
}
while(!s7);
}
//s6¿ØÖƹØ
else if(s6==0){
delayms(5);
if(s6==0){
flag_time=0;
}
while(!s6);
}
}
void time0(void) interrupt 1
{
t++;
//1s¼Ó0.1L
if(t==200)
{
num++;
}
if(num==1000){
yi=21;er=21;san=21;si=21;
flag_time=0;
}
}
//5ms
void time0init(){
AUXR |=0X80;
TMOD &=0XF0;
TL0=0X00;
TH0=0X28;
TF0=0;
TR0=1;
}
void allinit(){
P2=0XA0;P0=0X00;
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
P2=0X80;P0=0XFF;
}
void display_12(yi,er){
P2=0XC0;P0=0X01;P2=0XE0;P0=seg[yi];
delayms(1);
P2=0XC0;P0=0X02;P2=0XE0;P0=seg[er];
delayms(1);
}
void display_34(san,si){
P2=0XC0;P0=0X04;P2=0XE0;P0=seg[san];
delayms(1);
P2=0XC0;P0=0X08;P2=0XE0;P0=seg[si];
delayms(1);
}
void display_56(wu,liu){
P2=0XC0;P0=0X10;P2=0XE0;P0=seg[wu];
delayms(1);
P2=0XC0;P0=0X20;P2=0XE0;P0=seg[liu];
delayms(1);
}
void display_78(qi,ba){
P2=0XC0;P0=0X40;P2=0XE0;P0=seg[qi];
delayms(1);
P2=0XC0;P0=0X80;P2=0XE0;P0=seg[ba];
delayms(1);
}
void delayms(int ms){
int q,w;
for(q=0;q<ms;q++)
for(w=0;w<845;w++);
}