In short, you can't do what you want. If someone is using your tool from the command line, they simply must use your command according to the rules of the shell.
The behavior you are seeing is because the shell will translate the argument before your program ever sees it. There is absolutely no way for your command to affect what happens before it is called.
It is because of this -- because the shell processes arguments before running your script -- that quotes were created in the first place. Quoting (both single quotes, double quotes, and backslash quotes) exists to give users control over how arguments are treated before calling some function.
So, if you want a string like
abc$1xyz to be sent to your program without variable expansion you have two choices: