How high can you count? Challenge:

Your task is to write as many programs / functions / snippets as you can, where each one outputs / prints / returns an integer. The first program must output the integer 1, the second one 2 and so on.

You can not reuse any characters between the programs. So, if the first program is: x==x, then you may not use the characters x and = again in any of the other programs. Note: It's allowed to use the same character many times in one program.

Scoring:

The winner will be the submission that counts the highest. In case there's a tie, the winner will be the submission that used the fewest number of bytes in total.

Rules:


You can only use a single language for all integers
Snippets are allowed!
To keep it fair, all characters must be encoded using a single byte in the language you choose.
The output must be in decimal. You may not output it with scientific notation or some other alternative format. Outputting floats is OK, as long as all digits that are shown behind the decimal point are 0. So, 4.000 is accepted. Inaccuracies due to FPA is accepted, as long as it's not shown in the output.
ans =, leading and trailing spaces and newlines etc. are allowed.
You may disregard STDERR, as long as the correct output is returned to STDOUT
You may choose to output the integer to STDERR, but only if STDOUT is empty.
Symbol independent languages (such as Lenguage) are disallowed
Letters are case sensitive a != A.
The programs must be independent
Whitespace can't be reused
You must use ASCII-digits in the output


Explanations are encouraged!
JavaScript (ES7), score 17, 176 bytes

They said it couldn't be done, so I did it :D (thanks to a lot of help from @FullDecent)

""**""
~(~/~//~/~/)/~/~/
3
4
!NaN- -!NaN- -!NaN- -!NaN- -!NaN
6
7
8
9
++[[]][+[]]+[+[]]
11
'lengthlength'.length
222&gt;&gt;2&gt;&gt;2
`${``^``}xE`^``
0XF
C=CSS==CSS;C&lt;&lt;C&lt;&lt;C&lt;&lt;C&lt;&lt;C
555555555555555555555%55


Unused characters:

#&amp;,:?@ABDGHIJKLMOPQRTUVWYZ\_bcdfijkmopqrsuvwyz|


I don't think 18 is possible, but I said the same thing about 17...

Explanation

JavaScript is a very weakly typed language; if you try to perform a mathematical operation on a non-number value, JS will try its hardest to convert it to a number first. This allows for a lot of interesting solutions. I've tried to avoid using the digits as much as possible so they can be used later on.


** is the exponentiation operator in ES7. The empty string when coerced to a number becomes 0, so this calculates 0 ** 0, which is 1 according to JavaScript.
A little ridiculous, but it works. /~/ is a regex literal, and ~/~/ returns -1, so this is ~(-1 / -1) / -1 = ~(1) / -1 = -2 / -1 = 2. (credits to @GOTO0 for the idea) 
Simply 3.
Now simply 4.
NaN is falsy, so !NaN is true, which is equivalent to 1. The expression thus becomes 1 - -1 - -1 - -1 - -1 = 1 + 1 + 1 + 1 + 1 = 5.
Simply 6.
Simply 7.
Simply 8.
Simply 9.
This uses a little JSF*** magic. +[] is 0, so [[]][+[]] returns the first element of [[]] (that is, []), and ++ increments this to 1. Then +[+[]] adds the array [0], which is coerced to a string and makes "10".
Simply 11. I originally had used 11&amp;1111 for 3 and 33/3 for 11 until I realized yet again just how dumb I am...
This strategy would work on any number: create a string of length 12 and use .length.
I just messed around with 2s and &gt;s for a while to get this one. I got lucky again: 222 &gt;&gt; 2 is 55, and 55 &gt;&gt; 2 is 13.
This one is rather tricky. The basic idea is to create 14 in hex (0xE), but we need the digit 0 elsewhere. So instead we prepend the result of &#96;&#96;^&#96;&#96; to the string xE; the empty string coerced to a number is 0, so this returns 0 ^ 0 = 0. Then the result is XORed with the empty string, which converts both values to numbers; "0xE" ^ "" is 14.
This is now pretty easy: 0XF is a hexadecimal literal with a value of 15.
The trickiest of all? First we set the variable C to CSS == CSS (that is, true). Then we take the result and perform &lt;&lt; C four times, which basically multiplies 1 by 2 ** 4.
JavaScript starts to lose integer precision at 253, which allows 555...555%55 to return a number that's not 0 or 5. I happened to get very lucky while playing around here.


Strategies that would work on many numbers:


-!NaN would work on any number (currently 5), though it gets large very fast.
~/~/ would work on any number (currently 2), though it gets very large very fast.
+[] would work on any number (currently 10), though it's by far easiest on 10 or 11.
.length would work on any number.
&#96;${-&#96;&#96;}xE&#96;-&#96;&#96; would work on pretty much any number if you do it right.
C&lt;&lt;C would work on any power of two (currently 16), or any int at all if you included |.