C语言单片机小车是什么,单片机小车(超详细设计资料)

#include "STC15.h"

#include "ds1302.h"

#include "iic.h"

#include "intrins.h"

typedef     unsigned char   u8;

typedef     unsigned int    u16;

typedef     unsigned long   u32;

u8 e_write_flag=0;

u8 mode=0;

u8 code t_display[]={                       //标准字库

//   0    1    2    3    4    5    6    7    8    9           -

0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};

void Delay1ms()                //@11.0592MHz

{

unsigned char i, j;

_nop_();

_nop_();

_nop_();

i = 11;

j = 190;

do

{

while (--j);

} while (--i);

}

void delay_ms(u16 i)

{

while(i--)

Delay1ms();

}

void dis_num(u8 x,u8 num)  //数码管显示

{

P0=0X01<

P2=0XC0;

P2=0X00;

P0=~t_display[num];

P2=0XE0;

Delay1ms();

P0=0XFF;

P2=0X00;

}

u8 ad()                //AD采集

{

u8 i;

IIC_Start();

IIC_SendByte(0x90);

IIC_WaitAck();

IIC_SendByte(0x03);

IIC_WaitAck();

IIC_Start();

IIC_SendByte(0x91);

IIC_WaitAck();

i=IIC_RecByte();

IIC_Stop();

return i;

}

void DS1302_Init()         //1302初始化

{

Write_Ds1302(0x8e,0x00);

Write_Ds1302(0x80,0x55);

Write_Ds1302(0x82,0x59);

Write_Ds1302(0x84,0x23);

Write_Ds1302(0x8e,0x80);

}

void show_time()          //显示时间

{

u8 i;

i=Read_Ds1302(0x85);

dis_num(0,(i&0xf0)>>4);

dis_num(1,(i&0x0f));

dis_num(2,10);

i=Read_Ds1302(0x83);

dis_num(3,(i&0xf0)>>4);

dis_num(4,(i&0x0f));

dis_num(5,10);

i=Read_Ds1302(0x81);

dis_num(6,(i&0xf0)>>4);

dis_num(7,(i&0x0f));

}

void write_eeprom(u8 adr,u8 dat)   //写入EEPROM

{

IIC_Start();

IIC_SendByte(0xa0);

IIC_WaitAck();

IIC_SendByte(adr);

IIC_WaitAck();

IIC_SendByte(dat);

IIC_WaitAck();

IIC_Stop();

}

u8 read_eeprom(u8 adr)           //读取EEPROM

{

u8 i;

IIC_Start();

IIC_SendByte(0xa0);

IIC_WaitAck();

IIC_SendByte(adr);

IIC_WaitAck();

IIC_Start();

IIC_SendByte(0xa1);

IIC_WaitAck();

i=IIC_RecByte();

IIC_Stop();

return i;

}

u8 scan_key()        //按键扫描

{

u8 key,i;

for(i=0;i<2;i++)

{

P3|=0X0F;

switch(i)

{

case 0:{P44=0;P42=1;}break;

case 1:{P44=1;P42=0;}break;

}

key=P3&0X0F;

if(key!=0x0f)

{

delay_ms(30);

key=P3&0X0F;

if(key!=0x0f)

{

while((P3&0X0F)!=0X0F);

switch(key)

{

case 0x0e:return i*4+7;break;

case 0x0d:return i*4+6;break;

case 0x0b:return i*4+5;break;

case 0x07:return i*4+4;break;

}

}

}

}

return 0;

}

void Time0_Init()

{

AUXR = 0x80;                    //定时器0为1T模式

TMOD = 0x04;                    //设置定时器0为16位自动重装载外部记数模式

TH0 = TL0 = 0xff;               //设置定时器0初始值

TR0 = 0;                        //定时器0开始工作

ET0 = 1;                        //开定时器0中断

}

void Timer1Init(void)                //50毫秒@11.0592MHz

{

AUXR &= 0xBF;                //定时器时钟12T模式

TMOD &= 0x0F;                //设置定时器模式

TL1 = 0x00;                //设置定时初值

TH1 = 0x4C;                //设置定时初值

TF1 = 0;                //清除TF1标志

TR1 = 0;                //定时器1开始计时

ET1 = 1;

}

void Timer2Init(void)                //50毫秒@11.0592MHz

{

AUXR &= 0xFB;                //定时器时钟12T模式

T2L = 0x00;                //设置定时初值

T2H = 0x4C;                //设置定时初值

IE2  |=  (1<<2);    //允许中断

AUXR |= 0x10;                //定时器2开始计时

IE2 |= 0x04;                    //开定时器2中断

}

//调整时间

bit change_time()

{

u8 x,k,temp_0,temp_1,show_flag;

u8 time[3]={0};

x=Read_Ds1302(0x85);

time[0]=((x&0xf0)>>4)*10+(x&0x0f);

x=Read_Ds1302(0x83);

time[1]=((x&0xf0)>>4)*10+(x&0x0f);

x=Read_Ds1302(0x81);

temp_0=x;

time[2]=((x&0xf0)>>4)*10+(x&0x0f);

x=0;

show_flag=1;

while(1)

{

if(show_flag)

{

dis_num(x*3,time[x]/10);

dis_num(x*3+1,time[x]%10);

}

switch(x)

{

case 0:{dis_num(2,10);dis_num(3,time[1]/10);dis_num(4,time[1]%10);dis_num(5,10);dis_num(6,time[2]/10);dis_num(7,time[2]%10);}break;

case 1:{dis_num(0,time[0]/10);dis_num(1,time[0]%10);dis_num(2,10);dis_num(5,10);dis_num(6,time[2]/10);dis_num(7,time[2]%10);}break;

case 2:{dis_num(0,time[0]/10);dis_num(1,time[0]%10);dis_num(2,10);dis_num(3,time[1]/10);dis_num(4,time[1]%10);dis_num(5,10);}break;

}

k=scan_key();

if(k==7)

{

Write_Ds1302(0x8e,0x00);

Write_Ds1302(0x80,(((time[2]/10)<<4)|(time[2]%10)));

Write_Ds1302(0x82,(((time[1]/10)<<4)|(time[1]%10)));

Write_Ds1302(0x84,(((time[0]/10)<<4)|(time[0]%10)));

Write_Ds1302(0x8e,0x80);

return 0;

}

if(k!=0)

{

switch(k)

{

case 4:{x++;if(x==3)x=0;}break;

case 11:{time[x]++;if(time[x]>59)time[x]=0;}break;

case 10:{if((x!=0)&(time[x]==0))time[x]=60;if((x==0)&(time[x]==0))time[x]=13;time[x]--;}break;

}

}

temp_1=Read_Ds1302(0x81);

if(temp_1!=temp_0)

{

temp_0=temp_1;

show_flag=!show_flag;

}

}

}

bit menu_1()//显示时间和设置时间

{

u8 k,x;

x=0;

while(1)

{

show_time();

k=scan_key();

if(k==4)

{

change_time();

}

switch(k)

{

case 6:{mode=1;return 1;}break;

case 5:{mode=2;return 1;}break;

case 9:{mode=3;return 1;}break;

}

}

}

u8 V[2]={0,0};

bit change_V() //修改电压上下限

{

u8 k,x,show_flag,temp_0,temp_1;

x=0;

show_flag=1;

temp_0=Read_Ds1302(0x81);

while(1)

{

if(show_flag)

{

if(x)

{

dis_num(4,V[1]/10);

dis_num(5,V[1]%10);

dis_num(6,0);

dis_num(7,0);

}

else

{

dis_num(0,V[0]/10);

dis_num(1,V[0]%10);

dis_num(2,0);

dis_num(3,0);

}

}

if(x)

{

dis_num(0,V[0]/10);

dis_num(1,V[0]%10);

dis_num(2,0);

dis_num(3,0);

}

else

{

dis_num(4,V[1]/10);

dis_num(5,V[1]%10);

dis_num(6,0);

dis_num(7,0);

}

k=scan_key();

temp_1=Read_Ds1302(0x81);

if(temp_1!=temp_0)

{

temp_0=temp_1;

show_flag=!show_flag;

}

if(k!=0)

{

switch(k)

{

case 4:{x++;if(x==2)x=0;}break;

case 11:{

if((x==1)&(V[0]>V[1])&(V[1]<95))

V[x]+=5;

if((x==0)&(V[0]<95))

V[x]+=5;

}break;

case 10:{

if((x==0)&(V[0]>V[1])&(V[0]>4))

V[x]-=5;

if((x==1)&(V[1]>4))

V[x]-=5;

}break;

}

}

if(k==6)

{

write_eeprom(0,V[0]);

delay_ms(50);

write_eeprom(1,V[1]);

return 1;

}

}

}

bit menu_2() //显示电压

{

u16 i;

u8 k;

while(1)

{

dis_num(0,10);

dis_num(1,1);

dis_num(2,10);

i=ad();

i=(u16)((float)i*19.6+0.5);

dis_num(4,i/1000);

dis_num(5,i%1000/100);

dis_num(6,i%100/10);

dis_num(7,i%10);

k=scan_key();

if(k==4)

{

change_V();

}

switch(k)

{

case 7:{mode=0;return 1;}break;

case 5:{mode=2;return 1;}break;

case 9:{mode=3;return 1;}break;

}

}

}

u16 timer=0;

u16 zhouqi=0;

u16 c_flag=0;

u8 over_flag=0;

bit menu_3() //频率周期显示

{

u8 k,ft=0;

u16        f,t;

EA=1;

TR0=1;

TR1=1;

while(1)

{

dis_num(0,10);

dis_num(1,2);

dis_num(2,10);

if(over_flag)

{

ET0=1;

TR0=1;

TR1=1;

over_flag=0;

f=c_flag*10;

c_flag=0;

}

k= scan_key();

if(k==4)

ft=!ft;

switch(k)

{

case 7:{mode=0;return 1;}break;

case 6:{mode=1;return 1;}break;

case 9:{mode=3;return 1;}break;

}

if(ft)          //f

{

dis_num(3,f/10000);

dis_num(4,f%10000/1000);

dis_num(5,f%10000%1000/100);

dis_num(6,f%100/10);

dis_num(7,f%10);

}

else

{

t=1000000/f;

dis_num(3,t/10000);

dis_num(4,t%10000/1000);

dis_num(5,t%10000%1000/100);

dis_num(6,t%100/10);

dis_num(7,t%10);

}

}

}

bit menu_4()        //查询

{

u8 k;

while(1)

{

dis_num(6,0);

dis_num(7,read_eeprom(2));

k= scan_key();

if(k==4)

{

k=0;

while(1)

{

dis_num(0,read_eeprom(3)/10);

dis_num(1,read_eeprom(3)%10);

dis_num(2,10);

dis_num(3,read_eeprom(4)/10);

dis_num(4,read_eeprom(4)%10);

dis_num(5,10);

dis_num(6,read_eeprom(5)/10);

dis_num(7,read_eeprom(5)%10);

k=scan_key();

if((k==7)|(k==6)|(k==5)|(k==4))

break;

}

}

switch(k)

{

case 7:{mode=0;return 1;}break;

case 6:{mode=1;return 1;}break;

case 5:{mode=2;return 1;}break;

}

}

}

void main()

{

u16 i,j;

P0=0X00;

P2=0XA0;

P2=0X00;

P0=0XFF;

P2=0X80;

P2=0X00;

V[0]=read_eeprom(0);

delay_ms(10);

V[1]=read_eeprom(1);

DS1302_Init();

Time0_Init();

Timer1Init();

Timer2Init();

EA=1;

while(1)

{

switch(mode)

{

case 0:menu_1();break;        //shijian

case 1:menu_2();break;        //dianya

case 2:menu_3();break;        //zhouqi

case 3:menu_4();break;        //chaxun

}

}

}

//中断服务程序

void t0int() interrupt 1            //中断入口

{

c_flag++;

}

bit t1_c=0;

void t1int() interrupt 3

{

if(t1_c==0)

t1_c=1;

else

{

t1_c=0;

ET0=0;

TR0=0;

TR1=0;

over_flag=1;

}

}

u8 t2_flag=0;

void timer2_int (void) interrupt 12        //50ms *100  5s

{

u16 i;

t2_flag++;

if(t2_flag>=100)

{

t2_flag=0;

i=ad();

i=(u16)((float)i*19.6+0.5);

if(i>V[0]*100)

{

write_eeprom(2,1);

delay_ms(8);

i=Read_Ds1302(0x85);

i=((i&0xf0)>>4)*10+i&0x0f;

write_eeprom(3,i);

delay_ms(8);

i=Read_Ds1302(0x83);

i=((i&0xf0)>>4)*10+i&0x0f;

write_eeprom(4,i);

delay_ms(8);

i=Read_Ds1302(0x81);

i=((i&0xf0)>>4)*10+i&0x0f;

write_eeprom(5,i);

}

if(i

{

write_eeprom(2,0);

delay_ms(8);

i=Read_Ds1302(0x85);

i=((i&0xf0)>>4)*10+(i&0x0f);

write_eeprom(3,i);

delay_ms(8);

i=Read_Ds1302(0x83);

i=((i&0xf0)>>4)*10+(i&0x0f);

write_eeprom(4,i);

delay_ms(8);

i=Read_Ds1302(0x81);

i=((i&0xf0)>>4)*10+(i&0x0f);

write_eeprom(5,i);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值