📄 w79e201.c
字号:
#include <w79e201.h>
#include "at24x.h"
#include <intrins.h>
#include <stdio.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define uchar unsigned char
#define uint unsigned int
uint8 led[2];
//led code 共阳极 0 1 2 3 4 5 6 7 8 9 a b c d e f 灭 高位先出 bit顺序 h,g,f,e,d,c,b,a : Q1--a.....Q8--h
uint8 code tab[17] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0x0a,0x86,0x8e,0xff};
uchar basetime,sec;
sbit LED_CLK = P3^5; //LED串行显示时钟
sbit LED_DATA = P3^4; //LED串行显示数据
sbit relay = P2^5;
uchar tx_buff[18];
uchar rx_buff[18];
uchar adc_save;
uchar Rxtemp;
bit MYTI;
#define nop() _nop_();_nop_();_nop_();_nop_();
void init_cpu(void);
uint8 HexBcd(uint8 h);
void Dispv(v);
void Display(void);
void Dis_key(void);
uint Adc_test(void);
uchar key_scan(void);
void delay(unsigned char i);
void myputchar(uchar c);
void trace(uchar *str,uchar len);
void ADC_Select(ADC_C);
void ADC_EN(void);
void ADC_DIS(void);
void Disptime(t);
uchar convert2(uint adc_r);
//串口中断程序
void UART_isr(void) interrupt 4
{
if(RI)
{
RI = 0;
Rxtemp = SBUF;
SBUF = Rxtemp;
return;
}
if(TI)
{
TI = 0;
MYTI = 1;
}
}
uchar temp_s[2];
#define HIGH_TEMP 70
#define LOW_TEMP 30
bit run; //=1,运行,不能设置
void main(void)
{
uint i;
uchar aa;
uchar key,n,m;
uchar key_value;
uchar wendu;uint ad_data;
init_cpu();
// P0=0x00;
// for(i=0;i<0xfffe;i++);
// for(i=0;i<0xfffe;i++);
// P0=0xff;
// for(i=0;i<0xfffe;i++);
// aa = 0x01;
// key = 1;
// key_value = 1;
sec = 0;
m = 1;
read64c(0x0,1,temp_s);
if((temp_s[0]>25)&&(temp_s[0]<70))
{
Dispv(temp_s[0]);
}
else
{
temp_s[0] = 50;
Dispv(temp_s[0]);
}
run = 0;
for(;;)
{
aa = aa << 1;
if(aa==0) aa = 0x01;
P0=(~aa);
for(n=0;n<(m+(m-1)*5);n++)
{for(i=0;i<0x0ffe;i++);}
if((sec >= 1)&&(run == 1))
{
sec = 0;
ad_data = Adc_test();
if(ad_data != 0x3ff)
{
wendu = convert2(ad_data);
Dispv(wendu);
}
else
{
wendu = 99;
Dispv(wendu);
}
if(wendu > temp_s[0])
{
relay = 1;
m = 3;
}
if(wendu <= (temp_s[0]-3))
{
relay = 0;
m = 1;
}
}
if(run == 0)
{
n = key;
key = key_scan(); //测试键盘
if(key != 0xff)
{
if(key == 2)
{
temp_s[0]++;
if(temp_s[0] > HIGH_TEMP)
temp_s[0] = LOW_TEMP;
Dispv(temp_s[0]);
sec = 0;
}
else if(key == 1)
{
temp_s[0]--;
if(temp_s[0] < LOW_TEMP)
temp_s[0] = HIGH_TEMP;
Dispv(temp_s[0]);
sec = 0;
}
else if(key == 3)
{
write64c(0x0,1,temp_s);
}
else if(key == 4)
{
run = 1;
}
}
while(key_scan()!=0xff);
}
}
}
void init_cpu(void)
{
TMOD = 0x21;
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TH1 = 0xfd; /* TH1: reload value for 9600 baud @ 11.0592MHz */
TL1 = 0xfd;
TR1 = 1; //T1 timer run
ES = 1; //uart interrupt enable
EA = 1; //all interrupt enable
P1 = 0xff;
C_T2 = 0;
TL2 = 0x01;
TH2 = 0x4e;
RCAP2L = 0x01;
RCAP2H = 0x4e;
TR2 = 1;
ET2 = 1;
}
void Dispv(v)
{
uint8 temp1;
temp1 = HexBcd(v);
led[0] = (temp1&0x0f);
led[1] = (temp1&0xf0)>>4;
Display();
}
void Display(void)
{
uint8 j;
uint8 temp;
temp = led[0];
temp = tab[temp];
for(j=0;j<8;j++)
{
LED_DATA = (temp&0x80);
nop();
LED_CLK = 0;
nop();
temp = temp << 1;
LED_CLK = 1;
nop();
}
temp = led[1];
temp = tab[temp];//&0x7f;
for(j=0;j<8;j++)
{
LED_DATA = (temp&0x80);
nop();
LED_CLK = 0;
nop();
temp = temp << 1;
LED_CLK = 1;
nop();
}
}
void Dis_key(void)
{
uint8 j;
uint8 temp;
adc_save = 0xff;
temp = led[0];
temp = tab[temp];
for(j=0;j<8;j++)
{
LED_DATA = (temp&0x80);
//nop();
LED_CLK = 0;
//nop();
temp = temp << 1;
LED_CLK = 1;
//nop();
}
temp = led[1];
temp = tab[temp];
for(j=0;j<8;j++)
{
LED_DATA = (temp&0x80);
//nop();
LED_CLK = 0;
//nop();
temp = temp << 1;
LED_CLK = 1;
//nop();
}
}
uint8 HexBcd(uint8 h)
{
uint8 b;
if(h > 99) return 0x99;
b=h/10*0x10 + h%10;
return b;
}
//delay 1002*i instruction period
//void delay(unsigned char i)
//{
// unsigned char j;
// i=i*2;
// for(;i>0;i--)
// {
// j = 246;
// while(--j);
// }
//}
void trace(uchar *str,uchar len)
{
uint i;
for(i=0;i<len;i++)
{
myputchar(*str);
str++;
}
}
void myputchar(uchar c)
{
ES = 0;
SBUF = c;
while (TI == 0);
TI = 0;
ES = 1;
}
uint Adc_test(void)
{
uchar adc_h,adc_l;
uint adc_data;
ADC_Select(0); //select channel
ADC_EN(); //enable adc
ADCCON = ADCCON | 0x08; //start adc
while(!(ADCCON & 0x10));//wait adc finish
adc_h = ADCH;
ADCCON = ADCCON & 0xF7; //DISABLE adc
adc_l = ADCCON;
ADC_DIS();
adc_l = adc_l>>6;
adc_data = adc_h;
adc_data = adc_data<<2;
adc_data = adc_data | adc_l;
return adc_data;
}
uchar key_scan(void)
{
uchar adc_h,adc_l;
uint adc_data;
ADC_Select(1); //select channel
ADC_EN(); //enable adc
ADCCON = ADCCON | 0x08; //start adc
while(!(ADCCON & 0x10));//wait adc finish
adc_h = ADCH;
ADCCON = ADCCON & 0xF7; //DISABLE adc
adc_l = ADCCON;
ADC_DIS();
adc_l = adc_l>>6;
adc_data = adc_h;
adc_data = adc_data<<2;
adc_data = adc_data | adc_l;
tx_buff[0] = (uchar)adc_data;
//trace(tx_buff,1);
if((tx_buff[0]>0x06)&&(tx_buff[0]<0x0c))
{
led[0] = 1;
led[1] = 0x10;
//Dis_key();
return 1;
}
if((tx_buff[0]>0x10)&&(tx_buff[0]<0x17))
{
led[0] = 2;
led[1] = 0x10;
//Dis_key();
return 2;
}
if((tx_buff[0]>0x2e)&&(tx_buff[0]<0x36))
{
led[0] = 3;
led[1] = 0x10;
//Dis_key();
return 3;
}
if((tx_buff[0]>0x5e)&&(tx_buff[0]<0x66))
{
led[0] = 4;
led[1] = 0x10;
//Dis_key();
return 4;
}
return 0xff;
}
void ADC_Select(ADC_C)
{
ADCCON = 0x00;
ADCCON = ADC_C;
}
void ADC_EN(void)
{
ADCCEN = 0;
}
void ADC_DIS(void)
{
ADCCEN = 1;
}
/**********************************************************/
//TIMER2中断服务程序:
//每50毫秒中断一次,。
/**********************************************************/
void timer2(void) interrupt 5 using 2
{
//uchar i;
//TL0 = 0x01;
//TH0 = 0x4e; //补偿6us
TF2 = 0;
if(19 != basetime)
{
basetime++;
return;
}
basetime = 0;
if(29 != sec) //30 sec//1分钟
{
sec++;
return;
}
else
{
run = 1;
sec = 0;
// OneMin = 1; //每隔1分钟设定主动上发,看PC端软件是否正常
// min++;
// min10++;
}
}
//void Disptime(t)
//{
// uint8 temp1;uint8 j;
// temp1 = HexBcd(t);
// led[0] = (temp1&0x0f);
// led[1] = (temp1&0xf0)>>4;
// temp1 = led[0];
// temp1 = tab[temp1];
// for(j=0;j<8;j++)
// {
// LED_DATA = (temp1&0x80);
// nop();
// LED_CLK = 0;
// nop();
// temp1 = temp1 << 1;
// LED_CLK = 1;
// nop();
// }
// temp1 = led[1];
// temp1 = tab[temp1];
// for(j=0;j<8;j++)
// {
// LED_DATA = (temp1&0x80);
// nop();
// LED_CLK = 0;
// nop();
// temp1 = temp1 << 1;
// LED_CLK = 1;
// nop();
// }
//}
uchar convert2(uint adc_r)
{
uint idata buffer;
uchar t;
long float code tmp_tab3[]={
//11-20
191.111,182.111,173.555,165.555,157.888,150.666,143.888,137.333,131.111,125.333,
//21-30
119.655,114.355, 109.355, 104.555, 100.000, 95.7555, 91.6155, 87.7255, 84.0155, 80.4855,
//31-40
76.1255, 72.9255, 69.8755, 66.9655, 64.1855, 61.5455, 59.5155, 56.6555, 54.3555, 51.1155,
//41-50
49.5155, 47.0155, 45.1555, 44.2755, 43.5255, 41.8555, 40.2655, 38.7355, 37.2655, 35.8755,
//51-60
34.5355, 33.2555, 32.0255, 30.8455, 29.7255, 28.6455, 27.6555, 26.6155, 25.6555, 24.7455,
//61-70
23.8655, 23.0255, 22.2255, 21.4455, 20.7555, 19.9855, 19.2955, 18.6355, 18.0055, 17.3955,
//71-80
16.8555, 16.2455, 15.7555, 15.1855, 14.6755, 14.1955, 13.7355, 13.2855, 12.8555, 12.4355,
//81-90
12.0455, 11.6555, 12.2855, 10.9255, 10.5855, 10.2555, 9.9265, 9.6165, 9.3185, 9.0355
};
if(adc_r < 1020 && adc_r > 10)
{
t = 0;
buffer = (uint)((100/(100+tmp_tab3[t]))*1024);
while(buffer < adc_r)
{
buffer = (uint)((100/(100+tmp_tab3[t]))*1024);
t++;
}
t = t +11;
}
return (t-1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -