x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化
失败
delay(20); return 0; }
/*************************************************/ /* 读字节子函数 */ /*************************************************/ ReadOneChar(void) {
uchar i = 0; uchar dat = 0; for (i=8;i>0;i--) {
DQ = 0; // 给脉冲信号 dat>>=1; // 数据右移一位 DQ = 1; // 给脉冲信号 if(DQ) // DQ为1 dat|=0x80; // 读出数据 delay(4); // 延时 }
return(dat); }
/*************************************************/ /* 写字节子函数 */ /*************************************************/ WriteOneChar(unsigned char dat) {
uchar i = 0;
for (i=8; i>0; i--) {
DQ = 0;
DQ = dat&0x01; //写入一位数据 delay(5); DQ = 1;
dat>>=1; //右移一位数据 } return 0; }
/******************************************/ /* 发送温度转换命令 */ /******************************************/
void tmpchange(void) // DS18B20 begin change {
Init_DS18B20(); // 初始化DS18B20 delay(200); // 延时
WriteOneChar(0xcc); // 跳过序列号命令 WriteOneChar(0x44); // 发送温度转换命令 }
/******************************************/ /* 读出温度函数 */ /******************************************/ uint tmp() //get the temperature {
// float tt;
Init_DS18B20(); // 初始化ds18b2子函数 delay(1);
WriteOneChar(0xcc); // 跳过ROM命令 WriteOneChar(0xbe); // 发送读取数据命令 temp_data[0]=ReadOneChar(); // 连续读两个字节数据 temp_data[1]=ReadOneChar(); temp=temp_data[1];
temp<<=8; temp=temp|temp_data[0]; // 两字节合成一个整型变量。 return temp; // 返回温度值 }
/******************************************/ /* 温度数据显示处理函数 */ /******************************************/ void tem_deal(uint tem) {
/*************温度数据处理*****************/
if(tem>6348) // 温度值正负判断 {tem=65536-tem;flag1=1;} // 负温度求补码,标志位置1 Dis_play[4]=tem&0x0f; // 取小数部分的值 Dis_play[0]=ditab[Dis_play[4]]; // 存入小数部分显示值
Dis_play[4]=tem>>4; // 取中间八位,即整数部分的值 Dis_play[3]=Dis_play[4]/100; // 取百位数据暂存 Dis_play[1]=Dis_play[4]0; // 取后两位数据暂存 Dis_play[2]=Dis_play[1]/10; // 取十位数据暂存 Dis_play[1]=Dis_play[1]; // 取个位数据暂存 if(!Dis_play[3]) // 最高位为0都不显示 {
Dis_play[3]=0x0a; // 先判断百位是否为0 if(!Dis_play[2])
{
Dis_play[2]=0x0a; // 再判断十位是否为0 }}
if(flag1) {
Dis_play[3]=0x0b; // 为负数时,最高位显示 \ }}
/******************************************/ /* 温度数据显示 */ /******************************************/ void display() {
char k;
for(k=0;k<4;k++) //4位LED扫描控制 { Disdata=table[Dis_play[k]]; //数据显示 if (k==1){DIN=0;} //小数点显示 discan=scan_con[k]; //位选 delay(90); //延时 discan=0x0; } }、
/************************************** 键盘程序
****************************************/ #include
//*** 变量及I/O口定义 *** unsigned char digit[5];
unsigned char key_number, j, k; unsigned int tmr;
unsigned long wait_cnter; sbit cs=P1^4; // cs at P1.4 sbit clk=P1^5; // clk 连接于 P1.5 sbit dat=P1^2; // dat 连接于 P1.2 sbit key=P1^3; // key 连接于 P1.3 //****** HD7279A 指令 ******
#define CMD_RESET 0xa4 #define CMD_TEST 0xbf #define DECODE0 0x80 #define DECODE1 0xc8 #define CMD_READ 0x15 #define UNDECODE 0x90 #define RTL_CYCLE 0xa3 #define RTR_CYCLE 0xa2 #define RTL_UNCYL 0xa1 #define RTR_UNCYL 0xa0 #define ACTCTL 0x98 #define SEGON 0xe0 #define SEGOFF 0xc0 #define BLINKCTL 0x88 //*** 门控主程序 *** main() { while (1) { for (tmr=0;tmr<0x2000;tmr++); // 上电延时 send_byte(CMD_RESET); // 复位HD7279A //****************************************** // 测试指令演示
//****************************************** send_byte(CMD_TEST); // 测试指令 for (j=0;j<3;j++) // 延时约3秒 { delay10ms(100); } send_byte(CMD_RESET); // 清除显示 //********************************************** // 闪烁指令及键盘接口测试
// 将用户按键的键码显示出来, 如果10秒内无按键 // 或按S0键即进入下一步演示
//********************************************** wait_cnter=0; key_number=0xff; write7279(BLINKCTL,0xfc); // 第1、2两位设为闪烁显示 write7279(UNDECODE,0X08); // 在第1位显示下划线'_' write7279(UNDECODE+1,0x08); // 在第2位显示下划线'_' do { if (!key) // 如果有键按下 {
相关推荐: