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> #define uchar unsigned char #define uint unsigned int sbit DS = P2^1; sbit R_CLK = P2^2; sbit S_CLK = P2^0; sbit LED = P2^3; sbit BUZZER = P2^6; uchar place_cnt = 0; bit updat = 0; uint cnt = 0; uchar bt = 0; uchar score1 = 0; uchar score2 = 0; uchar match = 0; uchar soud = 0; uchar cont = 0; uchar code table[] = { 0x3f, 0x06, 0x5b, 0x4f, // 0,1,2,3 0x66, 0x6d, 0x7d, 0x07, // 4,5,6,7 0x7f, 0x6f, 0x77, 0x07, // 8,9,A,B 0x39, 0x5e, 0x79, 0x71, // C,D,E,F 0x40 // ?? }; uchar number; uchar KeyValue = 0; // ??????????? bit confirm_mode = 0; // 0:????, 1:?????? uchar pending_team = 0; // 0:A?, 1:B? uchar pending_points = 0; // ?????? uchar pending_key = 0; // ??????? uint timeout_cnt = 0; // ????? void send595(uchar dat) { uchar i; for(i = 0; i < 8; i++) { if((dat << i) & 0x80) DS = 1; else DS = 0; S_CLK = 0; S_CLK = 1; } } void out595(void) { R_CLK = 0; R_CLK = 1; } void vision(uchar dat, uchar pos) { send595(pos); send595(~table[dat]); out595(); } void Timer_init(void) { TMOD = 0x11; // ???0?1??????1 TH0 = (65535 - 60000) / 256; // 60ms?? TL0 = (65535 - 60000) % 256; TR0 = 1; // ?????0 ET0 = 1; // ?????0?? EA = 1; // ????? } void timer0() interrupt 1 { TH0 = (65535 - 60000) / 256; // ??60ms?? TL0 = (65535 - 60000) % 256; updat = 1; // ???????? // ???? if(confirm_mode) { timeout_cnt++; if(timeout_cnt >= 33) { // ?2??? (33*60ms=1980ms) timeout_cnt = 0; confirm_mode = 0; LED = 1; // ??LED } } } void delay(uint i) { uint j, k; for(j = 0; j < i; j++) { for(k = 0; k < 120; k++); } } // ??????(??????) void handle_key(uchar key) { // ??????????? if(key == 12 || key == 14) { // A???B?? if(key == 12) score1 = 0; // A?? if(key == 14) score2 = 0; // B?? confirm_mode = 0; LED = 1; // ??LED return; } if(confirm_mode) { // ??????? if(key == pending_key) { // ?????? if(pending_team == 0) { // A? if(score1 + pending_points <= 99) { score1 += pending_points; } else { score1 = 99; } } else { // B? if(score2 + pending_points <= 99) { score2 += pending_points; } else { score2 = 99; } } confirm_mode = 0; LED = 1; // ??LED timeout_cnt = 0; } else { // ?????????,??????? confirm_mode = 0; LED = 1; // ??LED timeout_cnt = 0; } } else { // ??????? switch(key) { case 0: // A+1 pending_key = 0; pending_points = 1; pending_team = 0; confirm_mode = 1; LED = 0; // ??LED timeout_cnt = 0; break; case 4: // A+2 pending_key = 4; pending_points = 2; pending_team = 0; confirm_mode = 1; LED = 0; // ??LED timeout_cnt = 0; break; case 8: // A+3 pending_key = 8; pending_points = 3; pending_team = 0; confirm_mode = 1; LED = 0; // ??LED timeout_cnt = 0; break; case 2: // B+1 pending_key = 2; pending_points = 1; pending_team = 1; confirm_mode = 1; LED = 0; // ??LED timeout_cnt = 0; break; case 6: // B+2 pending_key = 6; pending_points = 2; pending_team = 1; confirm_mode = 1; LED = 0; // ??LED timeout_cnt = 0; break; case 10: // B+3 pending_key = 10; pending_points = 3; pending_team = 1; confirm_mode = 1; LED = 0; // ??LED timeout_cnt = 0; break; // ???????? case 1: match = match + 10; break; case 3: match = match + 1; break; case 5: match = match % 10; break; case 7: match = match / 10 * 10; break; case 9: soud = 1; break; case 13: soud = 0; break; } } } void ketscan() { P1 = 0xF0; if(P1 != 0xF0) { delay(10); // ?? if(P1 != 0xF0) { bt++; } if(bt == 2) { bt = 0; switch(P1) { case 0xE0: KeyValue = 0; break; case 0xD0: KeyValue = 1; break; case 0xB0: KeyValue = 2; break; case 0x70: KeyValue = 3; break; } P1 = 0x0f; switch(P1) { case 0x0e: KeyValue = KeyValue; break; case 0x0D: KeyValue = KeyValue + 4; break; case 0x0b: KeyValue = KeyValue + 8; break; case 0x07: KeyValue = KeyValue + 12; break; } // ??????(??????) handle_key(KeyValue); while(P1 != 0x0f) { // ?????? } } } } void main(void) { Timer_init(); LED = 1; // ???LED?? while(1) { if(updat == 1) { updat = 0; if(place_cnt < 7) { place_cnt++; } else { place_cnt = 0; } switch(place_cnt) { case 0: vision(score1 / 10 % 10, 0x01); break; // A??? case 1: vision(score1 % 10, 0x02); break; // A??? case 2: vision(16, 0x04); break; // ??? case 3: vision(match / 10 % 10, 0x08); break; // ?????? case 4: vision(match % 10, 0x10); break; // ?????? case 5: vision(16, 0x20); break; // ??? case 6: vision(score2 / 10 % 10, 0x40); break; // B??? case 7: vision(score2 % 10, 0x80); break; // B??? } } ketscan(); } }数码管数据一直闪 修改程序 使数码管稳定显示 其他地方程序不变
06-18
#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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值