//#include "stc15.h"
//#include <intrins.h>
//#include <stdio.h>
//#include <absacc.h>
//typedef unsigned char u8;
//typedef unsigned int u16;
//typedef unsigned long u32;
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
//u8 cnt; //存储PCA计时溢出次数
//u32 count0; //记录上一次的捕获值
//u32 count1; //记录本次的捕获值
//u32 length; //存储信号的时间长度(count1 - count0)
//float dismm;
//#define CCP_S0 0x10 //P_SW1.4
//#define CCP_S1 0x20 //P_SW1.5
延时函数,位操作,选择支路573,LED操作刷新,ULN2003刷新,数码管的刷新
//void delay1ms() //@11.0592MHz
//{
// unsigned char i, j;
// _nop_();
// i = 11;
// j = 199;
// do
// {
// while (--j);
// } while (--i);
//}
//void delayms(int n) //@11.0592MHz
//{
// unsigned char i, j;
// int k;
// for(k=0;k<n;k++)
// {
// delay1ms();
// }
//}
***************位操作,置1,清0,取反,判断
//u8 bitSet(u8 temp,u8 pos)
//{
// temp =temp |(1<<pos);
// return temp;
//}
//u8 bitReset(u8 temp,u8 pos)
//{
// temp &=~(1<<pos);
// return temp;
//}
//u8 bitTog(u8 temp,u8 pos)
//{
// temp =temp ^(1<<pos);
// return temp;
//}
//u8 bitRead(u8 temp,u8 pos)
//{
// u8 res;
// res =(temp>>pos) &0x01;
// return res;
//}
***************位操作,置1,清0,取反,判断
***************选择573
//#define LEDY 1
//#define SMGABCY 2
//#define SMGCOMY 3
//#define ULNY 4
//#define NONE 5
//void xz573(u8 x)
//{
// switch(x)
// {
// case LEDY:
// P2=(P2&0x1F)|0x80; //Y4 1000 0000
// break;
//
// case SMGABCY:
// P2=(P2&0x1F)|0xe0; //Y7 1110 0000
// break;
// case SMGCOMY:
// P2=(P2&0x1F)|0xc0; //Y6 1100
// break;
// case ULNY:
// P2=(P2&0x1F)|0xa0; //Y5 1010
// break;
// case NONE:
// P2=P2&0x1F;
// break;
// }
//}
LED___________________---
//#define L1 0
//#define L2 1
//#define L3 2
//u8 u8LED=0xff;
//void LEDonx(u8 i) //0
//{
// u8LED = bitReset(u8LED,i);
//}
//void LEDoffx(u8 i) //0
//{
// u8LED = bitSet(u8LED,i);
//}
//void LEDtog(u8 i)
//{
// u8LED =bitTog(u8LED,i);
//}
//void LEDdis(u8 temp)
//{
// //关闭所有的通道
// xz573(NONE);
// //刷新P0数据
// u8LED=temp;
// P0=u8LED;
// xz573(LEDY);
// xz573(NONE);
//}
*************蜂鸣器继电器
//u8 u8ULN=0x00;
//void JDQonx() //0
//{
// u8ULN = bitSet(u8ULN,4);
//}
//void JDQoffx() //0
//{
// u8ULN = bitReset(u8ULN,4);
//}
//void FMQonx() //0
//{
// u8ULN = bitSet(u8ULN,6);
//}
//void FMQoffx() //0
//{
// u8ULN = bitReset(u8ULN,6);
//}
//void ULNdis(u8 temp)
//{
// //关闭所有的通道
// xz573(NONE);
// //刷新P0数据
// u8ULN=temp;
// P0=u8ULN;
// xz573(ULNY);
// xz573(NONE);
//}
**********************************数码管,定时器动态扫描
位码,段码,显示扫描,定时扫描,字符串翻译到LED8函数;
///************* 本地常量声明 **************/
//u8 code t_display[]={ //标准字库,共阴极,比赛共阳,取反
0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
black - H J K L N o P U t G Q r M y
// 0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
// 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
//u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //注意数码管的数据LED8[0]是不是对应TCOM[0]还是TCOM[8]
u8 code T_COM[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位码
///************* 本地变量声明 **************/
//u8 LED8[8]; //显示缓冲
//u8 display_index=0; //显示位索引
//bit B_1ms; //1ms标志
//u8 SMGbuf[20];
///********************** 显示扫描函数 ************************/
void DisplayScan(void)
{
Send_595(~T_COM[display_index]); //输出位码
Send_595(t_display[LED8[display_index]]); //输出段码
P_HC595_RCLK = 1;
P_HC595_RCLK = 0; //锁存输出数据
if(++display_index >= 8) display_index = 0; //8位结束回0
}
///********************** 显示扫描函数 ************************/
//void DisplayScan(void)
//{
// //位取0,消隐
// // XBYTE [0xC000] = 0x00;
//
// xz573(NONE);
// P0=0x00;
// xz573(SMGCOMY);
// xz573(NONE);
// //位选择
// // XBYTE [0xC000] = T_COM[display_index];
//
// xz573(NONE);
// P0=T_COM[display_index];
// xz573(SMGCOMY);
// xz573(NONE);
// //段码
XBYTE [0xE000] = LED8[display_index];
//
// xz573(NONE);
// P0=LED8[display_index]; //记得取反
// xz573(SMGABCY);
// xz573(NONE);
// //锁存输出数据,这里是8个数码管
// if(++display_index >= 8) display_index = 0; //8位结束回0
//}
//void SMGconv()
//{
// u8 i=0,j=0,temp=0;
// while(SMGbuf[i]!=0)
// {
// switch(SMGbuf[i])
// {
// case '0':temp=~t_display[0];break;
// case '1':temp=~t_display[1];break;
// case '2':temp=~t_display[2];break;
// case '3':temp=~t_display[3];break;
// case '4':temp=~t_display[4];break;
// case '5':temp=~t_display[5];break;
// case '6':temp=~t_display[6];break;
// case '7':temp=~t_display[7];break;
// case '8':temp=~t_display[8];break;
// case '9':temp=~t_display[9];break;
// case 'A':temp=~0x77;break;
// case 'B':temp=~0x7C;break;
// case 'P':temp=~0x73;break;
// case '-':temp=~0x40;break;
// default:temp=0xFF;break;
// }
// if(SMGbuf[i+1]=='.')
// {
// temp &=0x7f;
// i++;
// }
// i++;
//
// LED8[j]=temp;
// j++;
//
// }
//}
***********************按键操作
//int aaa=12;
//int longtime=0;
//u8 longkeyflag=0;
//u8 key10ms=0;
//u8 key10msflag=0;
//u8 keyRead1(void)
//{
// u8 keyx=0;
// if(P30==0)keyx=7;
// else if(P31==0)keyx=6;
// else if(P32==0)keyx=5;
// else if(P33==0)keyx=4;
// return keyx;
//}
//u8 keyRead4(void) //开发板
//{
// u8 keyx=0;
//
// P44=0;P42=1;P35=1;P34=1;
// if(P30==0)keyx=7;
// else if(P31==0)keyx=6;
// else if(P32==0)keyx=5;
// else if(P33==0)keyx=4;
//
// P44=1;P42=0;P35=1;P34=1;
// if(P30==0)keyx=11;
// else if(P31==0)keyx=10;
// else if(P32==0)keyx=9;
// else if(P33==0)keyx=8;
//
// P44=1;P42=1;P35=0;P34=1;
// if(P30==0)keyx=15;
// else if(P31==0)keyx=14;
// else if(P32==0)keyx=13;
// else if(P33==0)keyx=12;
//
// P44=1;P42=1;P35=1;P34=0;
// if(P30==0)keyx=19;
// else if(P31==0)keyx=18;
// else if(P32==0)keyx=17;
// else if(P33==0)keyx=16;
//
// return keyx;
//}
//u8 keyRead40(void) //仿真的,没有P4
//{
// u8 keyx=0;
//
// P24=0;P22=1;P35=1;P34=1;
// if(P30==0)keyx=7;
// else if(P31==0)keyx=6;
// else if(P32==0)keyx=5;
// else if(P33==0)keyx=4;
//
// P24=1;P22=0;P35=1;P34=1;
// if(P30==0)keyx=11;
// else if(P31==0)keyx=10;
// else if(P32==0)keyx=9;
// else if(P33==0)keyx=8;
//
// P24=1;P22=1;P35=0;P34=1;
// if(P30==0)keyx=15;
// else if(P31==0)keyx=14;
// else if(P32==0)keyx=13;
// else if(P33==0)keyx=12;
//
// P24=1;P22=1;P35=1;P34=0;
// if(P30==0)keyx=19;
// else if(P31==0)keyx=18;
// else if(P32==0)keyx=17;
// else if(P33==0)keyx=16;
//
// return keyx;
//}
//void KeyProc()
//{
// u8 keydown;
// u8 keyup;
// u8 keyx;
// u8 keyold;
//
// if(key10msflag==1)
// {
// key10msflag=0;
// }
// else return;
// keyx=keyRead1();//仿真
// //keyx=keyRead40();//仿真
// // keyx=keyRead4();//开发板
// keydown = keyx&(keyold^keyx);
// keyup =~keyx&(keyold^keyx);
// keyold=keyx;
//
// if(keydown)
// {
// longtime=0;
if(keydown==7)aaa=aaa+10;
if(keydown==6)aaa=aaa-10;
sprintf(SMGbuf,"PPPPPP%2d",(unsigned int)aaa);
SMGconv();
// }
// if(keyup)
// {
// if(longkeyflag==0)
// {
// if(keyup==7)aaa=aaa+10;
// if(keyup==6)aaa=aaa-10;
sprintf(SMGbuf,"PPPPPP%2d",(unsigned int)aaa);
SMGconv();
// }
// else longkeyflag=0;
//
//
sprintf(SMGbuf,"AAAAAA%2d",(unsigned int)keyup);
SMGconv();
// }
//
// if(keyold &&(longtime>1000))
// {
// longtime=0;
// longkeyflag=1;
// if(keyold==7)aaa=aaa+1;
// if(keyold==6)aaa=aaa-1;
// sprintf(SMGbuf,"BBBBBB%2d",(unsigned int)aaa+20);
// SMGconv();
// }
//
//}
//float wendu=12.56;
//int sec=12;
//int cnt1ms=0;
///* define constants */
//#define FOSC 11059200L
//#define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode
///********************** Timer0 1ms中断函数 ************************/
//void timer0 (void) interrupt 1
//{
// TL0 = T1MS; //仿真软件的传统51单片机需要重新设置定时初值
// TH0 = T1MS>>8; //设置定时初值
// // B_1ms = 1; //1ms标志
//
// cnt1ms++;
// key10ms++;
// longtime++;
// if(key10ms==10)
// {
// key10msflag=1;
// key10ms=0;
// }
//
// if(cnt1ms==1000) //边界处理
// {
// cnt1ms=0;
// sec++;
// if(sec==59)sec=0;
//
//
// }
//
// if(cnt1ms%300==0) //1ms的倍数
// {
wendu+=0.01;
if(wendu>25.5)
wendu=5.2;
// }
//
//
// if(cnt1ms%20==0) //1ms的倍数
// {
sprintf(SMGbuf,"PPPPP%03d",(unsigned int)sec);
SMGconv();
sprintf(SMGbuf,"P-AB%5.2f",wendu);
SMGconv();
//
// KeyProc();//20ms读取一次按键
// }
// if(cnt1ms%1==0) //1ms的倍数
// {
// DisplayScan(); //1ms扫描显示一位
// }
//}
//void Delay125us() //@11.0592MHz
//{
// unsigned char i, j;
// _nop_();
// _nop_();
// i = 2;
// j = 84;
// do
// {
// while (--j);
// } while (--i);
//}
********************************************************main
//void main()
//{
// int i;
//
// LEDdis(0xff);//开机关闭LED灯
// ULNdis(0x00);//开机关闭继电器和蜂鸣器
// sprintf(SMGbuf," ");//熄灭数码管
// SMGconv();
// AUXR &= 0x7F; //定时器时钟12T模式
// //TMOD &= 0xF0; //开发板设置定时器模式
// TMOD |= 0x01; //仿真Proteus设置定时器模式
// TL0 = T1MS; //设置定时初值
// TH0 = T1MS>>8; //设置定时初值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
// ET0=1;//定时器0中断
// EA=1;//单片机总中断
//
//
// while(1)
// {
// for(i=0;i<8;i++)
// {
//
// }
// }
//
//}
#include <stc15.h>
#include "intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
unsigned char tab[8]={11,11,11,11,11,11,11,11};
unsigned int distance=0;
unsigned int dis;
sbit TX=P1^0;//发送
sbit RX=P1^1;//接收
bit flag_wave=0;
void Delay12us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 30;
while (--i);
}
void HC_138(unsigned char m)
{
switch(m)
{
case(4):P2|=0X80;P2&=0X9F;break;
case(5):P2|=0XA0;P2&=0XBF;break;
case(6):P2|=0XC0;P2&=0XDF;break;
case(7):P2|=0XE0;P2&=0XFF;break;
}
}
void allinit()
{
HC_138(4);P0=0xff;
HC_138(5);P0=0x00;
HC_138(6);P0=0x00;
HC_138(7);P0=0xff;
}
void time0init()///定时器0 /
{
// TMOD|=0X01;
// TH0=(65536-1000)/256;
// TL0=(65536-1000)%256;
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
EA=1;
TR0=1;
ET0=1;
}
void time1init()//定时器1
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TF1=0;
TH1=0;
TL1=0;
TR1=0;
}
void display()
{
static int i=0;
HC_138(6);
P0=wei[i];P0=wei[i];P0=wei[i];P0=wei[i];P0=wei[i];
P0=wei[i];P0=wei[i];P0=wei[i];P0=wei[i];P0=wei[i];
P0=wei[i];P0=wei[i];P0=wei[i];P0=wei[i];P0=wei[i];
P0=wei[i];P0=wei[i];P0=wei[i];P0=wei[i];P0=wei[i];
HC_138(7);
P0=duan[tab[i]]; P0=duan[tab[i]]; P0=duan[tab[i]];
P0=duan[tab[i]]; P0=duan[tab[i]]; P0=duan[tab[i]];
P0=duan[tab[i]]; P0=duan[tab[i]]; P0=duan[tab[i]];
P0=duan[tab[i]]; P0=duan[tab[i]]; P0=duan[tab[i]];
i++;
if(i==8)i=0;
}
void time0() interrupt 1
{
static int i=0,m=0;
// TH0=(65535-1000)/256;
// TL0=(65536-1000)%256;
display();
m++;
if(m==500)
{
m=0;
flag_wave=1;
}
}
void send_wave()
{
unsigned char i=8;
while(i--)
{
TX=1;
//somenop;somenop;somenop;somenop;somenop;
Delay12us();
TX=0;
//somenop;somenop;somenop;somenop;somenop;
Delay12us();
}
}
unsigned int get_distance()
{
TH1=0;
TL1=0;
send_wave();
TR1=1;
while((RX==1)&(TF1==0));
TR1=0;
if(TF1==1)
{
distance=999;
TF1=0;
}
if(RX==0)
{
//100 1.7
distance=(((TH1<<8)|TL1)*0.017);
RX=1;
}
return distance;
}
void main()
{
allinit();
time0init();
time1init();
while(1)
{
if(flag_wave==1)
{
dis=get_distance();
flag_wave=0;
}
tab[0]=dis/100;
tab[1]=dis%100/10;
tab[2]=dis%10;
}
}
超声波问题。
数码管问题,不知道为什么,需要消隐,传输数据之后,需要等待多几个毫秒才行,不知道是不是芯片的问题,74HC573芯片,或者是74HC2,74HC138的问题。
导致数据传输不行。不同板子不太一样。奇怪。