#include <stc15f2k60s2.h> //#include<intrins.h> #define uchar unsigned char #define uint unsigned int uchar tab[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff}; uchar yi,er,san,si,wu,liu,qi,ba; uchar num; void delayms(int ms) {
int i,j; for(i=0;i<ms;i ) for(j=845;j>0;j--); } void Allinit() {
P2=0xA0; P0=0x00; P2=0x80; P0=0xFF; P2=0xC0; P0=0xFF; P2=0xFF; P0=0xFF; } //void allinit(void) //{
// P2|=0XA0; // P2&=0XBF; // P0=0X00;//关闭
蜂鸣器,继电器 // // P2|=0X80; // P2&=0X9F; // P0=0XFF;//关闭LED灯 // // P2|=0XC0;//打开位选573 U8 // P2&=0XDF; // P0=0XFF;//选择所有数码管 // P2|=0XE0;//打开位选573 U7 // P2&=0XFF; // P0=0XFF;//关闭所有数码管 //} void display1(uchar yi,uchar er,uchar san,uchar si) {
P2=0xC0; P0=0x01; P2=0xFF; P0=tab[yi]; delayms(1); P2=0xC0; P0=0x02; P2=0xFF; P0=tab[er]; delayms(1); P2=0xC0; P0=0x04; P2=0xFF; P0=tab[san]; delayms(1); P2=0xC0; P0=0x08; P2=0xFF; P0=tab[si]; delayms(1); } void display2(uchar wu,uchar liu,uchar qi,uchar ba) {
P2=0xC0; P0=0x10; P2=0xFF; P0=tab[wu]; delayms(1); P2=0xC0; P0=0x20; P2=0xFF; P0=tab[liu]; delayms(1); P2=0xC0; P0=0x40; P2=0xFF; P0=tab[qi]; delayms(1); P2=0xC0; P0=0x80; P2=0xFF; P0=tab[ba]; delayms(1); } /*** void keyscan() { if(P30==0) { delayms(5); if(P30==0) { } while(!P30); } else if(P31==0) { delayms(5); if(P31==0) { } while(!P31); } else if(P32==0) { delayms(5); if(P32==0) { } while(!P32); } else if(P33==0) { delayms(5); if(P33==0) { } while(!P33); } } ***/ void keyscan16(void) {
uchar temp; P44=0;P42=1;P3=0X7F; temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
delayms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
temp=P3; switch(temp) {
case 0x7e: num=0; break; case 0x7d: num=1; break; case 0x7b: num=2; break; case 0x77: num=3; break; } while(temp!=0x0f) {
temp=P3; temp=temp&0x0f; } } } P44=1;P42=0;P3=0XBF; temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
delayms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
temp=P3; switch(temp) {
case 0xbe: num=4; break; case 0xbd: num=5; break; case 0xbb: num=6; break; case 0xb7: num=7; break; } while(temp!=0x0f) {
temp=P3; temp=temp&0x0f; } } } P44=1;P42=1;P3=0XDF; temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
delayms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
temp=P3; switch(temp) {
case 0xde: num=8; break; case 0xdd: num=9; break; case 0xdb: num=10; break; case 0xd7: num=11; break; } while(temp!=0x0f) {
temp=P3; temp=temp&0x0f; } } } P44=1;P42=1;P3=0XEF; temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
delayms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
temp=P3; switch(temp) {
case 0xee: num=12; break; case 0xed: num=13; break; case 0xeb: num=14; break; case 0xe7: num=15; break; } while(temp!=0x0f) {
temp=P3; temp=temp&0x0f; } } } } void main(void) {
Allinit(); while(1) {
//keyscan(); keyscan16(); display1(yi,er,san,si); display2(wu,liu,qi,ba); } }
/* 程序说明: 单总线驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台(外部
晶振12MHz) STC89C52RC单片机 日 期: 2011-8-9 */
#include "reg52.h"
sbit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
while(t--);
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
//1. 头文件修改(#include <stc15f2k60s2.h>,#include "onewire.h")
//2. 所有调用Delay_OneWire()函数内地参数后面加个0(扩大十倍)
//3. 编写获取温度地函数Tempget() (数值为整数)
unsigned char Tempget(void)
{
unsigned char low,high,temp;
init_ds18b20();
Write_DS18B20(0XCC);
Write_DS18B20(0X44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0XCC);
Write_DS18B20(0XBE);
low=Read_DS18B20();
high=Read_DS18B20();
temp=high<<4;
temp|=(low>>4);
return temp;
}
//4.温度含小数点的情况
long Tempget(void) //(返回为温度值*10000)25.0625
{
long high,low,temp;
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0xBE);
Delay_OneWire(200);
low=Read_DS18B20();
high=Read_DS18B20();
temp=((high&0x0F)<<8)|low;
temp=temp*625;
return temp;
}
//4.onewire.h中添加 unsigned char Tempget(void);主函数头文件调用
/* 程序说明: DS1302驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz 日 期: 2011-8-9 */
#include <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
//1. 头文件修改
//2. 每一组__nop__();函数增加为8到10个
//3. 改写写入函数Write_Ds1302_Byte (十进制转十六进制)
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_();
SCK=0; _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_();
RST=1; _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_();
Write_Ds1302(address);
Write_Ds1302((dat/10<<4)|(dat%10));
RST=0;
}
//4.改写读取函数Read_Ds1302_Byte (十六进制转十进制)
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,dat1,dat2,temp=0x00;
RST=0; _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_();
SCK=0; _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_();
RST=1; _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_
标签: 200继电器输出6es71347d计数继电器16位继电器驱动板16l1