main es una función como cualquier otra.
1) En C, se debe especificar qué tipo de resultado devolverá la función. Cuando no devuelve un resultado es VOID.
2) En C, también se debe especificar qué parámetros recibirá la función. Si no recibe parámetros se indica con VOID.
Entonces:
void main (void)
{
}
Significa que main no recibirá parámetros y que no devolverá ningún resultado.
NO devuelve resultados porque en una aplicación de estas características no hay a 'quién' devolverle el resultado.
En las PCs, uno puede poner el tipo de main porque el resultado puede ser capturado a su vez por otro programa o por el sistema operativo. En los PICs y en muchos microcontroladores sencillamente ese concepto no existe porque no es necesario.
El código debe mantenerse en un bucle infinito de ejecución, de ahí en que es normal que veas un
while (1) {
}
o bien
while (TRUE) {
}
Espero te haya servido la explicación.
Saludos