uchar a=2,b=254;a-b=?

uchar a=2,b=254;

a-b=4;


254=-2;  -(-2)=+2;

255=-1; +1=-255

#include <reg51.h> #include <stdio.h> #define uint unsigned int #define uchar unsigned char //LCD,control pins sbit lcd_rs = P2^3; sbit lcd_rw = P2^4; sbit lcd_e = P2^5; //ADC0808 control pins sbit adadd_a = P2^0; sbit adadd_b = P2^1; sbit adadd_c = P2^2; sbit ad_ale = P2^6; sbit ad_start = P2^7; sbit ad_eoc = P3^0; sbit ad_oe = P3^1; //button,model switch sbit button = P3^2; //range #define RANGE1 6.0 // IN1 channel range 6V #define RANGE2 10.0 // IN2 channel range 12V #define RANGE4 15.0 // IN4 channel range 24V //model #define MODE_AUTO 0 // AUTO #define MODE_MANUAL_6 1 // 6V #define MODE_MANUAL_10 2 // 12V #define MODE_MANUAL_15 3 // 24V uchar code t1[] = {"KZB 3120: "}; uchar code t2[] = {" (0~ V): . V "}; uchar code t1_auto[] = {"DCV Auto: "}; uchar code t1_manual[] = {"DCV Manual:"}; uchar temp[16]; uchar adcValue; uchar mode=MODE_AUTO; void delay(uint ms) { uint i, j; for (i = ms; i > 0; i--) for (j = 110; j > 0; j--); } //LCD control void writelcd_cmd(uchar cmd) { lcd_e = 0; lcd_rs = 0; lcd_rw = 0; delay(1); P0 = cmd; lcd_e = 1; delay(1); lcd_e = 0; } void writelcd_dat(uchar dat) { lcd_e = 0; lcd_rs = 1; lcd_rw = 0; delay(1); P0 = dat; lcd_e = 1; delay(1); lcd_e = 0; } void lcd_init() { writelcd_cmd(0x38); delay(5); writelcd_cmd(0x38); delay(5); writelcd_cmd(0x38); writelcd_cmd(0x08); writelcd_cmd(0x01); writelcd_cmd(0x06); writelcd_cmd(0x0c); writelcd_cmd(0x80); } //read ADC0808 uchar ADC0808_Read(uchar channel) { ad_ale = 0; ad_oe = 0; ad_start = 0; switch (channel) { case 0: adadd_a = 0; adadd_b = 0; adadd_c = 0; break; case 1: adadd_a = 1; adadd_b = 0; adadd_c = 0; break; case 2: adadd_a = 0; adadd_b = 1; adadd_c = 0; break; case 3: adadd_a = 1; adadd_b = 1; adadd_c = 0; break; case 4: adadd_a = 0; adadd_b = 0; adadd_c = 1; break; case 5: adadd_a = 1; adadd_b = 0; adadd_c = 1; break; case 6: adadd_a = 0; adadd_b = 1; adadd_c = 1; break; case 7: adadd_a = 1; adadd_b = 1; adadd_c = 1; break; } ad_ale = 1; delay(5); ad_start = 1; delay(5); ad_ale = 0; delay(5); ad_start = 0; while (ad_eoc != 1); ad_oe = 1; adcValue = P1; ad_oe = 0; return adcValue; } // automatic model void AutoRangeSelect(float *range, uchar *channel) { // Start with 6V range (channel 1) *channel = 1; *range = RANGE1; adcValue = ADC0808_Read(*channel); // If voltage > 5.5V (230/255*6V), switch to 12V range if(adcValue > 230) { *channel = 2; *range = RANGE2; adcValue = ADC0808_Read(*channel); // If voltage > 11V (230/255*12V), switch to 24V range if(adcValue > 240) { *channel = 4; *range = RANGE4; adcValue = ADC0808_Read(*channel); } } } //display to LCD void DisplayVoltage(float range) { uchar i; uint voltage = (uint)((adcValue * range * 100) / 255); // Calculate voltage in centivolts uchar v1 = voltage / 1000; uchar v2 = (voltage % 1000)/100; uchar v3 = (voltage % 100)/10; uchar v4 = voltage % 10; for (i = 0; i < 16; i++) { temp[i] = t2[i]; } // Update range display temp[4] = (uchar)(range / 10) + '0'; temp[5] = (uchar)((uchar)range % 10) + '0'; // Update voltage display temp[8] = v1 + '0'; temp[9] = v2 + '0'; temp[10] = '.'; temp[11] = v3 + '0'; temp[12] = v4 + '0'; // Display to LCD writelcd_cmd(0x80); for (i = 0; i < 10; i++) { writelcd_dat(t1[i]); } writelcd_cmd(0xc0); for (i = 0; i < 16; i++) { writelcd_dat(temp[i]); } } void rest_int0() { lcd_init(); while(button==0); delay(2000); } // button test // ????????? void ScanButton() { static uchar button_state = 1; // ????,1???,0??? static uchar debounce_cnt = 0; // ????? static uint last_press_time = 0; // ??????,?????? uchar i; // ???????????? if (button != button_state) { debounce_cnt++; if (debounce_cnt >= 5) { // 5??????????,?????? button_state = button; debounce_cnt = 0; if (button_state == 0) { // ??????? last_press_time = 0; // ?????? } else { // ??????? // ????(<500ms)????? if (last_press_time < 5) { // ??????:?? -> ??6V -> ??12V -> ??24V -> ?? mode = (mode + 1) % 4; // ???????? writelcd_cmd(0x80); if (mode == MODE_AUTO) { for (i = 0; i < 10; i++) { writelcd_dat(t1_auto[i]); } } else { for (i = 0; i < 10; i++) { writelcd_dat(t1_manual[i]); } } // ?????? writelcd_cmd(0xc0); for (i = 0; i < 16; i++) { writelcd_dat(temp[i]); } // ????????????? delay(500); } } } } else { debounce_cnt = 0; // ????,????? } } //model select void SelectRangeByMode(float *range, uchar *channel) { switch (mode) { case 0: AutoRangeSelect(range, channel); break; case 1: *channel = 1; *range = RANGE1; adcValue = ADC0808_Read(*channel); break; case MODE_MANUAL_10: *channel = 2; *range = RANGE2; adcValue = ADC0808_Read(*channel); break; case MODE_MANUAL_15: *channel = 4; *range = RANGE4; adcValue = ADC0808_Read(*channel); break; } } void main(void) { float range; uchar channel; lcd_init(); if(button==0) { delay(20); if(button==0) rest_int0(); } while (1) { ScanButton(); SelectRangeByMode(&range, &channel); DisplayVoltage(range); delay(20); } }对以上代码的各个模块分别生成流程图、
最新发布
07-08
#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit DQ=P3^7; sbit P2_0=P2^0; sbit k2=P2^2; sbit k4=P2^4; sbit k3=P2^3; uchar timp,F=0; float c; uchar a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; uchar b[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; void delay5(uchar n) { do { _nop_(); _nop_(); _nop_(); n--; } while(n); } void init_DS18B20() { uchar x=0; DQ=0; delay5(120); DQ=1; delay5(16); delay5(80); } uchar readbyte() { uchar i=0; uchar date=0; for(i=8;i>0;i--) { DQ=0; delay5(1); DQ=1; date>>=1; if(DQ) date|=0x80; delay5(11); } return(date); } void writebyte(uchar dat) { uchar i=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; delay5(12); DQ=1; dat>>=1; delay5(5); } } uchar retemp() { uchar a,b,tt; uint t; init_DS18B20(); writebyte(0xCC); writebyte(0x44); init_DS18B20(); writebyte(0xCC); writebyte(0xBE); a=readbyte(); b=readbyte(); t=b; t<<=8; t=t|a; if((t&0xf800)!=0xf800) { F=0; c=t*0.0625; tt=t*0.0625; timp=t*0.625-tt*10; } else { F=1; t=(~t)+1; c=t*0.0625; tt=t*0.0625; timp=t*0.625-tt*10; } return tt; } void main() { uchar i,temp; delay5(1000); while(1) { temp=retemp(); if(c>=25&&F==0) P2_0=0; else P2_0=1; for(i=0;i<15;i++) { k2=1;k3=1;k4=1; if(F==0) P0=a[temp/100]; else P0=a[10]; delay5(1000); // P2=0xfb;//11111011,0xfb k2=0;k3=1;k4=1; P0=a[temp%100/10]; delay5(1000); //P2=0xf7;//11110111,0xf7 k2=1;k3=0;k4=1; P0=b[temp%10]; delay5(1000); //P2=0xf3;//11110011,0xf3 k2=0;k3=0;k4=1; P0=a[timp]; delay5(1000); } if(c>=25&&F==0) P2_0=1; else P2_0=1; } }在这个代码的基础上利用串口把数据发送到电脑上的串口助手
06-01
#include <reg51.h> #include "intrins.h" #define uchar unsigned char #define uint unsigned int #define out P0 #define DATA_PORT P0 // 共享数据总线 sbit SEG_LE = P2^2; // 段选锁存 sbit DIG_LE = P2^3; // 位选锁存 void delay5(uchar); void init_ds18b20(void); uchar readbyte(void); void writebyte(uchar); uchar retemp(void); uchar code seg[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0X80}; // 共阴数码管段码(0-9加小数点) unsigned char code seg_code[11] = { 0x3F, 0x06, 0x5B, 0x4F, // 0-3 0x66, 0x6D, 0x7D, 0x07, // 4-7 0x7F, 0x6F, 0x80 // 8-9 + 小数点(0x80) }; // 位选编码(4位数码管) unsigned char dig_code[4] = {0xFE, 0xFD, 0xFB, 0xF7}; void delay_ms(unsigned int ms) { unsigned int i, j; for(i=0; i<ms; i++) for(j=0; j<120; j++); } void main() { uchar temp; uchar i; unsigned char disp_value[10] = {1,2,3,4,5,6,7,8,9,10,11,12,13}; // 10表示带小数点的0 while(1) { for(i=0; i<4; i++) { temp = retemp(); // 1. 关闭所有位选(防鬼影) DATA_PORT = 0xFF; DIG_LE = 1; DIG_LE = 0; // 2. 发送段选数据 DATA_PORT = seg_code[disp_value[temp]]; SEG_LE = 1; SEG_LE = 0; // 3. 发送位选数据 DATA_PORT = dig_code[i]; DIG_LE = 1; DIG_LE = 0; // 4. 保持显示 delay_ms(4); } } } void delay5(uchar n) { do { _nop_(); _nop_(); _nop_(); n--; } while(n); } /*--------------?????--------------------*/ void init_ds18b20(void) { uchar x=0; DQ =0; delay5(120); DQ =1; delay5(16); delay5(80); } /*--------------???????----------------*/ uchar readbyte(void) { uchar i=0; uchar date=0; for (i=8;i>0;i--) { DQ =0; delay5(1); DQ =1; //15???????? date>>=1; if(DQ) date|=0x80; delay5(11); } return(date); } /*--------------??????------------------*/ void writebyte(uchar dat) { uchar i=0; for(i=8;i>0;i--) { DQ =0; DQ =dat&0x01;//?"1" ?15????? delay5(12); //?"0" ??60?? DQ = 1; dat>>=1; delay5(5); } } /*--------------??????------------------*/ uchar retemp(void) { uchar a,b,tt; uint t; init_ds18b20(); writebyte(0xCC); writebyte(0x44); init_ds18b20(); writebyte(0xCC); writebyte(0xBE); a=readbyte(); b=readbyte(); t=b; t<<=8; t=t|a; tt=t*0.0625; return(tt); }怎么让数码管显示出temp对应的数据,包括小数点
06-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值