You’ve got two problems. Firstly, Scott Wales is correct about your hex2bin() function – you have a 'x' where you mean '4'.
Secondly, you are not correctly counting a cache miss when you hit an invalid cache slot. You can simply handle “invalid” with exactly the same code path you use for a miss:
if ((newCache[totalset].valid == 1) && (strcmp(newCache[totalset].tag, tbits) == 0))
{
/* Hit */
if (readwrite == 'W')
{
cacheHit++;
write++;
}
if (readwrite == 'R')
cacheHit++;
}
else
{
/* Miss (cache entry invalid, or wrong tag) */
if (readwrite == 'R')
{
cacheMiss++;
read++;
}
if (readwrite == 'W')
{
cacheMiss++;
read++;
write++;
}
newCache[totalset].valid = 1;
strcpy(newCache[totalset].tag, tbits);
}