СМС контроль помещения на 8 каналов

программа (CVAVR) для управления внешней нагрузкой,включает и отключает нагрузку с помощью смс
для вкл отправляем On12345678 -включаем 8 каналов (можно дополнить для включения +6 каналов порт Д и +
свободные порта А) в ответ получаем смс о включенных каналах,или On5 включаем канал 5.
Для выключения отправляем Of+ номер включаемого канала который нужно выключить
Реакция только на прописанные номера,все остальные смс стираются .
Ну ,а поскольку, контроллерами занимаюсь только второй год, код в программе не ах какой.

Date : 20.09.2010
Author : F4CG
Company : F4CG

Chip type : ATmega16
Clock frequency : 11,059200 MHz

  1. #include <mega16.h>
  2. // 1 Wire Bus functions
  3. #asm
  4. .equ __w1_port=0x1B ;PORTA
  5. .equ __w1_bit=7
  6. #endasm
  7. #include <1wire.h>
  8. // DS1820 Temperature Sensor functions
  9. #include <ds18b20.h>
  10. #asm
  11. .equ __lcd_port=0x15 ;PORTC
  12. #endasm
  13. #include <lcd.h>
  14. #include <io.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <delay.h>
  18. #include <string.h>
  19. #include <math.h>
  20. #define RXB8 1
  21. #define TXB8 0
  22. #define UPE 2
  23. #define OVR 3
  24. #define FE 4
  25. #define UDRE 5
  26. #define RXC 7
  27. #define FRAMING_ERROR (1<<FE)
  28. #define PARITY_ERROR (1<<UPE)
  29. #define DATA_OVERRUN (1<<OVR)
  30. #define DATA_REGISTER_EMPTY (1<<UDRE)
  31. #define RX_COMPLETE (1<<RXC)
  32. #define TX 3
  33. #define RX_BUFFER_SIZE 8
  34.  
  35. unsigned char a=2;
  36. int b;
  37. int tem=0;
  38. int sm=0,ms=0;
  39. char in1=0,in2=0,ini=0;
  40. char rx_buffer[RX_BUFFER_SIZE];
  41. char str1[140];
  42. char srav[16];
  43. char sss=0;
  44. //char disp=0;
  45. char fl=0;
  46. int f=0;
  47. char m,O,L,P,z=0,i=0,N=0;
  48. unsigned long w=0;
  49. char s_s=0,v;
  50. char sms[140];
  51. char sms1[40];
  52. char sms2[50];
  53. char sms3[30];
  54. char stir[]=" ";
  55. flash char str2[]="1234567"; //записать вместо 1234567 номера телефов
  56. flash char str3[]="2134567";
  57. flash char str4[]="1324567";
  58. char text[16];
  59. char text1[32];
  60. char s=0;
  61. char vv=0;
  62. char in=0;
  63. int q,d=0;
  64. #if RX_BUFFER_SIZE<16
  65. unsigned char rx_wr_index,rx_rd_index,rx_counter;
  66. #else
  67. unsigned int rx_wr_index,rx_rd_index,rx_counter;
  68. #endif
  69. bit rx_buffer_overflow;
  70. interrupt [TIM0_OVF] void timer0_ovf_isr(void)
  71. {
  72. TCNT0=0x01;
  73. sm++;
  74. tem++;
  75. if(sm>=305)sm=0;
  76. if(tem==1010)tem=0;
  77. }
  78. interrupt [USART_RXC] void usart_rx_isr(void)
  79. {
  80. char status,data;
  81. status=UCSRA;
  82. data=UDR;
  83. if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  84. {
  85. rx_buffer[rx_wr_index]=data;
  86. if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
  87. if (++rx_counter == RX_BUFFER_SIZE)
  88. {
  89. rx_counter=0;
  90. rx_buffer_overflow=1;
  91. };
  92. };
  93. }
  94. #ifndef _DEBUG_TERMINAL_IO_
  95. #define _ALTERNATE_GETCHAR_
  96. #pragma used+
  97. char getchar(void)
  98. {
  99. char data;
  100. while (rx_counter==0);
  101. data=rx_buffer[rx_rd_index];
  102. if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
  103. #asm("cli")
  104. --rx_counter;
  105. #asm("sei")
  106. return data;
  107. }
  108. #pragma used-
  109. #endif
  110. void LCD (void){
  111. lcd_gotoxy(0,0);
  112. lcd_puts(srav);
  113. lcd_gotoxy(0,1);
  114. lcd_puts(text1);
  115.  
  116.  
  117. }
  118. void LCD1 (void){
  119. lcd_gotoxy(0,0);
  120. lcd_puts(text);
  121. lcd_gotoxy(0,1);
  122. lcd_puts(text1);
  123. }
  124. void obnulenie(void) {
  125. d=in;
  126. m:d++;
  127. str1[d]=0;
  128. if(d<=139)goto m;
  129. d=0;
  130. }
  131. void obnulenie_sms1(void) {
  132. d=v-1;
  133. m:
  134. ++d;
  135. sms1[d]=0;
  136. if(d<=39)goto m;
  137. d=0;
  138. }
  139. void obnul_sms(void){
  140. d=0;
  141. m:
  142. sms[d]=0;
  143. ++d;
  144. if(d<=139)goto m;
  145. d=0;
  146. }
  147. void obnul_sms1(void){
  148. d=0;
  149. m:
  150. sms1[d]=0;
  151. ++d;
  152. if(d<=39)goto m;
  153. d=0;
  154. }
  155. void obnul_sms2(void){
  156. d=0;
  157. m:
  158. sms2[d]=0;
  159. ++d;
  160. if(d<=49)goto m;
  161. d=0;
  162. }
  163. void obnul_str1(void){
  164. d=0;
  165. m:
  166. str1[d]=0;
  167. ++d;
  168. if(d<=139)goto m;
  169. d=0;
  170. }
  171. void obrabotka_sms(void){
  172. q=strlen(sms2);
  173. if(sms2[0]=='O')
  174. {if (sms2[1]=='n')
  175. { f=1;
  176. u1: ++f;
  177. s=sms2[f];
  178. switch (s){
  179. case '1':PORTB.0=1;break;
  180. case '2':PORTB.1=1;break;
  181. case '3':PORTB.2=1;break;
  182. case '4':PORTB.3=1;break;
  183. case '5':PORTB.4=1;break;
  184. case '6':PORTB.5=1;break;
  185. case '7':PORTB.6=1;break;
  186. case '8':PORTB.7=1;break;
  187. //можно дописать 6 каналов порта Д
  188. }
  189. if(f<=q)goto u1;
  190. }
  191. if(sms2[0]=='O')
  192. {if(sms2[1]=='f')
  193. {f=1;
  194. u2: ++f;
  195. s=sms2[f];
  196. switch (s){
  197. case '1':PORTB.0=0;break;
  198. case '2':PORTB.1=0;break;
  199. case '3':PORTB.2=0;break;
  200. case '4':PORTB.3=0;break;
  201. case '5':PORTB.4=0;break;
  202. case '6':PORTB.5=0;break;
  203. case '7':PORTB.6=0;break;
  204. case '8':PORTB.7=0;break;
  205. //и сюда тоже
  206. }
  207. if(f<=q)goto u2;
  208. }
  209. }
  210. }}
  211. void vvod(void){
  212. b++;
  213. sprintf(srav,"%c%c%c%c%c%c%c",str1[27],str1[26],str1[29],str1[28],str1[31],str1[30],str1[33]);
  214. sprintf(text1,"%i%i ",a,in);
  215. switch(b){
  216. case 2: if(strcmpf(srav,str2)==0)a=strcmpf(srav,str2),N=1; break ;
  217. case 8: if(strcmpf(srav,str3)==0)a=strcmpf(srav,str3),N=2; break;
  218. case 14: if(strcmpf(srav,str4)==0)a=strcmpf(srav,str4),N=3;break;
  219. }
  220. if(b>=20)b=0,lcd_clear();
  221. }
  222. void sms_kod(void){
  223. in1=0;in2=0;
  224. m=strlen(sms1);
  225. if(m>0){
  226. r:
  227. if(in1>0)++in2,++in1;;
  228. L=0;
  229. O=sms1[in1];
  230. L=O&0x80;
  231. sms2[in2]=O&0x7F;
  232. ++in1;
  233. ++in2;
  234. if(in1>m)goto i;
  235. O=sms1[in1];
  236. P=0;
  237. P=O&0xC0;
  238. P=P>>6;
  239. O=O<<1 ;
  240. if(L==0)sms2[in2]=(O)&0x7E;
  241. else sms2[in2]=(O|(L>>7))&0x7F;
  242. ++in1;
  243. ++in2;
  244. L=0;
  245. if(in1>m)goto i;
  246. O=sms1[in1];
  247. L=O&0xE0;
  248. L=L>>5;
  249. O=(O&0x1F);
  250. O=O<<2;
  251. if(P==0)sms2[in2]=O&0x7C;
  252. sms2[in2]=O|(P);
  253. ++in1;
  254. ++in2;
  255. if(in1>m)goto i;
  256. O=sms1[in1];
  257. P=0;
  258. P=O&0xF0;
  259. P=P>>4;
  260. O=(O&0x0F);
  261. O=O<<3 ;
  262. if(L==0)sms2[in2]=(O)&0x78;
  263. else sms2[in2]=(O|L)&0x7F;
  264. ++in1;
  265. ++in2;
  266. L=0;
  267. if(in1>m)goto i;
  268. O=sms1[in1];
  269. L=O&0xF8;
  270. L=L>>3;
  271. O=(O&0x07);
  272. O=O<<4;
  273. if(P==0)sms2[in2]=O&0x70;
  274. else sms2[in2]=O|(P);
  275. ++in1;
  276. ++in2;
  277. if(in1>m)goto i;
  278. O=sms1[in1];
  279. P=0;
  280. P=O&0xFC;
  281. P=P>>2;
  282. O=(O&0x03);
  283. O=O<<5 ;
  284. if(L==0)sms2[in2]=(O)&0x60;
  285. else sms2[in2]=(O|L)&0x7F;
  286. ++in1;
  287. ++in2;
  288. L=0;
  289. if(in1>m)goto i;
  290. O=sms1[in1];
  291. L=O&0xFE;
  292. L=L>>1;
  293. O=(O&0x01);
  294. O=O<<6;
  295. if(P==0)sms2[in2]=O&0x40;
  296. else sms2[in2]=O|(P);
  297. ++in2;
  298. sms2[in2]=L&0x7F;
  299. P=0;
  300. if(in1>m)goto i;
  301. if(in1<=m)goto r;
  302. i:};;;
  303. }
  304. void nul(void){
  305. z=0;
  306. a:str1[z]=0;
  307. ++z;
  308. if(z<=s)goto a;
  309. }
  310. void lcd2(void){
  311. lcd_clear();
  312. lcd_gotoxy(0,0);
  313. sprintf(text,"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",str1[0],str1[1],str1[2],str1[3],
  314. str1[4],str1[5],str1[6],str1[7],str1[8],str1[9],str1[10],str1[11],str1[12],str1[13],str1[14],str1[15]);
  315. lcd_puts(text);
  316. lcd_gotoxy(0,1);
  317. sprintf(text1,"%2X %X %c %4c",s,i,N,w);
  318. lcd_puts(text1);
  319. }
  320. void init(void){
  321. UCSRB=(1<<TX);
  322. switch(i){
  323. case 0:printf("ATE0\r\n");delay_us(5);break;
  324. case 1:printf("AT+CNMI=1,1,0,2\r\n"),delay_us(15);break;
  325. case 2:printf("AT+CMGF=0\r\n"),delay_us(15);break;
  326. case 3:printf("AT+CSMS=0\r\n"),delay_us(15);break;
  327. case 4:printf("AT+CMEC=2\r\n"),delay_us(15);break;
  328. case 5:printf("AT+CLCK=CS,0\r\n"),delay_us(15);break;
  329. case 6:printf("ATE0\r\n"),delay_us(15);break;
  330. case 7:printf("AT+CPMS=MT,SM\r\n"),delay_us(15);break;
  331. case 8:printf("AT+CMGD=1\r\n"),delay_us(15);break; //стираем смски 20 шт
  332. case 9:printf("AT+CMGD=2\r\n"),delay_us(15);break;
  333. case 10:printf("AT+CMGD=3\r\n"),delay_us(15);break;
  334. case 11:printf("AT+CMGD=4\r\n"),delay_us(15);break;
  335. case 12:printf("AT+CMGD=5\r\n"),delay_us(15);break;
  336. case 13:printf("AT+CMGD=6\r\n"),delay_us(15);break;
  337. case 14:printf("AT+CMGD=7\r\n"),delay_us(15);break;
  338. case 15:printf("AT+CMGD=8\r\n"),delay_us(15);break;
  339. case 16:printf("AT+CMGD=9\r\n"),delay_us(15);break;
  340. case 17:printf("AT+CMGD=10\r\n"),delay_us(15);break;
  341. case 18:printf("AT+CMGD=11\r\n"),delay_us(15);break;
  342. case 19:printf("AT+CMGD=12\r\n"),delay_us(15);break;
  343. case 20:printf("AT+CMGD=13\r\n"),delay_us(15);break;
  344. case 21:printf("AT+CMGD=14\r\n"),delay_us(15);break;
  345. case 22:printf("AT+CMGD=15\r\n"),delay_us(15);break;
  346. case 23:printf("AT+CMGD=16\r\n"),delay_us(15);break;
  347. case 24:printf("AT+CMGD=17\r\n"),delay_us(15);break;
  348. case 25:printf("AT+CMGD=18\r\n"),delay_us(15);break;
  349. case 26:printf("AT+CMGD=19\r\n"),delay_us(15);break;
  350. case 27:printf("AT+CMGD=20\r\n"),delay_us(15);break;
  351.  
  352. case 33:printf("AT+CMGL=4\r\n"),delay_us(15),i=0;break;
  353. }
  354. delay_us(1);
  355. UCSRB=0x90;
  356. return;
  357. }
  358. void uni(void){
  359. while(ini==0){
  360. TIMSK=0x00;
  361. while(rx_counter){ //ждем прихода
  362. str1[in]=getchar();
  363. if(str1[in]>'\r') in++;
  364. if(in>32)in=0;
  365. w=0,s=0;
  366. }
  367. if(w==0)lcd2();
  368. if(UCSRA<0x80){
  369. s=strlen(str1);
  370. if(str1[s]<=20)s=s-1;
  371. if(str1[s-2]=='O')
  372. {if(str1[s-1]=='K'){i=i+1,in=0,nul(),s=0,delay_ms(100); }}
  373. if(str1[s-4]=='E')
  374. {if(str1[s-3]=='R')
  375. {if(str1[s-2]=='R')
  376. {if(str1[s-1]=='O')
  377. {if(str1[s]=='R') {i=i+1,in=0,nul(),s=0,delay_ms(100); }} }}}
  378. {
  379. if (w==29000)UCSRB=0x88, delay_us(10),init();
  380. if(++w>29002)w=0,obnulenie(),in=0;
  381. if(i>27)i=30,in=0,s=0,ini=2,TIMSK=0x01; }
  382. }
  383. }}
  384. void udal_sms(void){
  385. i=8;
  386. init();
  387. delay_ms(100);
  388. zd:if(i<=27)++i,init();
  389. delay_ms(100);
  390. if(i<=27)goto zd;
  391. if(i>27)i=0;
  392. return;
  393. }
  394. void sms_zakod(void){
  395. char m=0;
  396. char l=0,p=0,var=0;
  397. s_s=0,v=0;vv=0;
  398. in1=0;in2=1;
  399. strcpy(str1,stir);
  400. strcpy(sms3,sms1);
  401. m=strlen(sms1);
  402. if(m>0){
  403. r:
  404. if(in1>0)++in2,++in1,vv++;
  405. L=0;
  406. O=sms1[in1];
  407. L=((sms3[in2]<<7)&0x80);
  408. sms2[vv]=L|O;
  409. in1++,in2++,vv++,L=0,P=0;
  410. if(in2>m)goto i;
  411. O=((sms1[in1]>>1)&0x3F);
  412. L=((sms3[in2]<<6)&0xC0);
  413. sms2[vv]=L|O;
  414. in1++,in2++,vv++,L=0,P=0;
  415. if(in2>m)goto i;
  416. O=((sms1[in1]>>2)&0x1F);
  417. L=((sms3[in2]<<5)&0xE0);
  418. sms2[vv]=L|O;
  419. in1++,in2++,vv++,L=0,P=0;
  420. if(in2>m)goto i;
  421. O=((sms1[in1]>>3)&0x0F);
  422. L=((sms3[in2]<<4)&0xF0);
  423. sms2[vv]=L|O;
  424. in1++,in2++,vv++,L=0,P=0;
  425. if(in2>m)goto i;
  426. O=((sms1[in1]>>4)&0x07);
  427. L=((sms3[in2]<<3)&0xF8);
  428. sms2[vv]=L|O;
  429. in1++,in2++,vv++,L=0,P=0;
  430. if(in2>m)goto i;
  431. O=(sms1[in1]>>5);
  432. L=((sms3[in2]<<2)&0xFC);
  433. sms2[vv]=L|O;
  434. in1++,in2++,vv++,L=0,P=0;
  435. if(in2>m)goto i;
  436. O=(sms1[in1]>>6);
  437. L=((sms3[in2]<<1)&0xFE);
  438. sms2[vv]=L|O;
  439. in1++,in2++;
  440. if(in2>m)goto i;
  441. if(in2<=m)goto r;
  442. i: vv=vv-1;
  443. }
  444. if(vv>0)
  445. {
  446. x:
  447. l=0,p=0;
  448. var=sms2[s_s];
  449. p=sms2[s_s]&0x0F;
  450. l=var>>4;
  451. sms1[v]=l&0x0F;
  452. v++;
  453. sms1[v]=p;
  454. s_s++,v++;
  455. if(s_s>vv)goto y;
  456. if(s_s<=vv)goto x;
  457. y:
  458. if(v>0){
  459. in=0,s_s=0;
  460. a:
  461. switch(sms1[s_s]){
  462. case 0x00:sms[in]=0x30;break;
  463. case 0x01:sms[in]=0x31;break;
  464. case 0x02:sms[in]=0x32;break;
  465. case 0x03:sms[in]=0x33;break;
  466. case 0x04:sms[in]=0x34;break;
  467. case 0x05:sms[in]=0x35;break;
  468. case 0x06:sms[in]=0x36;break;
  469. case 0x07:sms[in]=0x37;break;
  470. case 0x08:sms[in]=0x38;break;
  471. case 0x09:sms[in]=0x39;break;
  472. case 0x0A:sms[in]=0x41;break;
  473. case 0x0B:sms[in]=0x42;break;
  474. case 0x0C:sms[in]=0x43;break;
  475. case 0x0D:sms[in]=0x44;break;
  476. case 0x0E:sms[in]=0x45;break;
  477. case 0x0F:sms[in]=0x46;break;
  478. }
  479. s_s++;
  480. in++;
  481. if(in>v)goto b;
  482. if(in<=v)goto a;
  483. b:s_s=0,v=0,sss=0,in=0,vv=0; }
  484. strcpy(sms2,stir);
  485. P=strlen(sms);
  486. P=P-1;
  487. strncpy(sms2,sms,P);
  488. L=strlen(sms2)/2;
  489. if(L>9)sprintf(sms,"%2d%s",L,sms2);
  490. if(L<=9) sprintf(sms,"0%1d%s",L,sms2);
  491. P=14+L;
  492. ini=3;
  493. }}
  494. void otpravka(void){
  495. in=0;
  496. if(PINB.0==1)sms[in]='31',in++;
  497. if(PINB.1==1)sms[in]='32',in++;
  498. if(PINB.2==1)sms[in]='33',in++;
  499. if(PINB.3==1)sms[in]='34',in++;
  500. if(PINB.4==1)sms[in]='35',in++;
  501. if(PINB.5==1)sms[in]='36',in++;
  502. if(PINB.6==1)sms[in]='37',in++;
  503. if(PINB.7==1)sms[in]='38',in++;
  504. if(PIND.2==1)sms[in]='S',in++;
  505. if(PIND.3==1)sms[in]='G',in++;
  506. if(PIND.4==1)sms[in]='X';
  507. sss=5,in=0;// //
  508. sprintf(text1,"BK%c%c%c%c%c%c%c%c%c%c%с%с%с",sms[0],sms[1],sms[2],sms[3],
  509. sms[4],sms[5],sms[6],sms[7],sms[8],sms[9],sms[10],sms[11],sms[12]);
  510. strcpy(sms1,text1);
  511. if(sss==5) sms_zakod();
  512. while(ini==3){
  513. TIMSK=0x01;
  514. lcd_gotoxy(0,0);
  515. sprintf(text1,"OTPRAVKA SMS=>%i ",N);
  516. lcd_puts(text1);
  517. while(rx_counter){
  518. lcd_clear(); // ждем прихода СМС
  519. str1[in]=getchar();
  520. if(str1[in]=='>')
  521. switch(N){
  522. case 1: UCSRB=(1<<TX),delay_us(5),printf("079__7________F_11000B91_7__nnnnnnFn000000%s\r\n",sms),
  523. delay_us(5),UCSRB=0x90;break; // ? ??
  524. case 2: UCSRB=(1<<TX),delay_us(5),printf("07919781340300F011000B919781nnnnnnFn000000%s\r\n",sms),
  525. delay_us(5),UCSRB=0x90;break;
  526. case 3: UCSRB=(1<<TX),delay_us(5),printf("07919781340300F011000B91_7__nnnnnnFn000000%s\r\n",sms),
  527. delay_us(5),UCSRB=0x90;break; //вместо n вписать номера в последованности
  528. } // str1[27],str1[26],str1[29],str1[28],str1[31],str1[30],str1[33]
  529. if(str1[in]>'\r') in++; // 2 1 4 3 6 5 7
  530. if(in>16)in=0,lcd_clear(); // номер *1234567* мой код 918 вписать свой код вместо *? *
  531. } //вместо _____ вписать № смс центра так же как и номер
  532. if(str1[in-2]=='O')
  533. {if(str1[in-1]=='K'){w=0,N=0,sss=0,i=30,ini=2;
  534. }}
  535. if(sm==300)w++;
  536. if((w==1)&(i==30))i=31,UCSRB=(1<<TX),delay_us(5),printf("AT+CMGS=%2d\r\n",P),UCSRB=0x90,delay_ms(100);
  537. if(w==50)w=0,N=0,sss=0,i=30,ini=2,in=0;
  538. } } // вместо подпрог zakod и otpravka можно включить эту пп(text ы прописать)
  539. // void sms_zakod(void){
  540. // char text3[]="1-kanal,";
  541. // char text4[]="2-rele,\r\n";
  542. // char text5[]="3-rele,";
  543. // char text6[]="4-rele,\r\n";
  544. // char text7[]="5-ili,";
  545. // char text8[]="6-privet,\r\n";
  546. // char text9[]="7-net,";
  547. // char text10[]="8-da,\r\n";
  548. // char text11[]="i td,";
  549. // char text12[]="i td.";
  550. // char text13[]=""; //очень важная штучка,на другом компьютере может быть квадратик,или еще что-то(?)
  551.  
  552. //
  553. // if(N!=0)UCSRB=(1<<TX),delay_us(5),printf("AT+CMGF=1\r\n"),UCSRB=0x90,delay_ms(100);
  554. // sprintf(sms,"T* v dome Bkl:\r\n");
  555. // if(PINB.0==1) strcat(sms,text3);
  556. // if(PINB.1==1) strcat(sms,text4);
  557. // if(PINB.2==1) strcat(sms,text5);
  558. // if(PINB.3==1) strcat(sms,text6);
  559. // if(PINB.4==1) strcat(sms,text7);
  560. // if(PINB.5==1) strcat(sms,text8);
  561. // if(PINB.6==1) strcat(sms,text9);
  562. // if(PINB.7==1) strcat(sms,text10);
  563. // if(PIND.3==1) strcat(sms,text11);
  564. // if(PIND.4==1) strcat(sms,text12);
  565. // strcat(sms,text13);
  566. // ini=3;
  567. // switch(N){
  568. // case 1: UCSRB=(1<<TX),delay_us(5),printf("AT+CMGW=+79181234567\r\n"),//прописать номера телефонов
  569. // delay_ms(200),printf("%s\r\n",sms),UCSRB=0x90;break;
  570. // case 2: UCSRB=(1<<TX),delay_us(5),printf("AT+CMGW=+_____\r\n"),
  571. // delay_ms(200),printf("%s\r\n",sms),UCSRB=0x90;break;
  572. // case 3: UCSRB=(1<<TX),delay_us(5),printf("AT+CMGW=+____\r\n"),
  573. // delay_ms(200),printf("%s\r\n",sms),UCSRB=0x90;break;
  574. // }
  575. // }
  576.  
  577. void udl_obr(void){ //обработка и удаление
  578. obrabotka_sms();
  579. TIMSK=0x01;
  580. if(sm==300)ms++;
  581. if ((sm>15)&(in==0)){//
  582. obnul_sms();
  583. obnul_sms1();
  584. obnul_sms2();
  585. obnul_str1();
  586. a=2;s_s=0;v=0;in2=0;
  587. udal_sms();
  588. sss=3;
  589. } }
  590. void preobr_sms(void){ //обработка смс
  591. char m,res;
  592. char l,p;
  593. q=strlen(str1);//длина строки смс
  594. if(q>=54){
  595. in=54;
  596. a:
  597.  
  598. if(str1[in]==0x30)sms[s_s]=0x00;
  599. if(str1[in]==0x31)sms[s_s]=0x01;
  600. if(str1[in]==0x32)sms[s_s]=0x02;
  601. if(str1[in]==0x33)sms[s_s]=0x03;
  602. if(str1[in]==0x34)sms[s_s]=0x04;
  603. if(str1[in]==0x35)sms[s_s]=0x05;
  604. if(str1[in]==0x36)sms[s_s]=0x06;
  605. if(str1[in]==0x37)sms[s_s]=0x07;
  606. if(str1[in]==0x38)sms[s_s]=0x08;
  607. if(str1[in]==0x39)sms[s_s]=0x09;
  608. if(str1[in]==0x41)sms[s_s]=0x0A;
  609. if(str1[in]==0x42)sms[s_s]=0x0B;
  610. if(str1[in]==0x43)sms[s_s]=0x0C;
  611. if(str1[in]==0x44)sms[s_s]=0x0D;
  612. if(str1[in]==0x45)sms[s_s]=0x0E;
  613. if(str1[in]==0x46)sms[s_s]=0x0F;
  614.  
  615. if(in==q)goto b;
  616. s_s++;
  617. in++;
  618. if(in<=q)goto a;
  619. b: s_s=0,v=0; } //перевод с кои на 16
  620. {m=strlen(sms);
  621. xx:
  622. l=0,p=0;
  623. l=sms[s_s]<<4;
  624. s_s++;
  625. p=sms[s_s];
  626. res=l|p;
  627. sms1[v]=res;
  628. s_s++;
  629. v++; //упаковка смс до байта
  630. if(s_s>m)goto yy;
  631. if(s_s<=m)goto xx;
  632. yy:
  633. obnulenie_sms1();}; //очистка остатка строки
  634. {
  635. sms_kod(); //РАСКОДИРОВКА смс
  636. lcd_clear();
  637. sprintf(text,"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",sms2[0],sms2[1],sms2[2],sms2[3],sms2[4],sms2[5],
  638. sms2[6],sms2[7],sms2[8],sms2[9],sms2[10],sms2[11],sms2[12],sms2[13],sms2[14]);
  639. sprintf(text1,"poluchena SMS %i",N );
  640. LCD1();
  641. delay_ms(100);
  642. in=0; sss=2; //переход на обработку и удаление всех строк
  643. }
  644. }
  645. void klav(void)
  646. {
  647. char iin=0;
  648. lcd_clear();
  649. _lcd_ready();
  650. _lcd_write_data(0x0E);
  651. _lcd_write_data(0x02);
  652. ss: lcd_gotoxy(0,0);
  653. sprintf(text1,"1 2 3 4 5 6 7 8");
  654. lcd_puts(text1);
  655. lcd_gotoxy(0,1);
  656. sprintf(text,"%i %i %i %i %i %i %i %i",PINB.0,PINB.1,PINB.2,PINB.3,PINB.4,PINB.5,PINB.6,PINB.7);
  657. lcd_puts(text);
  658. _lcd_ready();
  659. _lcd_write_data(0x02);
  660. lcd_gotoxy(iin,0);
  661. while(PINA.3!=0){
  662. if(PINA.0==0){
  663. iin++;
  664. if(iin>=16)iin=0;
  665. lcd_gotoxy(iin,0);
  666. delay_ms(150);
  667. }
  668. if(PINA.1==0){
  669. iin--;
  670. lcd_gotoxy(iin,0);
  671. delay_ms(150);}
  672. if(PINA.2==0){delay_ms(350);
  673. switch(iin){
  674. case 0:if(PORTB.0==0)PORTB.0=1;
  675. else PORTB.0=0;break;
  676. case 2:if(PORTB.1==0)PORTB.1=1;
  677. else PORTB.1=0;break;
  678. case 4:if(PORTB.2==0)PORTB.2=1;
  679. else PORTB.2=0;break;
  680. case 6:if(PORTB.3==0)PORTB.3=1;
  681. else PORTB.3=0;break;
  682. case 8:if(PORTB.4==0)PORTB.4=1;
  683. else PORTB.4=0;break;
  684. case 10:if(PORTB.5==0)PORTB.5=1;
  685. else PORTB.5=0;break;
  686. case 12:if(PORTB.6==0)PORTB.6=1;
  687. else PORTB.6=0;break;
  688. case 14:if(PORTB.7==0)PORTB.7=1;
  689. else PORTB.7=0;break;
  690. }
  691. goto ss;}
  692. }}
  693.  
  694. void main(void)
  695. {
  696. PORTA=0xFF;
  697. DDRA=0x00;
  698. PORTB=0x00;
  699. DDRB=0xFF;
  700. PORTC=0x08;
  701. DDRC=0x08;
  702. PORTD=0x03;
  703. DDRD=0xFC;
  704. TCCR0=0x0D;
  705. TCNT0=0x1F;
  706. OCR0=0x00;
  707. ASSR=0x00;
  708. TCCR2=0x00;
  709. TCNT2=0x00;
  710. OCR2=0x00;
  711. MCUCR=0x00;
  712. MCUCSR=0x00;
  713. TIMSK=0x01;
  714. UCSRA=0x00;
  715. UCSRB=0x98;
  716. UCSRC=0x86;
  717. UBRRH=0x00;
  718. UBRRL=0x47;
  719. ACSR=0x80;
  720. SFIOR=0x00;
  721. lcd_init(16);
  722. #asm("sei")
  723. while (1) {
  724. // if(ini==0)uni(); //инициализация телефона отключена для протеуса,чтобы не отвечать вместо телефона
  725. if((N>0)&(sss==3))sm=0,w=0,i=30,ini=1,otpravka();
  726. if(PINA.3==0)delay_ms(200),klav(),delay_ms(200);
  727. while(rx_counter){//2
  728. a=2; //ждем прихода смс
  729. TIMSK=0x01;
  730. ms=0;
  731. s=getchar();
  732. str1[in]=s;
  733. if(str1[in]>0)in++;
  734. ms=0 ;
  735. if((s==10|s==13)&(in<54)){ in=0,ms=0; } //обнуляем короткие строки
  736. obnulenie(); //обнуление остатка строки
  737. ms=0;}
  738. vvod(); //ввод строки,сравнение номера
  739. if((sm==300)&(TIMSK==0x01))ms++;
  740. in2=strlen(str1);
  741. if(ms>6)ms=0;
  742. if(sss==2)udl_obr();
  743. if((N>0)&(sss==3))sm=0,w=0,i=30,ini=1,TIMSK=0x00,otpravka();
  744. if ((a==0)&(fl==1))fl=2,TIMSK=0x00,sss=1; //2-ЧТОБЫ СМС НЕ ДУБЛИРОВАЛОСЬ
  745. if ((N>0)&(in2>=54)&(ms>2))TIMSK=0x00,sss=1; //переход на обработку смс,а=0 при совпад номера
  746. if (tem==50|tem==600)tem+=1,i=33,init(),delay_us(15);//Считывание смс с ТА
  747. if ((ms>4)&(in2>=54)){in=0,obnulenie(),udal_sms();} //стираем смс если чужой номер
  748. LCD();
  749. if(sss==1)preobr_sms();
  750. } }

Модель устройства для Proteus